masterlong 发表于 2019-9-27 17:15:31

终于,终于找到了,opendcl控件函数的简便写法

本帖最后由 masterlong 于 2019-9-27 17:23 编辑

opendcl界面漂亮
然而哪怕已经做了很多的odcl程序
但其实我是非常不喜欢写odcl程序代码的
原因就是odcl的控件的操作代码实在是太啰嗦了
特别是同性质控件的集体操作
比起dcl简直麻烦死了
直到今天才无意中发现
原来是有简化方法的

看下方的截图






首先要为控件设置一个变量名
然后就可以用这个变量名来代替控件的标识符
比如
(dcl-Control-SetCaption testsee/form1/块名00 "ABBB")
添加变量名以后代码就成了
(dcl-Control-SetCaption tt_blknmshow00 "ABBB")

看起来区别不大是吧
然而这样一来
代码里就可以使用mapcar、foreach这些函数了
(setq cblist_bnmshow '(tt_blknmshow00 tt_blknmshow01 tt_blknmshow02 tt_blknmshow03 tt_blknmshow04 tt_blknmshow05))
(setq cblist_sld '(sld_blk00 sld_blk01 sld_blk02 sld_blk03 sld_blk04 sld_blk05))
(setq bnmshow '("块名00" "块名01" "块名02" "块名03" "块名04" "块名05"))
块名列表批量显示在文本控件和sld控件的代码如下
(mapcar ''((a b) (dcl-Control-SetCaption (eval a) b)) cblist_bnmshow bnmshow)
(mapcar ''((a b) (dcl-BlockView-DisplayBlock (eval a) b 0 0.8)) cblist_sld bnmshow)

注意eval的应用
最开始我写成
(mapcar 'dcl-Control-SetCaptioncblist_bnmshow bnmshow)
然而odcl没有任何显示
最挫的是代码执行返回了nil
并没有任何出错提示
一度我非常失望以为odcl就是不支持这种写法
不死心的用apply、foreach等换着试
毫无结果
偶尔把dcl-Control-SetCaption换成了dcl-BlockView-DisplayBlock
竟然出现了错误提示“无效的数据类型或数据溢出: sld_blk00”
一瞬间我想到了eval
一试果然成功了

困扰多年的问题得到解决
只希望不是人尽皆知的做法






masterlong 发表于 2019-9-28 21:02:35

1.
(setq alist (list testsee5/form1/块浏览00 testsee5/form1/块浏览01))
command : !alist -->(<图元名: 30df1c40> <图元名: 30df1d60>)
(mapcar ''((a b) (dcl-BlockView-DisplayBlock a b)) alist '("000" "222"))

2.
(setq blist '(testsee5/form1/块浏览00 testsee5/form1/块浏览01))
command : !blist -->(testsee5/form1/块浏览00 testsee5/form1/块浏览01)
(mapcar ''((a b) (dcl-BlockView-DisplayBlock (eval a) b)) blist '("000" "222"))

以上两种都是可行的写法
第一种方法显然更优
走出了误区
感谢楼上所有参与讨论的朋友

masterlong 发表于 2019-9-28 11:57:13

楼上的哥哥说的没错
控件本身就是变量
用一个名字替换另一个不是必须的
然而eval是不可少的

(dcl-Control-SetCaption testsee5/form1/块名00 "222")
上面代码是opendcl的标准写法

(mapcar ''((a) (dcl-Control-SetCaption         a"222")) '(testsee5/form1/块名00))
(mapcar ''((a) (dcl-Control-SetCaption (eval a) "222")) '(testsee5/form1/块名00))
以上2种写法
偏偏就只有第2种写法可以达到目的
或许还有其它的方法
可惜功力不足
这么多年了也才刚刚摸索出一种

pengfei2010 发表于 2019-9-28 07:06:47

想法不错,但是存在很多问题,第一、大量使用eval效率很低,第二、大量使用变量,容易造成变量泄露,第三、你这是多此一举啊,控件本身就是一个变量(基本都是图元变量),你只是换个名字而已,为何自找麻烦

brainstorm 发表于 2019-9-27 19:45:43

好帖 学习了 感谢分享

e2002 发表于 2019-9-27 20:46:50

很好的办法...

eval 需要在运行中动态求值,一般需要编译为vlx的时候,能不用尽量就不用吧。

言戲無軍 发表于 2019-9-27 22:19:58

抽屉式菜单就用了你这样的办法

masterlong 发表于 2019-9-28 12:14:09

我的一个图块浏览程序
控件数70左右
其中文本控件30个块浏览控件30
代码写了接近30K
改用新的方法写
估计只需要1/10的长度

jun353835273 发表于 2019-9-28 13:32:27

变量名变短了,可以随便取名而已

xinrstar 发表于 2019-9-28 14:40:57

(mapcar 'dcl-Control-SetCaption (list testsee5/form1/块名00 testsee5/form1/块名01) '("000" "222"))
页: [1] 2
查看完整版本: 终于,终于找到了,opendcl控件函数的简便写法