本帖最后由 言戲無軍 于 2022-3-13 10:35 编辑
dcl对话框界面可以用飞诗dcl编辑器生成,dcl对话框的赋值与取值对新手来说入门比较难,论坛上有很多通用的函数,一直没有满意的,故写下此2函数。
抛转引玉一起交流,水平有限轻拍。附带了dcl完整测试程序文件。新增dcl创建函数 dcl_create

传入的lst要求是2维表

顺便附上对话框dcl文件转lisp文件程序,也就是程序中用到的dcllist 就不用单独打包dcl文件了。
网友答: 本帖最后由 hhh454 于 2022-3-12 20:18 编辑
;; String to List - Lee Mac
;; Separates a string using a given delimiter
;; str - [str] String to process
;; del - [str] Delimiter by which to separate the string
;; Returns: [lst] List of strings
(defun LM:str->lst ( str del / len lst pos )
(setq len (1+ (strlen del)))
(while (setq pos (vl-string-search del str))
(setq lst (cons (substr str 1 pos) lst)
str (substr str (+ pos len))
)
)
(reverse (cons str lst))
)
网友答: (defun LM:str->lst (str del / n lst n1)
(setq n (1+ (strlen del)))
(while (setq n1 (vl-string-search del str))
(setq lst (cons (substr str 1 n1) lst)
str (substr str (+ n1 n))
)
)
(vl-remove "" (reverse (cons str lst)))
)网友答: 我按了tt号,出现对话框,修改了文本内容110,但是在tt函数中,取文本内容的值还是初始值。对话框用的不多所以不熟悉大神大大可以解答一下吗网友答: 函数不全,缺val2str
网友答: 在附件中,下载即可。网友答: LM:str->lst
缺少这个函数网友答: 这个思路比较好,借鉴了,多谢分享网友答: 非常实用,dcl的设置流程得到了大大简化,多谢楼主。网友答: 非常感谢楼主的分享
网友答:
这个思路很不错,多谢分享
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文件了。
网友答: 本帖最后由 hhh454 于 2022-3-12 20:18 编辑
;; String to List - Lee Mac
;; Separates a string using a given delimiter
;; str - [str] String to process
;; del - [str] Delimiter by which to separate the string
;; Returns: [lst] List of strings
(defun LM:str->lst ( str del / len lst pos )
(setq len (1+ (strlen del)))
(while (setq pos (vl-string-search del str))
(setq lst (cons (substr str 1 pos) lst)
str (substr str (+ pos len))
)
)
(reverse (cons str lst))
)
网友答: (defun LM:str->lst (str del / n lst n1)
(setq n (1+ (strlen del)))
(while (setq n1 (vl-string-search del str))
(setq lst (cons (substr str 1 n1) lst)
str (substr str (+ n1 n))
)
)
(vl-remove "" (reverse (cons str lst)))
)网友答: 我按了tt号,出现对话框,修改了文本内容110,但是在tt函数中,取文本内容的值还是初始值。对话框用的不多所以不熟悉大神大大可以解答一下吗网友答: 函数不全,缺val2str
网友答: 在附件中,下载即可。网友答: LM:str->lst
缺少这个函数网友答: 这个思路比较好,借鉴了,多谢分享网友答: 非常实用,dcl的设置流程得到了大大简化,多谢楼主。网友答: 非常感谢楼主的分享
网友答:
这个思路很不错,多谢分享