明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4238|回复: 16

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

[复制链接]
发表于 2019-9-27 17:15:31 | 显示全部楼层 |阅读模式
本帖最后由 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-SetCaption  cblist_bnmshow bnmshow)
然而odcl没有任何显示
最挫的是代码执行返回了nil
并没有任何出错提示
一度我非常失望以为odcl就是不支持这种写法
不死心的用apply、foreach等换着试
毫无结果
偶尔把dcl-Control-SetCaption换成了dcl-BlockView-DisplayBlock
竟然出现了错误提示“无效的数据类型或数据溢出: sld_blk00”
一瞬间我想到了eval
一试果然成功了

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






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 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"))

以上两种都是可行的写法
第一种方法显然更优
走出了误区
感谢楼上所有参与讨论的朋友
 楼主| 发表于 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种写法可以达到目的
或许还有其它的方法
可惜功力不足
这么多年了也才刚刚摸索出一种

发表于 2019-9-28 07:06:47 | 显示全部楼层
想法不错,但是存在很多问题,第一、大量使用eval效率很低,第二、大量使用变量,容易造成变量泄露,第三、你这是多此一举啊,控件本身就是一个变量(基本都是图元变量),你只是换个名字而已,为何自找麻烦
发表于 2019-9-27 19:45:43 来自手机 | 显示全部楼层
好帖 学习了 感谢分享
发表于 2019-9-27 20:46:50 | 显示全部楼层
很好的办法...

eval 需要在运行中动态求值,一般需要编译为vlx的时候,能不用尽量就不用吧。
发表于 2019-9-27 22:19:58 来自手机 | 显示全部楼层
抽屉式菜单就用了你这样的办法
 楼主| 发表于 2019-9-28 12:14:09 | 显示全部楼层
我的一个图块浏览程序
控件数70左右
其中文本控件30个块浏览控件30
代码写了接近30K
改用新的方法写
估计只需要1/10的长度
发表于 2019-9-28 13:32:27 | 显示全部楼层
变量名变短了,可以随便取名而已
发表于 2019-9-28 14:40:57 | 显示全部楼层
(mapcar 'dcl-Control-SetCaption (list testsee5/form1/块名00 testsee5/form1/块名01) '("000" "222"))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-18 01:43 , Processed in 0.173596 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表