对话框切换问题
本帖最后由 x_s_s_1 于 2022-3-25 08:59 编辑关于多个对话框之间的切换,尝试了很久,没有成功,麻烦各位网友相助,谢谢。
举例,一个dcl文件中,包含temp1和temp2两个对话框.1.执行命令aa,显示temp1对话框,其有两个按钮【下一个对话框】【取消】;
2.对话框temp1有两个按钮,当按【取消】时,关闭temp1对话框;
3.当按【下一个对话框】按钮时,关闭temp1对话框,显示temp2对话框;
4.temp2对话框有两个按钮【图中选择】【回前菜单】;
5.当按【图中选择】按钮时,关闭全部对话框,至图中选择一个图元,选择完毕后回到temp2对话框;
6.当按【回前菜单】按钮时关闭temp2对话框,显示temp1对话框;
发帖的时候没条件录屏,补个动图,表达的清楚一些
(defun c:aa ()
(setqdcllst '("temp1:dialog {"
" :button {"
" key = \"bt1\" ;"
" label = \"下一个对话框\" ;"
" }"
" :button {"
" is_cancel = true ;"
" key = \"bt2\" ;"
" label = \"取消\" ;"
" }"
"}"
"temp2:dialog {"
" :button {"
" key = \"bt3\" ;"
" label = \"图中选择\" ;"
" }"
" :button {"
" is_cancel = true ;"
" key = \"bt4\" ;"
" label = \"回前菜单\" ;"
" }"
"}"
)
)
(setqtmpf (xty-sys-makeFbylst
(vl-filename-mktemp nil nil ".dcl")
dcllst
)
)
(setq callback1 2)
(setq dcl_id (load_dialog tmpf))
(vl-file-delete tmpf)
(while (> callback1 1)
(new_dialog "temp1" dcl_id)
(action_tile "bt1" "(do_bt1)")
(action_tile "bt2" "(do_bt2)")
(setq callback1 (start_dialog))
(cond ((= 1 callback1) (showtemp2))
((= 2 callback1))
)
)
(unload_dialog dcl_id)
)
(defun do_bt1 () (done_dialog 1))
(defun do_bt2 () (done_dialog 2))
(defun showtemp2 ()
(setq callback2 2)
(while (> callback2 1)
(new_dialog "temp2" dcl_id)
(action_tile "bt3" "(do_bt3)")
(action_tile "bt4" "(do_bt4)")
(setq callback2 (start_dialog))
(cond ((= 1 callback2))
((= 2 callback2))
)
)
)
(defun xty-sys-makeFbylst (filename strlst / f n)
(setq f (open filename "w"))
(foreach n strlst (write-line n f))
(close f)
filename
)
无非就是一个逻辑关系嘛
DCL文件里有几个对话框有啥关系
都是可以单独调用的
所有的对话框启动和退出时
设置好对话框数据的load与save函数以后
循环调用、嵌套调用想怎么做怎么做
本帖最后由 wzg356 于 2022-3-25 00:23 编辑
分开写简单些
取消按钮(done_dialog 0)为默认/必须,可以不写
(defun c:aa ( / dcllst tmpf dcl_id callback1)
(setqdcllst '("temp1:dialog {"
" :button {"
" key = \"bt1\" ;"
" label = \"下一个对话框\" ;"
" }"
" :button {"
" is_cancel = true ;"
" key = \"bt2\" ;"
" label = \"取消\" ;"
" }"
"}"
)
)
(setqtmpf (xty-sys-makeFbylst
(vl-filename-mktemp nil nil ".dcl")
dcllst
)
)
(setq dcl_id (load_dialog tmpf))
(vl-file-delete tmpf)
(new_dialog "temp1" dcl_id)
(action_tile "bt1" "(done_dialog 1)")
(setq callback1 (start_dialog))
(unload_dialog dcl_id)
(if (= callback1 1) (bb))
)
(defun bb ( / dcllst tmpf dcl_id callback1)
(setqdcllst '("temp2:dialog {"
" :button {"
" key = \"bt3\" ;"
" label = \"图中选择\" ;"
" }"
" :button {"
" is_cancel = true ;"
" key = \"bt4\" ;"
" label = \"回前菜单\" ;"
" }"
"}"
)
)
(setqtmpf (xty-sys-makeFbylst
(vl-filename-mktemp nil nil ".dcl")
dcllst
)
)
(setq dcl_id (load_dialog tmpf))
(vl-file-delete tmpf)
(new_dialog "temp2" dcl_id)
(action_tile "bt3" "(done_dialog 1)")
(action_tile "bt4" "(done_dialog 2)")
(setq callback1 (start_dialog))
(unload_dialog dcl_id)
(cond
((= callback1 2) (c:aa))
((= callback1 1) (alert "图中选择"))
(t nil)
)
)
(defun xty-sys-makeFbylst (filename strlst / f n)
(setq f (open filename "w"))
(foreach n strlst (write-line n f))
(close f)
filename
) wzg356 发表于 2022-3-25 00:18
分开写简单些
取消按钮(done_dialog 0)为默认/必须,可以不写
(defun c:aa ( / dcllst tmpf dcl_id callb ...
谢谢,这么晚还回帖,分开的dcl我写出来了,您这个代码我看了一下,估计在点取了bt3后直接退出命令,不会回到temp2对话框。晚点我验证一下。再次感谢,辛苦了. wzg356 发表于 2022-3-25 00:18
分开写简单些
取消按钮(done_dialog 0)为默认/必须,可以不写
(defun c:aa ( / dcllst tmpf dcl_id callb ...
验证了一下您的代码,确实点了bt3以后不会回到temp2,下面是我自己写的两个dcl的代码
(defun c:aa()(bb))
(defun bb ()
(setq dcllst1 '("temp1:dialog {"
" :button {"
" key = \"bt1\" ;"
" label = \"下一个对话框\" ;"
" }"
" :button {"
" is_cancel = true ;"
" key = \"bt2\" ;"
" label = \"取消\" ;"
" }"
"}"
)
)
(setq tmpf (xty-sys-makeFbylst
(vl-filename-mktemp nil nil ".dcl")
dcllst1
)
)
(setq callback1 2)
(setq dcl_id1 (load_dialog tmpf))
(vl-file-delete tmpf)
(while (> callback1 1)
(new_dialog "temp1" dcl_id1)
(action_tile "bt1" "(do_bt1)")
(action_tile "bt2" "(do_bt2)")
(setq callback1 (start_dialog))
(cond ((= 1 callback1) (cc))
((= 2 callback1))
)
)
(unload_dialog dcl_id1)
)
(defun cc ()
(setq dcllst2 '("temp2:dialog {"
" :button {"
" key = \"bt3\" ;"
" label = \"图中选择\" ;"
" }"
" :button {"
" is_cancel = true ;"
" key = \"bt4\" ;"
" label = \"回前菜单\" ;"
" }"
"}"
)
)
(setq tmpf (xty-sys-makeFbylst
(vl-filename-mktemp nil nil ".dcl")
dcllst2
)
)
(setq callback2 2)
(setq dcl_id2 (load_dialog tmpf))
(vl-file-delete tmpf)
(while (> callback2 1)
(new_dialog "temp2" dcl_id2)
(action_tile "bt3" "(do_bt3)")
(action_tile "bt4" "(do_bt4)")
(setq callback2 (start_dialog))
(cond ((= 2 callback2) (setq pt(getpoint"\n图中拾取:")))
((= 0 callback2)(bb))
)
)
(unload_dialog dcl_id2)
)
(defun do_bt1()(done_dialog 1))
(defun do_bt3()(done_dialog 2))
(defun c:aa ()
(defun do_bt1 () (done_dialog 1))
(defun do_bt2 () (done_dialog 0))
(setq dcl1 '("temp1:dialog{:button{key=bt1;label=下一个对话框;}"
":button{is_cancel=true;key=bt2;label=取消;}}"
)
tmpf (xty-sys-makeFbylst
(vl-filename-mktemp nil nil ".dcl")
dcl1
)
dcl_id1 (load_dialog tmpf)
)
(vl-file-delete tmpf)
(new_dialog "temp1" dcl_id1)
(action_tile "bt1" "(do_bt1)")
(action_tile "bt2" "(do_bt2)")
(setq callback1 (start_dialog))
(cond ((= callback1 1) (c:bb)))
(unload_dialog dcl_id1)
(princ)
)
(defun c:bb ()
(defun do_bt3 () (done_dialog 1))
(defun do_bt4 () (done_dialog 2))
(setq dcl2 '("temp2:dialog{"
":button{key=bt3;label=图中选择;}"
":button{is_cancel=true;key=bt4;label=回前菜单;}}"
)
tmpf (xty-sys-makeFbylst
(vl-filename-mktemp nil nil ".dcl")
dcl2
)
dcl_id2 (load_dialog tmpf)
)
(vl-file-delete tmpf)
(new_dialog "temp2" dcl_id2)
(action_tile "bt3" "(do_bt3)")
(action_tile "bt4" "(do_bt4)")
(setq callback2 (start_dialog))
(cond ((= callback2 1) (setq pt (getpoint "\n图中拾取:")))
((= callback2 2) (c:aa))
)
(unload_dialog dcl_id2)
(princ)
)
(defun xty-sys-makeFbylst (filename strlst / f n)
(setq f (open filename "w"))
(foreach n strlst (write-line n f))
(close f)
filename
)
x_s_s_1 发表于 2022-3-25 08:19
谢谢,这么晚还回帖,分开的dcl我写出来了,您这个代码我看了一下,估计在点取了bt3后直接退出命令,不会 ...
不影响啊
aa里面两个对话框一起也可以,
把bb里面写/删对话框过程删掉就行了 xyp1964 发表于 2022-3-25 15:01
(defun c:tt ()
(setq dlst '("temp1:dialog{:button{key=bt1;label=下一个对话框;}"
":button{is_cancel=true;key=bt2;label=取消;}}"
"temp2:dialog{:button{key=bt3;label=图中选择;}"
":button{is_cancel=true;key=bt4;label=回前菜单;}}"
)
)
(defun aa () ; tt(dcl界面切换)
(defun do_bt1 () (done_dialog 1))
(defun do_bt2 () (done_dialog 0))
(setq tmpf (xty-sys-makeFbylst
(vl-filename-mktemp nil nil ".dcl")
dlst
)
dcl_id1 (load_dialog tmpf)
)
(vl-file-delete tmpf)
(new_dialog "temp1" dcl_id1)
(action_tile "bt1" "(do_bt1)")
(action_tile "bt2" "(do_bt2)")
(setq callback1 (start_dialog))
(cond ((= callback1 1) (bb)))
(unload_dialog dcl_id1)
(princ)
)
(defun bb ()
(defun do_bt3 () (done_dialog 1))
(defun do_bt4 () (done_dialog 2))
(setq tmpf (xty-sys-makeFbylst
(vl-filename-mktemp nil nil ".dcl")
dlst
)
dcl_id2 (load_dialog tmpf)
)
(vl-file-delete tmpf)
(new_dialog "temp2" dcl_id2)
(action_tile "bt3" "(do_bt3)")
(action_tile "bt4" "(do_bt4)")
(setq callback2 (start_dialog))
(cond ((= callback2 1) (setq pt (getpoint "\n图中拾取:")))
((= callback2 2) (aa))
)
(unload_dialog dcl_id2)
(princ)
)
(defun xty-sys-makeFbylst (filename strlst / f n)
(setq f (open filename "w"))
(foreach n strlst (write-line n f))
(close f)
filename
)
(aa)
(princ)
)
本帖最后由 x_s_s_1 于 2022-3-26 09:00 编辑
masterlong 发表于 2022-3-25 17:28
无非就是一个逻辑关系嘛
DCL文件里有几个对话框有啥关系
都是可以单独调用的
您的回帖点醒了我,我逐步调试了一下程序,大概理解了dcl的逻辑,与dcl文件中几个dialog没有任何关系;
new_dialog开始一个新的对话框,然后开始给对话框赋值,这个时候并没有显示对话框;
new_dialog一次,更新一次;
start_dialog显示对话框,把控制权交给对话框,这个时候可以选择控件;
再通过action_tile配合done_dialog 中断对话框,进行操作。
在这个期间,所有的dialog都在内存里面,想显示哪个dialog就new_dialog哪一个、
本帖中8楼以前的代码,实际上都多次写了dcl文件,因为bb函数回调的时候都调用了aa,所以要单独把写文件的函数写在循环外面。
下面是我调整后的代码(defun c:cc (/ aa bb callback dcllst dcl_id pt tmpf)
(defun aa ()
(new_dialog "temp1" dcl_id)
(action_tile "bt1" "(done_dialog 1)")
(setq callback (start_dialog))
(cond
((= 1 callback) (bb))
)
)
(defun bb ()
(new_dialog "temp2" dcl_id)
(action_tile "bt3" "(done_dialog 2)")
(action_tile "bt4" "(done_dialog 4)")
(setq callback (start_dialog))
(cond
((= 2 callback) (setq pt (getpoint "\n图中拾取:")) (bb))
((= 4 callback) (aa))
)
)
(setq dcllst
'("temp1:dialog{"
":button {key = \"bt1\" ;label = \"下一个对话框\" ;}"
":button {is_cancel = true ;key = \"bt2\" ;label = \"取消\" ;}"
"}"
"temp2:dialog {"
":button {key = \"bt3\" ;label = \"图中选择\" ;}"
":button {is_cancel = true ;key = \"bt4\" ;label = \"回前菜单\" ;}"
"}"
)
)
(setq tmpf (xty-sys-makeFbylst
"c:\\1.dcl"
dcllst
)
)
(setq dcl_id (load_dialog tmpf))
(vl-file-delete tmpf)
(aa)
(unload_dialog dcl_id)
)
虽然masterlong并没有给出实际的解决方案,但是他的提醒非常有用,我还是将最佳答案给masterlong兄,wzg356和院长应该不会有意见吧,如有意见,私发消息给我,我另行补偿,谢谢各位.
页:
[1]
2