找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2315|回复: 31

[研讨] opendcl 与vlisp 之间的变量作用域好乱啊,大家是怎么管理的?

[复制链接]
发表于 2016-3-8 14:24:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
opendcl主程序的变量我都是定义局部作用的,VLISP也是好管理 (defun C:(/ a..局部变量)
最近在搞OPENDCL ,因为opedn各个控件定义都是defun c:XX (/  这样的主程序定义的变量都会成为永久变量,好乱,程序运行时或结束都很难管理和清理
,有些变量值都找不到了,大家是如何对变量进行管理的,难到OPENDCL运行机制还有其它讲究???????/
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2016-3-8 18:13:09 | 显示全部楼层
除非特殊情况都应该用局部变量,ODCL 中的界面包括控件是由 ODCL 管理的,你不用干预,显示的时候用控件名访问、取值、控制
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-8 20:08:57 | 显示全部楼层
例如:主程序
(defun c:2(/ qyy)
(setq qyy "QWE")
(if (null (vl-symbol-value 'dcl_getversionex))  (loadRtime))
(if (not (setq project-path (dcl_Project_Load "pdpbz1.odcl" T)))
    (progn ;项目无法加载,报告或记录错误
       (alert (strcat "* * * 在CAD搜索目录中未找到[" pdpbz1.odcl "]文件!"))
       (exit) ;立即退出 (或采取纠正动作并重试)
    )   
    (dcl_FORM_SHOW PDPBZ1_Form1)     
)
)

;;关闭主窗口
(defun c:PDPBZ1_Form1_TextButton1_OnClicked (/)
(dcl_MessageBox qyy)   此时打信息对话柜就为nil          ******
(dcl_Form_Close pdpbz1_form1 1)
(dcl_Project_Unload "pdpbz1")
;右上角的 x 关闭按钮失效
(defun c:pdpbz1_form1_OnCancelClose (Reason /)
  (/= Reason T)
)
)
要是将主程序改成(defun c:2()
(setq qyy "QWE") 就成了永久变量
此时就能在显示对话框中显示QWE
我遇到了就是这类事,要是点击“确认”控制,在确认控件再调用其它lisp 程序qyy更转递不过去了...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2016-3-8 22:45:34 来自手机 | 显示全部楼层
你这是延续了DCL习惯,使用ODCL所有要做的都可以放到事件中,对话框关闭程序执行完毕
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-9 00:34:28 | 显示全部楼层
你的意思是说:
(defun c:2(/ qyy)
(setq qyy "QWE")
(if (null (vl-symbol-value 'dcl_getversionex))  (loadRtime))
(if (not (setq project-path (dcl_Project_Load "pdpbz1.odcl" T)))
    (progn ;项目无法加载,报告或记录错误
       (alert (strcat "* * * 在CAD搜索目录中未找到[" pdpbz1.odcl "]文件!"))
       (exit) ;立即退出 (或采取纠正动作并重试)
    )   
    (dcl_FORM_SHOW PDPBZ1_Form1)     
)

;;在中间放事件代码?????????
(defun cDPBZ1_Form1_TextButton1_OnClicked (/)
(dcl_MessageBox qyy)   此时打信息对话柜就为nil          ******
(dcl_Form_Close pdpbz1_form1 1)
(dcl_Project_Unload "pdpbz1")
;右上角的 x 关闭按钮失效
(defun c:pdpbz1_form1_OnCancelClose (Reason /)
  (/= Reason T)
)
)

) ; 程序完毕     将事件都要放到主程序代码中?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2016-3-9 07:59:14 来自手机 | 显示全部楼层
qyy准备什么用途
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-9 08:45:44 | 显示全部楼层
变量在子程序之间的数据传递...
上面的是试试的程序,如何改,qyy 要设成局部变量,在点击按钮是显示...
- 本文出自晓东CAD家园-论坛,原文地址:http://bbs.xdcad.net/thread-703567-1-1.html
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-9 16:08:05 | 显示全部楼层
大家帮着解释一下...

点评

贴完整,一点点的猜不出来  详情 回复 发表于 2016-3-9 18:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2016-3-9 18:16:25 来自手机 | 显示全部楼层
挚友01 发表于 2016-3-9 16:08
大家帮着解释一下...

贴完整,一点点的猜不出来
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-9 23:14:32 | 显示全部楼层
就这几句,就是想要了解opendcl变量的作用域...

点评

既是 Autolisp 方式,就遵守 Autolisp 规则,c:**(var1 var2 .. / ...) 这里的 var1 ... 等是输出值,你可以看看 反应器 函数部分,和反应器回调函数的参数一个意义  详情 回复 发表于 2016-3-9 23:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2016-3-9 23:49:17 | 显示全部楼层
挚友01 发表于 2016-3-9 23:14
就这几句,就是想要了解opendcl变量的作用域...

既是 Autolisp 方式,就遵守 Autolisp 规则,c:**(var1 var2 .. /  ...) 这里的 var1 ... 等是输出值,你可以看看 反应器 函数部分,和反应器回调函数的参数一个意义
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-10 09:19:14 | 显示全部楼层
在网上找的opendel帮助手册太简约了,没有介绍变量之间关系的,大家有没有了解变量作用域的,帮着示例一下,在主程序中设qyy为局变量,在某个控件中显示即可。。。

点评

用 ODCL 函数设置即可 (dcl-control-settext qyy)  详情 回复 发表于 2016-3-10 09:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2016-3-10 09:28:18 | 显示全部楼层
挚友01 发表于 2016-3-10 09:19
在网上找的opendel帮助手册太简约了,没有介绍变量之间关系的,大家有没有了解变量作用域的,帮着示例一下 ...

用 ODCL 函数设置即可
(dcl-control-settext <control> qyy)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-10 10:00:36 | 显示全部楼层
实际程序结构是这样的..
主程序 (defun c:1234(/ qyy...) qyy=局部变量
qyy=1
然后打开DCL对话框,在某个控制中对qyy进行赋值如
(defun c:DPBZ1_Form1_TextButton1_OnClicked (/)
qyy=qyy+1
退出对话框后返回主程序
接收控件返回的qyy
qyy=qyy+2
主程序结束...
我是没理解OPENDCL的运行机制,请高手给个以上的局部变量传递结构示意,多谢!

点评

如果 ODCL 那些事件函数中主程序外部,qyy 就不能定义为局部变量 (defun c:main (/ ...) (setq qyy "AAA") ) (defun c:**/Form1/.. (var1 .. /) (dcl-control-settext ... qyy) ) 如果你把 ODCL 的那些  详情 回复 发表于 2016-3-10 10:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2016-3-10 10:18:50 | 显示全部楼层
挚友01 发表于 2016-3-10 10:00
实际程序结构是这样的..
主程序 (defun c:1234(/ qyy...) qyy=局部变量
qyy=1

如果 ODCL 那些事件函数中主程序外部,qyy 就不能定义为局部变量
(defun c:main (/ ...)
   (setq qyy "AAA")
)
(defun c:**/Form1/.. (var1 .. /)
   (dcl-control-settext ... qyy)
)
如果你把 ODCL 的那些事件都放到 主函数内部,局部变量可以传递
(defun c:main (/ qyy c:**/form1/.. ...)  
   (setq qyy "AAA")
   (defun c:**/Form1/.. (var1 .. /)
      (dcl-control-settext ... qyy)
   )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-27 01:37 , Processed in 0.462401 second(s), 56 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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