革天明 发表于 2012-3-6 09:55:40

旧事重提!如何实现单击radio_button时edit_box实时更新

http://bbs.mjtd.com/forum.php?mod=attachment&aid=NTc5ODV8MTU0ZDE1MWZ8MTMzMDk5NzczNnwzOTQxNTF8ODYxMDk
我要的内容和此贴要求的一样,已有不少高手解答了,无奈DCL对我来说太验了,我只能实现单列的实时更新,两列在一块时就有问题。请高手写出此图片上的DCL和LISP调用文件。
要求:点左侧的单选按钮时,给变量guanya赋值为单选按钮的label值,点右侧的单选按钮时给xinghao赋值为单选按钮的label值。(setq str1(strcat guanya xinghao))(set_tile "guanyaxinghao" str1)
注意:(set_tile "guanyaxinghao" str1)这句只是显示我的选择,程序中我使用的是str1这个变量。如果str1不容易得到的话,可以从(setq str1(get_tile "guanyaxinghao" ))中取值。也就是说guanyaxinghao这个edit_box只是“测试”显示结果,我的程序中不必要这个edit_box
插入引线标注 是不必要的。

xshrimp 发表于 2012-3-6 09:55:41

本帖最后由 xshrimp 于 2012-3-6 10:49 编辑

(defun c:test( / dclid dclname filen gyxh stream tempname)
(defun act-dcl()
(setq #gydata# (subst (list $key $value)(assoc $key #gydata#)#gydata#))   
(set_tile "GYXH" (setq gyxh (strcat(get_tile "GY")(get_tile "XH"))))
(setq #gydata# (subst(list "GYXH" gyxh)(assoc "GYXH" #gydata#)#gydata#))
)
(defun act-dcl-gyxh( )
(setq #gydata# (subst(list "GYXH" $value)(assoc "GYXH" #gydata#)#gydata#))
)
(defun act-dcl-in()
(alert (cadr(assoc "GYXH" #gydata#)))
)
(setq dclname
(cond
((setq tempname (vl-filename-mktemp "gps-dcl-tmp.dcl") filen (open tempname "w"))
(foreach stream
'(
"test:dialog{\n"
"label=\"管牙型号标注\";\n"
":row{\n"
":boxed_radio_column{key=\"GY\";label=\"管牙\";width=15;\n"
":radio_button{key=\"PT\";label=\"PT\";}\n"
":radio_button{key=\"NPT\";label=\"NPT\";}\n"
":radio_button{key=\"BSP\";label=\"BSP\";}\n"
":radio_button{key=\"BSPT\";label=\"BSPT\";}\n"
"}\n"
":boxed_radio_column{key=\"XH\";label=\"型号\";width=15;\n"
":radio_button{key=\"1/8\";label=\"1/8\";}\n"
":radio_button{key=\"1/4\";label=\"1/4\";}\n"
":radio_button{key=\"3/8\";label=\"3/8\";}\n"
":radio_button{key=\"1/2\";label=\"1/2\";}\n"
":radio_button{key=\"3/4\";label=\"3/4\";}\n"
"}\n"
"}\n"
":edit_box{key=\"GYXH\";label=\"管牙型号\";}\n"
":row{\n"
":button{key=\"IN\";label=\"插入引线标注\";}\n"
":button{is_cancel=true;key=\"cancel\";label=\"取消\";}\n"
"}\n"
"}\n"
)
(princ stream filen)
)
(close filen)
tempname
)))
(setq dclid (load_dialog dclname))
(if (not (new_dialog "test" dclid)) (progn (alert "dcl对话框加载失败.")(exit)))
(if (null #gydata#)
(setq #gydata# (list (list "GY" "PT")(list "XH" "1/8")(list "GYXH" "PT1/8")))
)
(set_tile "GY"   (cadr(assoc "GY"   #gydata#)))
(set_tile "XH"   (cadr(assoc "XH"   #gydata#)))
(set_tile "GYXH" (cadr(assoc "GYXH" #gydata#)))

(action_tile "GY"   "(act-dcl)")
(action_tile "XH"   "(act-dcl)")
(action_tile "GYXH" "(act-dcl-gyxh)")

(action_tile "IN"   "(act-dcl-in)")
(action_tile "cancel" "(done_dialog 0)")

(start_dialog)
(unload_dialog dclid)
(vl-file-delete dclname)
)

革天明 发表于 2012-3-6 10:06:22

此贴的链接为:
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=86109&page=1#pid509513

革天明 发表于 2012-3-6 10:58:36

谢谢您了!水平真高,有您的范例我就能照着仿写,谢谢

革天明 发表于 2012-3-6 10:59:19

好像有BUG,自己也能回答自己的帖子!

革天明 发表于 2012-3-6 13:55:52

请问如何再加两个编辑框,此编辑框的内容也要随你的选择而变化,
在路径下有20个文件,文件名为pt1/8.dat   pt1/4.dat...pt3/4.dat......BSPT1/8.dat...BSPT3/4.dat共20个文件,使用函数myread可将文件的内容读成表,第行为一个元素。如'(1.3 2.6 2.8 12).
两个单选按钮组成一个文件名变量,使用函数myread将此文件中的内容读出来,返回的表的第2、第4个元素分别赋值给edit_box1和edit_box2

革天明 发表于 2012-3-6 14:00:15

myread函数我已经自定义好了,你在程序中只用调用就行了,
;|需要输入文件路径,返回文件按行读取读取后的列表=====================================|;

(defun str-lst (lj / data_list ff data)
(setq        data_list '()
        ff          (open lj "r")
        data          (read-line ff)
)
(while data
    (setq data_list (cons data data_list)
          data          (read-line ff)
    )
)
(reverse data_list)                        ;对表倒序排序,;输出列表
)                                        ;edn defun

革天明 发表于 2012-3-6 16:58:21

xshrimp 发表于 2012-3-6 09:55 static/image/common/back.gif


已完成了,谢谢你,主要在act-dcl中加代码就行了

革天明 发表于 2012-4-7 13:45:16

xshrimp 发表于 2012-3-6 09:55 static/image/common/back.gif


程序目前好像只对key=XH和key=GY这两个key作用,而key=1/8、key=PT等都不起作用了,
(action_tile "PT" "(show22)")此句用来显示幻灯片,可是不起作用了,请问如何解决?

露草 发表于 2012-4-11 17:49:05

厉害对DCL一直没下功夫学习
页: [1] 2
查看完整版本: 旧事重提!如何实现单击radio_button时edit_box实时更新