乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 18|回复: 18

[编程交流] DCL检索val的帮助

[复制链接]

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 13:21:20 | 显示全部楼层 |阅读模式
我决定编写我自己版本的多行输入dcl以满足我们的需要,其思想是dcl的大小基于列表中的项目数,因此这部分效果很好,我最终得到了一个具有默认值的多行dcl。我有它的工作,有一些有趣的事情发生了,所以改变了代码,现在我已经失去了整个工作的东西。
 
重复设置平铺默认值,但平铺不返回该值
 
任何帮助都将不胜感激。
 
  1. ; Input  Dialog box with variable title
  2. ; multiple lines of dcl input supported
  3. ; add extra values to the list
  4. (vl-load-com)
  5. ; returns the value of key1 key2 and key3 etc  as strings
  6. ; sample code (ah:getval2018 "heading at top" (list "Line 1" 5 4 "1" "Line2" 8 7 "2"))
  7. ; (setq dcllst (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44"))
  8. ; (AH:getval2018 "This is heading" (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44"))
  9. (defun  AH:getval2018 (heading dcllst /  x y ans fo fname keynum)
  10. (setq num (/ (length dcllst) 4))
  11. (setq x 0)
  12. (setq  y 0)
  13. (setq fo (open (setq fname (vl-filename-mktemp "" "" ".dcl")) "w"))
  14. (write-line "ddgetvalAH : dialog {" fo)
  15. (write-line  (strcat "        label =" (chr 34) heading (chr 34) " ;" )fo)
  16. (write-line " : column {" fo)
  17. (repeat num
  18. (write-line "spacer_1 ;" fo)
  19. (write-line ": edit_box {" fo)
  20. (setq keynum (strcat "key" (rtos (setq y (+ Y 1)) 2 0)))
  21. (write-line (strcat "    key = " (chr 34) keynum (chr 34) ";") fo)
  22. (write-line  (strcat " label = "  (chr 34) (nth x dcllst) (chr 34) ";" ) fo)
  23. (write-line (strcat "     edit_width = " (rtos (nth (+ x 1) dcllst) 2 0) ";" ) fo)
  24. (write-line (strcat "     edit_limit = " (rtos (nth (+ x 2) dcllst) 2 0) ";" ) fo)
  25. (write-line "   is_enabled = true ;" fo)
  26. (write-line "    }" fo)
  27. (setq x (+ x 4))
  28. )
  29. (write-line "    }" fo)
  30. (write-line "spacer_1 ;" fo)
  31. (write-line "ok_only;}" fo)
  32. (close fo)
  33. (setq dcl_id (load_dialog  fname))
  34. (if (not (new_dialog "ddgetvalAH" dcl_id))
  35. (exit))
  36. (setq x -1)
  37. (setq y 0)
  38. (repeat  num
  39. (setq keynum  (strcat "key" (rtos (setq y (+ Y 1)) 2 0)))
  40. (setq valnum (strcat "val" (rtos y 2 0)))
  41. (set_tile keynum (nth (setq x (+ x 4)) dcllst))
  42. ;;;; problem is here
  43. (action_tile keynum (strcat "(set " "(read valnum)" " $value)"))
  44. (mode_tile  keynum  3)
  45. )
  46. (start_dialog)
  47. (unload_dialog dcl_id)
  48. )
  49. (AH:getval2018 "This is heading" (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44"))
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 13:25:30 | 显示全部楼层
也许是这样,不太确定——它回来了!val1!val2!val3。。。
 
  1. ; sample code (ah:getval2018 "heading at top" (list "Line 1" 5 4 "1" "Line2" 8 7 "2"))
  2. ; (setq dcllst (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44"))
  3. ; (AH:getval2018 "This is heading" (list "Line 1" 5 4 "1" "Line2" 8 7 "22" "Line3" 8 7 "3" "Line4" 8 7 "44"))
  4. (defun AH:getval2018 ( heading dcllst / x y fo fname keynum valnum keylst vallst )
  5.   (setq num (/ (length dcllst) 4))
  6.   (setq x 0)
  7.   (setq y 0)
  8.   (setq fo (open (setq fname (vl-filename-mktemp "" "" ".dcl")) "w"))
  9.   (write-line "ddgetvalAH : dialog {" fo)
  10.   (write-line (strcat "        label =" (chr 34) heading (chr 34) " ;" ) fo)
  11.   (write-line " : column {" fo)
  12.   (repeat num
  13.     (write-line "spacer_1 ;" fo)
  14.     (write-line ": edit_box {" fo)
  15.     (setq keynum (strcat "key" (rtos (setq y (1+ y)) 2 0)))
  16.     (write-line (strcat "    key = " (chr 34) keynum (chr 34) ";") fo)
  17.     (write-line (strcat "  label = " (chr 34) (nth x dcllst) (chr 34) ";") fo)
  18.     (write-line (strcat "     edit_width = " (rtos (nth (+ x 1) dcllst) 2 0) ";") fo)
  19.     (write-line (strcat "     edit_limit = " (rtos (nth (+ x 2) dcllst) 2 0) ";") fo)
  20.     (write-line "   is_enabled = true ;" fo)
  21.     (write-line "    }" fo)
  22.     (setq x (+ x 4))
  23.   )
  24.   (write-line "    }" fo)
  25.   (write-line "spacer_1 ;" fo)
  26.   (write-line "ok_only;}" fo)
  27.   (close fo)
  28.   (setq dcl_id (load_dialog fname))
  29.   (if (not (new_dialog "ddgetvalAH" dcl_id))
  30.     (exit)
  31.   )
  32.   (setq x -1)
  33.   (setq y 0)
  34.   (repeat num
  35.     (setq keynum (strcat "key" (rtos (setq y (1+ y)) 2 0)))
  36.     (setq valnum (strcat "val" (rtos y 2 0)))
  37.     (setq keylst (cons keynum keylst))
  38.     (setq vallst (cons valnum vallst))
  39.   )
  40.   (foreach a (reverse vallst)
  41.     (set (read a) (nth (setq x (+ x 4)) dcllst))
  42.   )
  43.   (setq x -1)
  44.   (foreach ab (mapcar '(lambda ( a b ) (list a b)) (reverse keylst) (reverse vallst))
  45.     (set_tile (car ab) (nth (setq x (+ x 4)) dcllst))
  46.     (action_tile (car ab) (strcat "(setq " (cadr ab) " $value)"))
  47.     (mode_tile (car ab) 3)
  48.   )
  49.   (start_dialog)
  50.   (unload_dialog dcl_id)
  51.   (vl-file-delete fname)
  52. )
HTH。,M、 R。
回复

使用道具 举报

0

主题

946

帖子

978

银币

限制会员

铜币
-3
发表于 2022-7-5 13:30:35 | 显示全部楼层
问题是(read valnum)。您将其设置在循环内,但当valnum=val4时,动作互动程序动作发生在循环外,因此每个动作互动程序都将设置val4。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 13:33:12 | 显示全部楼层
 
动作块在循环内,问题实际上是(设置)函数。。。在我的示例中,我使用了(setq)并通过直接(strcat)-输入字符串值来避免(读取)。。。
回复

使用道具 举报

0

主题

946

帖子

978

银币

限制会员

铜币
-3
发表于 2022-7-5 13:36:40 | 显示全部楼层
 
对不起,在我发布之前没有看到你的帖子。是的,在BigAls代码中,设置动作平铺在循环内,但循环结束。此时,valnum=val4。然后,对话框启动,动作块事件在循环外发生(为每个动作块事件设置(读取值)$值);循环外的valnum=val4。因此,每个动作块事件都会设置val4。
 
顺便说一句,解决方法不错。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 13:38:23 | 显示全部楼层
只有4种乐趣:
 
  1. ;
  2. ; for BigAl - rlx 4 sep 2018
  3. (defun Eddie ( $txt1 %lst / err fn fp dcl nof-eddies Eddie-list slider-index org-list)
  4.   (Eddie_Init)
  5.   (Eddie_Dialog)
  6.   (Eddie_Exit)
  7.   (terpri)
  8.   %lst
  9. )
  10. (defun Eddie_Init ()
  11.   (setq err *error* *error* Eddie_err org-list %lst)
  12.   (cond
  13.     ((not (setq fn (vl-filename-mktemp "Eddie.dcl"))))
  14.     ((not (setq fp (open  fn "w"))))
  15.     ((null %lst))
  16.     (t (setq nof-eddies (length %lst)))
  17.   )
  18.    
  19.   (if (null %lst)
  20.     (progn (alert "Nothing to show")(Eddie_Exit))
  21.     (progn
  22.       (Eddie_write_header)
  23.       (if (<= nof-eddies 10)(Eddie_write_body1 %lst)(Eddie_write_body2 %lst))
  24.       (Eddie_write_footer)
  25.     )
  26.   )
  27.   (if fp (close fp))(gc)
  28.   (setq slider-index 0)
  29. )
  30. (defun Eddie_err (s) (princ s)(Eddie_Exit)(princ))
  31. (defun Eddie_Exit ()
  32.   (setq *error* err)
  33.   (if fp (close fp))
  34.   (if dcl (unload_dialog dcl))
  35.   (if (and fn (findfile fn))(vl-file-delete fn))
  36. )
  37. (defun Eddie_write_header ()
  38.   (write-line
  39.     (strcat
  40.       "Eddie:dialog{label="Eddie - BigAl (2018)";spacer;spacer;"
  41.       ":text_part {key="txt1";width=32;fixed_width=true;}"
  42.       ) fp))
  43. (defun Eddie_write_body1 ( %lst / i )
  44.   (write-line ":boxed_row {" fp)
  45.   (write-line ":column {" fp)
  46.   (setq i 0)
  47.   (mapcar
  48.     '(lambda (x)
  49.        (write-line
  50.          (strcat ":text_part{key="tp" (itoa i) "";label="" (car x) "";width=32;fixed_width=true;}")
  51.          fp
  52.        )
  53.        (setq i (1+ i))
  54.      )
  55.     %lst
  56.   );|close column|;(write-line "spacer;}" fp)
  57.  
  58.   (write-line ":column {" fp)
  59.   (setq i 0)
  60.   (mapcar
  61.     '(lambda (x)
  62.        (write-line
  63.          (strcat ":edit_box{key="eb" (itoa i) "";width=12;fixed_width=true;}")
  64.          fp
  65.        )
  66.        (setq i (1+ i))
  67.      )
  68.     %lst
  69.   );|close column & row|;(write-line "spacer;}}" fp)
  70. )
  71. (defun Eddie_write_body2 ( %lst / i )
  72.   (write-line ":boxed_row {" fp)
  73.   (write-line ":column {" fp)
  74.   (setq i 0)
  75.   (repeat 10
  76.     (write-line
  77.       (strcat ":text_part {key="tp" (itoa i) "";label="" (car (nth i %lst)) "";width=32;fixed_width=true;}")
  78.       fp
  79.     )
  80.     (setq i (1+ i))
  81.   ) ;|close column|; (write-line "spacer;}" fp)
  82.   (write-line ":column {" fp)
  83.   (setq i 0)
  84.   (repeat 10
  85.     (write-line
  86.       (strcat ":edit_box {key="eb" (itoa i) "";width=12;fixed_width=true;}")
  87.       fp
  88.     )
  89.     (setq i (1+ i))
  90.   );|close column|; (write-line "spacer;}" fp)
  91.  
  92.   (write-line
  93.     (strcat ":column {:slider {key="sldr";layout=vertical;min_value="
  94.             (itoa (- 0 nof-eddies)) ";max_value=0;small_increment=1;big_increment=10;value=0;}}}"
  95.     )
  96.     fp
  97.   )
  98. )
  99. (defun Eddie_write_footer ()
  100.   (write-line "spacer;spacer;ok_cancel;}" fp))
  101. (defun Eddie_Dialog ( / n drv inp)
  102.   (if (and (setq n 0 dcl (load_dialog fn)) (new_dialog "Eddie" dcl))
  103.     (progn
  104.       (Eddie_DialogUpdate)
  105.       (Eddie_DialogActions)
  106.       (setq drv (start_dialog))
  107.       (if (= drv 1)
  108.  (mapcar '(lambda (x y) (if (= x "1")(setq return (cons y return)))) Eddie-list %lst)
  109.  (setq return nil))
  110.     )
  111.   )
  112. )
  113. (defun Eddie_DialogUpdate ( / i )
  114.   (if (= (type $txt1) 'STR)(set_tile "txt1" $txt1))
  115.   (set_tile "sldr" (itoa slider-index))
  116.   (update_Eddies)
  117. )
  118. (defun Eddie_DialogActions ()
  119.   (repeat 10 (action_tile (strcat "eb" (itoa n)) (strcat "(edit_me $value " (itoa n) ")" ))(setq n (1+ n)))
  120.   (action_tile "sldr" "(update_slider $value)")
  121.   (action_tile "ok" "(done_dialog 1)")
  122.   (action_tile "cancel" "(setq %lst org-list)(done_dialog 0)")
  123. )
  124. (defun update_slider ( #i )
  125.   (setq slider-index (atoi #i))
  126.   (Eddie_DialogUpdate)
  127. )
  128. (defun update_Eddies (/ Eddie-index Eddie-name i)
  129.   ;max number of Eddies in dialog is 10
  130.   (if (> (abs slider-index) (- nof-eddies 10))
  131.     (setq Eddie-index (- nof-eddies 10))(setq Eddie-index (abs slider-index)))
  132.   (if (< Eddie-index 0)(setq Eddie-index 0))
  133.   (setq i 0)
  134.   (while (and (< i 10) (setq Eddie-name (car (nth Eddie-index %lst))))
  135.     (set_tile (strcat "tp" (itoa i)) Eddie-name)
  136.     (set_tile (strcat "eb" (itoa i)) (vl-princ-to-string (cadr (nth Eddie-index %lst))))
  137.     (setq i (1+ i) Eddie-index (1+ Eddie-index))
  138.   )
  139. )
  140. (defun edit_me ( $v #i / idx )
  141.   (if (> (abs slider-index) (- nof-eddies 10))
  142.     (setq idx (- nof-eddies 10))  (setq idx (abs slider-index)))
  143.   (setq idx (+ #i (if (< idx 0) 0 idx))
  144.         %lst (subst (list (car (nth idx %lst)) $v) (nth idx %lst) %lst)))
  145. ;print list (test function)
  146. (defun prl (lst)(mapcar '(lambda(x)(princ "\n")(princ x)) lst))
  147. (defun c:t1 ()
  148.   (prl
  149.     (Eddie "This is heading" '(("Line 1" 1) ("Line 2" 22) ("Line 3" 33)("Line 4" 44)))
  150.   )
  151.   (princ)
  152. )
  153. (defun c:t2 ()
  154.   (prl
  155.     (Eddie "This is heading"
  156.          '( ("Line  1"  11) ("Line  2"  22) ("Line  3"  33) ("Line  4"  44) ("Line  5"  55)
  157.             ("Line  6"  66) ("Line  7"  77) ("Line  8"  88) ("Line  9"  99) ("Line 10" 100)
  158.             ("Line 11" 110) ("Line 12" 120) ("Line 13" 130) ("Line 14" 140) ("Line 15" 150)
  159.           )
  160.     )
  161.   )
  162.   (princ)
  163. )
回复

使用道具 举报

0

主题

946

帖子

978

银币

限制会员

铜币
-3
发表于 2022-7-5 13:43:40 | 显示全部楼层
我的2美分:
 
改变
 
  1. (action_tile keynum (strcat "(set " "(read valnum)" " $value)"))

 
  1. (action_tile keynum (strcat "(setq val" (itoa y) " $value)"))

并删除
 
  1. (setq valnum (strcat "val" (rtos y 2 0)))
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 13:46:22 | 显示全部楼层
@德拉诺
你是对的,但我认为这不是唯一的问题。。。在循环并完成动作磁贴后,未更改的值似乎不会被签名到val变量。。。所以我必须按照我修改的方式来做。。。不确定,但只需在对话框中按“确定”即可检查是否需要,并且不要更改任何内容。。。如果val(s)不是nil(s),那么您的修复是可以的,但如果我是对的,那么我认为它必须被编码得更大。。。我仍然不太明白为什么(set)不能工作-必须(setq)-ing。。。
回复

使用道具 举报

0

主题

946

帖子

978

银币

限制会员

铜币
-3
发表于 2022-7-5 13:50:00 | 显示全部楼层
@马尔科·里巴
我在BigAl中添加了一些代码来处理被选择的OK,并将值收集到一个列表中以传递回调用程序。这将返回预期值。我的改编代码:
 
有趣的是(set(read numval)1)在命令行上工作,但尝试时出错(strcat“set”(read numval)“$value”)
 
通过将(read numval)更改为“(read numval)”解决了该错误。然而,这是一个字符串,因此在生成字符串“set(read numval)$value”的strcat中永远不会计算(read numval)。该字符串被设置为所有4个编辑框的操作命令,仅在触发action\u tile事件时才对其进行计算,该事件位于循环之外。希望这有意义。
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 13:52:27 | 显示全部楼层
  1. (defun tst1 ( / $value val1)
  2.   ; (action_tile "key1" (strcat "(setq " "val1" " $value)"))
  3.   ; -> (action_tile "key1" "(setq val1 $value)")
  4.   (setq $value "1")
  5.   (eval "(setq val1 $value)")
  6.   (eval (read "(setq val1 $value)"))
  7.   (princ)
  8. )
  9. (defun tst2 ( / $value val1)
  10.   ; (action_tile "key1" (strcat "(set " "val1" " $value)"))
  11.   ; -> (action_tile "key1" "(set val1 $value)")
  12.   (setq $value "1")
  13.   (eval "(set val1 $value)")
  14.   ; (eval (read "(set val1 $value)")) ; error: bad argument type: symbolp "1"
  15.   (eval (read "(set (quote val1) $value)"))
  16.   (princ)
  17. )
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 00:49 , Processed in 1.559552 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表