对话框如何聚焦在第一个框里面
本帖最后由 世人皆醉 于 2022-7-24 22:47 编辑圆管一键展开:dialog{ //定义名字为圆管一键展开的对话框
label= "圆管一键展开";//显示在对话框顶部的标签
:row{ //引用行
:edit_box{ //引用编辑框1
label="圆的直径为(mm):"; //编辑框1的标签
edit_width=8; //编辑框1的宽度
key="d1";//编辑框1的关键字
mnemonic="d1";//编辑框1的热键
}}//编辑框1引用结束
:row{
:edit_box{ //引用编辑框2
label="圆的长度为(mm):"; //编辑框2的标签&之后的字符是热键
width=8; //编辑框2的宽度
key="d2";//编辑框2的关键字
}//编辑框2引用结束
}//行引用结束
ok_cancel;// 引用ok_cancel组合控件
}
数据如上图所示,如何能使首次填写的位置由“确定”转到“圆的直径为”的对话框上
另外一个数据填写完成后,如何用enter键切换到下一个数据该如何设置,而不是tab键,这种效果能达到吗
(defun c:c1(/ pt0 d3 p1 p2 p3 p4 p5 d4 p6 p7 d1s d2s)
(vl-load-com)
(setq cmd (getvar "cmdecho"))
(setq osm (getvar "osmode"))
(command "._undo" "_begin")
(setvar "cmdecho"0)
(setvar "osmode" 0)
(setq Keys '("d1" "d2"))
(setq ad1 548.5 ad2 3000)
;加载DCL对话框
(setq DcLwjm (make_YGZK_dcl)) ;生成DCL对话框
(setq dcl_id (load_dialog DcLwjm)) ;加载DCL对话框
;激活DCL画面
(if (not (new_dialog "圆管一键展开" dcl_id))
(exit)
)
;控件赋初值
(mapcar '(lambda(Key Val) (set_tile Key Val))
Keys
(list (rtos ad1 2 2) (rtos ad2 2 2))
)
;设置d1为焦点
(mode_tile "d1" 2)
;控件相关操作
(foreach Key Keys
(action_tile Key "(set (read (strcat \"a\" $key)) (atof (get_tile $key)))
(cond ((= $key \"d1\") (mode_tile \"d2\" 2))
((= $key \"d2\") (mode_tile \"accept\" 2))
)
"
)
)
(action_tile "accept" "(done_dialog 1)")
;将控制权交给DCL
(setq do_what (start_dialog))
;终止DCL: (done_dialog 0) (done_dialog 1)
(cond ((= do_what 0)
(princ "\n单击了取消按钮")
)
((= do_what 1)
(princ "\n单击了确定按钮")
;显示两编辑框中取得数值
(princ "\n ad1=")(princ ad1)
(princ " ad2=")(princ ad2)
; 这里加入进行相应的处理部分
)
)
(unload_dialog dcl_id)
(vl-file-delete DCLwjm)
(command "_undo" "e")
(setvar "osmode" osm)
(setvar "cmdecho" cmd)
(princ)
)
; ;;============= make_YGZK_dcl========================================================================================================
; ;;对话框生成并保存至临时文件
(defun make_YGZK_dcl (/ lst_str str file f)
(setq lst_str
(list
"圆管一键展开:dialog { //定义名字为圆管一键展开的对话框"
" label= \"圆管一键展开\";//显示在对话框顶部的标签"
" :row{ //引用行"
" :edit_box{ //引用编辑框1"
" label=\"圆的直径为(mm):\"; //编辑框1的标签"
" edit_width=8; //编辑框1的宽度"
" key= \"d1\";//编辑框1的关键字"
" mnemonic = \"d1\";//编辑框1的热键"
" }} //编辑框1引用结束"
" :row{ "
" :edit_box{ //引用编辑框2"
" label = \"圆的长度为(mm):\"; //编辑框2的标签&之后的字符是热键"
" width=8; //编辑框2的宽度"
" key = \"d2\";//编辑框2的关键字"
" }//编辑框2引用结束"
" }//行引用结束"
" ok_cancel;// 引用ok_cancel组合控件"
"}"
)
)
(setq file (vl-filename-mktemp "DclTemp-YGZK.dcl"))
(setq fff (open file "w"))
(foreach str lst_str
(write-line str fff)
)
(close fff)
file
)
左边为现有调出的对话框
右边为我想要达到的对话框
默认聚焦2种方法
控件中is_default = true;
或者
lsp中(start_dialog)之前添加
(mode_tile k 2)(mode_tile k 3)
方法2优先级高于1
编辑框回车切换焦点
在lsp中定义控件动作
(action_tile k1 "(if ($reason = 1)(progn (mode_tile k2 2)(mode_tile k2 3)))")
注意k2中的"之前要加斜杠\
masterlong 发表于 2022-7-23 16:49
默认聚焦2种方法
控件中is_default = true;
或者
(defun c:c1(/ pt0 d3 p1 p2 p3 p4 p5 d4 p6 p7 d1s d2s)
(command "._undo" "_begin")
(setvar "cmdecho"0)
(setvar "osmode" 0)
(vl-load-com)
(defun getdata();定义getdata 函数,其功能是获取三个编辑框的最终数据
(setq ad1(atof(get_tile "d1")));获取编辑框的值,转换为实数后赋给变量
(setq d2(atof(get_tile "d2")));获取编辑框的值,转换为实数后赋给变量
)
(setq sdt 0);设置状态参数sdt为0
(setq id(load_dialog "D:\\插件\\DCL\\C1"));装入DCL文件,c1是对话框文件名
(if (< id 0)(exit)) ;如果装入失败则退出
(mode_tile k 2)(mode_tile k 3)
(action_tile k1 "(if ($reason = 1)(progn (mode_tile k2 2)(mode_tile k2 3)))")
(if(not ad1)
(setq ad1 548.5 d2 3000))
(if (not (new_dialog "圆管一键展开" id)) (exit));显示名字为yuan的对话框,如果失败则退出
(set_tile "d1" (rtos ad1 2 2));设置编辑框d1初值
(set_tile "d2" (rtos d2 2 2));设置编辑框d2初值
(action_tile "accept" "(getdata) (done_dialog 1)");定义OK按钮的活动是执行getdata函数,然后以1为状态值关闭对话框
(action_tile "cancel" "(done_dialog -1)");定义Cancel按钮时的活动是以-1为状态值关闭对话框
(setq sdt(start_dialog));显示对话框,将得到关闭对话框时的状态值
(unload_dialog id);卸载对话框文件
(if (> sdt 0);判断关闭对话框时的状态值,即单击哪个按钮关闭的对话框
(progn
大佬这是我的LISP函数,但是改了老是运行错误,能帮我看一下吗 yshf 发表于 2022-7-24 16:02
(defun c:c1(/ pt0 d3 p1 p2 p3 p4 p5 d4 p6 p7 d1s d2s)
(vl-load-com)
(setq cmd (getvar "cmdec ...
大佬,D2的值固定不变了,我对话框改掉但是实际并没有变,是怎么回事呢,对话框效果是可以的
怎么没变,请看录像。 yshf 发表于 2022-7-24 21:36
怎么没变,请看录像。
大佬,可以了,但是我运行是发现一个BUG,就是我输入第一行值之后跳到第二行的时候,如果这时候我发现第一行输错了,用鼠标点击,或者shift+tab键是返回不到第一行的,只能enter一个轮回才能再次回到第一行,能把这个bug修复吗
在第2编辑框内敲击回车,再在第一编辑框单击鼠标即可。
或者将这行:((= $key \"d2\") (mode_tile \"accept\" 2))注释了,试试。 yshf 发表于 2022-7-24 23:07
在第2编辑框内敲击回车,再在第一编辑框单击鼠标即可。
或者将这行:((= $key \"d2\") (mode_tile \"accep ...
可以了,谢谢大佬指点
页:
[1]