4041186888 发表于 2022-5-10 22:08:26

问几个关于DCL的几个问题~

本帖最后由 4041186888 于 2022-5-10 22:31 编辑

最近在学DCL,有几个地方没太理解。
新手一个,都是入门问题,请勿嘲笑,还请拜托各位高手多多赐教~

Q1.我看别人程序(load_dialog "Form5.dcl")都是用相对路径,得把DCL放哪个文件夹中才可以用相对路径读取啊?我一直都用绝对路径测试的时候挺麻烦得。

Q2.DCL不是有自带的value=1设置初始值么,为什么我看好多案例都是在lisp里设置初始值,还有些程序popup_list的list的值都是在LISP中设置的,这样做有什么好处么?为了方便修改?我尝试了下直接用get_tile读取设置完初始值的DCL,没成功... ...

Q3.输入框edit_box对非整数(非数字)等输入限制,不是有allow_accept和edit_limit参数么?查询了好多帖子,都是通过LISP中解决,这个可以在DCL中直接设置么?

Q4.下面这个别人的程序为例,函数不是应该从上至下运行么?在主函数tt中,先执行(Form_getvar)去判断Form_Text1,但是此时Form_Text1应该还没有被赋值啊?此时的Form_Text1值是哪来的啊?下一行(action_tile "accept""(Form_setvar)")才开始给Form_Text1赋值,程序没问题,但是这个逻辑实在没搞懂。
(defun c:tt()
   (setvar "cmdecho" 0)
   (setq dcl_id (load_dialog "d:\\Form5.dcl")) ;对话框加载
   (if (not (new_dialog "Form" dcl_id))
          (progn (alert "不能装入对话框") (exit))
   )
   (Form_getvar) ;从内存获取之前设定过的变量值
   (action_tile "accept""(Form_setvar)") ;执行操作,给变量赋值
   (action_tile "cancel""(done_dialog)") ;取消对话框
   (start_dialog) ;启动对话框
   (unload_dialog dcl_id) ;卸载对话框
   (setvar "cmdecho" 1)
   (princ)
)
(defun Form_setvar()
   (setq Form_Text1 (get_tile "Text1"))
   (done_dialog)
   (Form_printvar)
)
(defun Form_getvar()
   (if (/= Form_Text1 nil)
          (if (/= (type Form_Text1) 'STR)
               (set_tile "Text1" (rtos Form_Text1))
               (set_tile "Text1" Form_Text1)
          )
   )   
)
(defun Form_printvar()
   (if (/= Form_Text1 nil)
          (progn
               (princ "\n 设置变量=")
               (princ Form_Text1)
          )
   )
)


自贡黄明儒 发表于 2022-5-11 07:23:04

本帖最后由 自贡黄明儒 于 2022-5-11 07:28 编辑

http://bbs.xdcad.net/forum.php?mod=viewthread&tid=711212&extra=
这是我对于对话框的理解,你可以参考一下。
Form_setvar函数没有毛病,同setvar没有任何关系,你可以看Form_setvar中的内容。
(get_tile "Text1")是取得"Text1"的值,(done_dialog)是让对话框消失。取名叫Form_getvar更合适些。:lol
(getenv "ACAD")是支持文件路径,DCL放在其下均可

4041186888 发表于 2022-5-11 10:16:09

自贡黄明儒 发表于 2022-5-11 07:23
http://bbs.xdcad.net/forum.php?mod=viewthread&tid=711212&extra=
这是我对于对话框的理解,你可以参考 ...

我是先问先执行的Form_getvar函数,直接去判断变量Form_Text1,而此时Form_Text1的值是哪来的?
你的贴子我一直有看过,(setdata);㈠这步有点没理解,此时对话框不是应该已经有初始值了么,我理解应该直接读取对话框的值,为什么还要赋值?

自贡黄明儒 发表于 2022-5-11 10:56:28

4041186888 发表于 2022-5-11 10:16
我是先问先执行的Form_getvar函数,直接去判断变量Form_Text1,而此时Form_Text1的值是哪来的?
你的贴 ...

你击"accept"时,执行函数(Form_getvar),此时(setq Form_Text1 (get_tile "Text1"))就是取key为"Text1"的值,赋与Form_Text1。
另一个问题(setdata),如果对话框中已经有了初始值,可以不用(setdata)。但是有些时候,如列表框,图像,你能赋初始值吗?对话框循环时,一般要(setdata),如对话框中有一个“按钮”,叫“取得长度‘”,你取得长度后赋给"Text1",这就要改变"Text1"的初始值。

hhh454 发表于 2022-5-11 12:22:45

DCL界面部分应该很好理解,最重要的是和lisp关联,关联部分我理解的也不是很好,可以学习猫老师,飞诗dcl,信.dcl,学院派等等,论坛也有很多的例子,我是直接用的猫老师的vb窗体转DCL,他已经做好了关联,输出为一个lisp文件,也就不存在路径的问题,很方便

自贡黄明儒 发表于 2022-5-11 14:33:41

4041186888 发表于 2022-5-11 10:16
我是先问先执行的Form_getvar函数,直接去判断变量Form_Text1,而此时Form_Text1的值是哪来的?
你的贴 ...

一个简单的输入对话框
(defun HH:InputBox1 (promptstr str / DCLID FN FNAME RETURN# STR)
(setq fname (vl-filename-mktemp nil nil ".dcl"))
(setq fn (open fname "w"))
(write-line "InputBox1 : dialog {" fn)
(write-line " :text{key =\"key1\";}" fn)
(write-line " :edit_box{key =\"key2\";}" fn)
(write-line ":row{" fn)
(write-line
    " :button{label=\"取 消\";key =\"key3\";is_cancel=true;}"
    fn
)
(write-line
    " :button{label=\"确 定\";key =\"key4\";is_default=true;}"
    fn
)
(write-line " }" fn)
(write-line "}" fn)
(close fn)

(setq dclid (load_dialog fname))
(new_dialog "InputBox1" dclid)
;;下面四句,可以写成(setdata),这样看起来简洁
(set_tile "key1" promptstr)
(set_tile "key2" (VL-PRINc-TO-STRING str))
(mode_tile "key2" 2)
(action_tile
    "key4"
    "(setq str(get_tile \"key2\")) (done_dialog 1)"
)
(setq return# (start_dialog))
(unload_dialog dclid)
(vl-file-delete fname)
(if (equal return# 1) str nil)
)

4041186888 发表于 2022-5-11 20:20:12

hhh454 发表于 2022-5-11 12:22
DCL界面部分应该很好理解,最重要的是和lisp关联,关联部分我理解的也不是很好,可以学习猫老师,飞诗dcl, ...

非常感谢,猫老师那个我有看~因为我在学习阶段,现在就直接拿猫老师现成的就失去学习的意义了~

4041186888 发表于 2022-5-11 20:21:30

自贡黄明儒 发表于 2022-5-11 14:33
一个简单的输入对话框

非常感谢,我再好好吸收吸收,DCL联动比我想象得复杂一些

llsheng_73 发表于 2022-5-12 11:30:35

1 .用绝对路径可以保证能加载,用相对路径可能适用性更好,比如在别的电脑上运行,当然这种情况一般做法是让程序写dcl或者打包到VLX来解决路径问题
2 .对于运行过程中基本不会产生变化的情况,直接通过value设置会使后边的lsp处理更简单,但如果根据动态数据生成dcl,很多情况下无法预设value,根据需要在后续的lsp中设置是一样的
3 .edit_limit 是限制输入字符个数而不是数据类型,它只能接收字符串;allow_accept = true-false;是指定enter键的作用,很少看到有人用它
4 .执行顺序的问题,(new_dialog ...)到(start_dialog)中间那一段,它的顺序一般情况下可以比较随意,只要不会出现逻辑冲突,各个tile执行什么是根据action_tile给它指定的,简单的处理过程也可以直接写到控件的action里边,复杂一点需要单独写,太复杂的话一般给它定义子函数,通过action调用子函数;真正的执行是要看用户操作控件的过程,但每个控件所对应的处理过程,都是顺序执行的


以上仅个人理解

4041186888 发表于 2022-5-14 00:04:29

llsheng_73 发表于 2022-5-12 11:30
1 .用绝对路径可以保证能加载,用相对路径可能适用性更好,比如在别的电脑上运行,当然这种情况一般做法是 ...

非常感谢,对话框这个可能一时无法吸收,我再慢慢理解一下
页: [1]
查看完整版本: 问几个关于DCL的几个问题~