本帖最后由 言戲無軍 于 2022-3-13 10:35 编辑
dcl对话框界面可以用飞诗dcl编辑器生成,dcl对话框的赋值与取值对新手来说入门比较难,论坛上有很多通用的函数,一直没有满意的,故写下此2函数。
抛转引玉一起交流,水平有限轻拍。附带了dcl完整测试程序文件。新增dcl创建函数 dcl_create
- dcl_setTile 赋值
- dcl_getTile 取值
- dcl_create
- ;;说明:对dcl对话框进行批量赋值及初始化
- ;;参数:lst: 控件keys 和 值组成的表
- ;;返回:
- (defun dcl_setTile(lst / a)
- (mapcar
- '(lambda(x)
- (cond
- ((= (type (cadr x)) 'list)
- (start_list (car x) );;(caadr x)
- (mapcar 'add_list (val2str(cadadr x)))
- (end_list)
- (setq a (caadr x))
- (if (= (type a) 'LIST)
- (set_tile (car x)
- (vl-string-right-trim " " (apply 'strcat (mapcar '(lambda(y)(strcat y " "))(val2str a))))
- )
- (set_tile (car x) (val2str(caadr x)))
- )
- )
- (t (set_tile (car x) (val2str (cadr x))) )
- )
- )
- lst
- )
- )
- ;;说明:获取对话框控件值 需要注意的是没有进行数据合法性检查,自行增加
- ;;参数:lst: 控件keys和值组成的表 即变量保存列表*vars&vals*
- ;;返回:获取的控件变量
- ;;说明:
- (defun dcl_getTile(lst / lst0 key v)
- ;(setq lst0 lst)
- (mapcar
- '(lambda(x)
- (setq key (car x))
- (setq v (get_tile key))
- (cond
- ((= (type (cadr x)) 'list)
- (setq a (caadr x))
- (if (/= (type a) 'LIST)
- (setq v (atoi v))
- (setq v (read (strcat "(" v ")")))
- )
- (list key (list v (cadadr x)))
- )
- (t (list key (str2val v (cadr x))) ) ;;(str2val "123.5" 10.1)
- )
- )
- lst
- )
- )
传入的lst要求是2维表- (setq *vars&vals* ;;;全局变量用于初始化及保存dcl中所有的值 (setq *vars&vals* nil)
- '(
- ("op1" 1);radio1选则1选中 0不选 1选中
- ("op2" 0);radio1选则2未选中 0不选 1选中
- ("edit1" 123.5);;editbox实数
- ("edit2" "asbda");;editbox字符串
- ("tog1" 0);;toggle复选框 0不选 1选中。
- ("pop1" (2 (0.2 0.5 1.0 2.0 5.0)) ) ;;popuplist下拉框列表 0 代表默认为列表中第一个值1代表第二个...
- ;(0.2 0.5 1.0 2.0 5.0)代表下拉列表框中显示的值
- ("list1" ((1) ("物品1" "物品2" "物品3" "物品4")) ) ;;listbox下拉框列表 1 代表默认为列表中第二个值2代表第三个...
- ;;("物品1" "物品2" "物品3" "物品4")list1中显示的值 ;如果列表支持多选 1换为 表 (1) (1 2 3)等
- )
- )
- (defun dcl_Create ( / dcl des dcl_id)
- (setq dcl (vl-filename-mktemp nil nil ".dcl"))
- (setq des (open dcl "w"))
- (write-line (apply 'strcat dclLst )des)
- (close des)
- (setq dcl_id (load_dialog dcl))
- (vl-file-delete dcl)
- (setq dlg (car (vl-remove-if-not '(lambda (x) (wcmatch x "*dialog*")) dcllst)))
- (setq dlg (car (LM:str->lst dlg ":" )))
-
- (if (null (new_dialog dlg dcl_id))
- (exit)
- )
- dcl_id
-
- )
顺便附上对话框dcl文件转lisp文件程序,也就是程序中用到的dcllist 就不用单独打包dcl文件了。
|