明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 677|回复: 9

[提问] 问几个关于DCL的几个问题~

[复制链接]
发表于 2022-5-10 22:08:26 | 显示全部楼层 |阅读模式
本帖最后由 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赋值,程序没问题,但是这个逻辑实在没搞懂。
  1. (defun c:tt()
  2.      (setvar "cmdecho" 0)
  3.      (setq dcl_id (load_dialog "d:\\Form5.dcl")) ;对话框加载
  4.      (if (not (new_dialog "Form" dcl_id))
  5.           (progn (alert "不能装入对话框") (exit))
  6.      )
  7.      (Form_getvar) ;从内存获取之前设定过的变量值
  8.      (action_tile "accept"  "(Form_setvar)") ;执行操作,给变量赋值
  9.      (action_tile "cancel"  "(done_dialog)") ;取消对话框
  10.      (start_dialog) ;启动对话框
  11.      (unload_dialog dcl_id) ;卸载对话框
  12.      (setvar "cmdecho" 1)
  13.      (princ)
  14. )
  15. (defun Form_setvar()
  16.      (setq Form_Text1 (get_tile "Text1"))
  17.      (done_dialog)
  18.      (Form_printvar)
  19. )
  20. (defun Form_getvar()
  21.      (if (/= Form_Text1 nil)
  22.           (if (/= (type Form_Text1) 'STR)
  23.                (set_tile "Text1" (rtos Form_Text1))
  24.                (set_tile "Text1" Form_Text1)
  25.           )
  26.      )   
  27. )
  28. (defun Form_printvar()
  29.      (if (/= Form_Text1 nil)
  30.           (progn
  31.                (princ "\n 设置变量[Form_Text1]=")
  32.                (princ Form_Text1)
  33.           )
  34.      )
  35. )



发表于 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更合适些。
(getenv "ACAD")是支持文件路径,DCL放在其下均可
 楼主| 发表于 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"的初始值。
发表于 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的值是哪来的?
你的贴 ...

一个简单的输入对话框
  1. (defun HH:InputBox1 (promptstr str / DCLID FN FNAME RETURN# STR)
  2.   (setq fname (vl-filename-mktemp nil nil ".dcl"))
  3.   (setq fn (open fname "w"))
  4.   (write-line "InputBox1 : dialog {" fn)
  5.   (write-line " :text{key =\"key1\";}" fn)
  6.   (write-line " :edit_box{key =\"key2\";}" fn)
  7.   (write-line ":row{" fn)
  8.   (write-line
  9.     " :button{label=\"取 消\";key =\"key3\";is_cancel=true;}"
  10.     fn
  11.   )
  12.   (write-line
  13.     " :button{label=\"确 定\";key =\"key4\";is_default=true;}"
  14.     fn
  15.   )
  16.   (write-line " }" fn)
  17.   (write-line "}" fn)
  18.   (close fn)

  19.   (setq dclid (load_dialog fname))
  20.   (new_dialog "InputBox1" dclid)
  21.   ;;下面四句,可以写成(setdata),这样看起来简洁
  22.   (set_tile "key1" promptstr)
  23.   (set_tile "key2" (VL-PRINc-TO-STRING str))
  24.   (mode_tile "key2" 2)
  25.   (action_tile
  26.     "key4"
  27.     "(setq str(get_tile \"key2\")) (done_dialog 1)"
  28.   )
  29.   (setq return# (start_dialog))
  30.   (unload_dialog dclid)
  31.   (vl-file-delete fname)
  32.   (if (equal return# 1) str nil)
  33. )
 楼主| 发表于 2022-5-11 20:20:12 | 显示全部楼层
hhh454 发表于 2022-5-11 12:22
DCL界面部分应该很好理解,最重要的是和lisp关联,关联部分我理解的也不是很好,可以学习猫老师,飞诗dcl, ...

非常感谢,猫老师那个我有看~因为我在学习阶段,现在就直接拿猫老师现成的就失去学习的意义了~
 楼主| 发表于 2022-5-11 20:21:30 | 显示全部楼层
自贡黄明儒 发表于 2022-5-11 14:33
一个简单的输入对话框

非常感谢,我再好好吸收吸收,DCL联动比我想象得复杂一些
发表于 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调用子函数;真正的执行是要看用户操作控件的过程,但每个控件所对应的处理过程,都是顺序执行的


以上仅个人理解
 楼主| 发表于 2022-5-14 00:04:29 | 显示全部楼层
llsheng_73 发表于 2022-5-12 11:30
1 .用绝对路径可以保证能加载,用相对路径可能适用性更好,比如在别的电脑上运行,当然这种情况一般做法是 ...

非常感谢,对话框这个可能一时无法吸收,我再慢慢理解一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 15:36 , Processed in 0.180249 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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