找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5173|回复: 24

[求助] 如何用"Tree"实现函数控制

[复制链接]

已领礼包: 5188个

财富等级: 富甲天下

发表于 2013-11-25 22:52:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
以OpenDCL样例中的"Tree"为例。我想让 First Parent 中的 Child 1 对应函数 fun1,Child 2 对应函数 fun2。单击 Child 1,右下列表中显示有 Onclicked(不管其他内容)。用dcl_Tree_GetSelectedItem 及dcl_Tree_GetItemLabel可以得到 Child 1,这样我就知道该执行fun1了。再单击 Child 2,显示 Onclicked 及 OnSelChanged (Child 2),结果就会同时得到Child 1 和 Child 2。而我肯定只想执行 fun2,不想执行fun1。
请问:应该如何排除掉 child 1 呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-11-25 23:49:45 | 显示全部楼层
(dcl_Tree_GetSelectedItem XDOB_ONLINE_EDIT_Form1_树1)
This method returns the handle or string key of the currently selected item, or NIL if there is no selection

你获得当前选择的项,然后做你想做的。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

 楼主| 发表于 2013-11-26 19:30:33 | 显示全部楼层
本帖最后由 原地踏步 于 2013-11-26 19:43 编辑

不行啊,老大!
我就是用这种方法的。但当我点Child 1时,返回Child 1,再点Child 2,返回的仍然是Child 1!只有再点Child 2时,才能得到 Child 2。我希望的是第一次点 Child 2,就马上能够得到。
下面是我修改后的Tree函数。只留了Onclicked 和 OnSelchanged。Odcl 文件中也只留这项,其它无关的都关掉了。麻烦老大再帮我看看。
谢谢!

点评

没太细看,貌似onClick事件和onSelChanged事件,只用一个onSelChanged判断就可以了,没什么要用两个呢?重复了吧。  详情 回复 发表于 2013-11-26 22:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

 楼主| 发表于 2013-11-26 19:31:28 | 显示全部楼层
本帖最后由 原地踏步 于 2013-11-27 20:16 编辑

  1. <P>;;;
  2. ;;; Tree Sample
  3. ;;;
  4. ;;; This sample demonstrates the tree control and all its events.
  5. ;;;

  6. ;; Main program
  7. (defun c:Tree (/ cmdecho)

  8.         ;; Ensure OpenDCL Runtime is (quietly) loaded
  9.         (setq cmdecho (getvar "CMDECHO"))
  10.         (setvar "CMDECHO" 0)
  11.         (command "_OPENDCL")
  12.         (setvar "CMDECHO" cmdecho)

  13.         ;; Load the project
  14.         (dcl_Project_Load (*ODCL:Samples:FindFile "Tree.odcl") T)

  15.         ;; Show the main form
  16.         (dcl_Form_Show Tree_Main)

  17.         ;; This is a modal form, so (dcl_Form_Show) does not return until
  18.         ;; the modal form is closed. In the meantime, the event handlers
  19.         ;; manage the form.

  20.         (princ)
  21. )</P>
  22. <P>
  23. (defun c:Tree_Main_OnInitialize (/ P1 P2)
  24. (setq P1 (dcl_Tree_AddParent Tree_Main_tree "First Parent" 0 -1 1))
  25. (dcl_Tree_AddChild Tree_Main_tree
  26.   (list
  27.    (list P1 "Child 1" 2 3)
  28.    (list P1 "Child 2" 2 3)
  29.    (list P1 "Child 3" 2 3)
  30.   )
  31. )
  32. (setq P2 (dcl_Tree_AddParent Tree_Main_tree "Second Parent" 0 -1 8))
  33. (dcl_Tree_AddChild Tree_Main_tree
  34.   (list
  35.    (list P2 "Child C" 4 5)
  36.    (list P2 "Child B" 4 5)
  37.    (list P2 "Child A" 4 5)
  38.   )
  39. )
  40. (dcl_Tree_AddParent Tree_Main_tree
  41.   '( ("Third Parent" 0 -1 1)
  42.    ("Fourth Parent" 0 -1 1)
  43.   )
  44. )
  45. (dcl_Tree_SelectItem Tree_Main_tree P1)
  46. (dcl_ListBox_Clear Tree_Main_lbxLog)
  47. )</P>
  48. <P>
  49. (defun Tree_LogEvent (event)
  50.   (dcl_ListBox_SetTopIndex Tree_Main_lbxLog (1- (dcl_ListBox_AddString Tree_Main_lbxLog event)))
  51. )

  52. ;|<<OpenDCL Event Handlers>>|;


  53. (defun c:Tree_Main_Tree_OnClicked (/)

  54.         (setq cursel (dcl_Tree_GetSelectedItem Tree_Main_tree))
  55.         (setq txt  (strcat "OnClicked   " (dcl_Tree_GetItemLabel Tree_Main_tree CurSel)))
  56. ;        (Tree_LogEvent "OnClicked")
  57.         (Tree_LogEvent txt)
  58. )


  59. (defun c:Tree_Main_Tree_OnSelChanged (Label Key / Images)

  60.         (Tree_LogEvent (strcat "OnSelChanged (" Label ")"))
  61.         (if (Tree_IsTracking)
  62.                 (progn
  63.                         (dcl_Control_SetText Tree_Main_tbxLabel Label)
  64.                         (setq Images (dcl_Tree_GetItemImages Tree_Main_tree Key))
  65.                         (dcl_ImageComboBox_SetCurSel Tree_Main_cbxImage (1+ (car Images)))
  66.                         (dcl_ImageComboBox_SetCurSel Tree_Main_cbxSelImage (1+ (cadr Images)))
  67.                         (dcl_ImageComboBox_SetCurSel Tree_Main_cbxExpImage (1+ (caddr Images)))
  68.                 )
  69.         )
  70. )


  71. (princ)

  72. ;|<<OpenDCL Samples Epilog>>|;

  73. ;;;######################################################################
  74. ;;;######################################################################
  75. ;;; The following section of code is designed to locate OpenDCL Studio
  76. ;;; sample files in the samples folder by prefixing the filename with
  77. ;;; the path prefix that was saved in the registry by the installer.
  78. ;;; The global *ODCL:Prefix and function *ODCL:Samples:FindFile
  79. ;;; are used throughout the samples.
  80. ;;;
  81. (or *ODCL:Samples:FindFile
  82.         (defun *ODCL:Samples:FindFile (file)
  83.                 (setq *ODCL:Prefix
  84.                         (cond
  85.                                 (        *ODCL:Prefix
  86.                                 ) ;_ already defined
  87.                                 (        (vl-registry-read
  88.                                                  "HKEY_CURRENT_USER\\SOFTWARE\\OpenDCL"
  89.                                                  "SamplesFolder"
  90.                                         )
  91.                                 ) ;_ 32-bit location
  92.                                 (        (vl-registry-read
  93.                                                  "HKEY_LOCAL_MACHINE\\SOFTWARE\\OpenDCL"
  94.                                                  "SamplesFolder"
  95.                                         )
  96.                                 ) ;_ 32-bit location
  97.                                 (        (vl-registry-read
  98.                                                  "HKEY_CURRENT_USER\\SOFTWARE\\Wow6432Node\\OpenDCL"
  99.                                                  "SamplesFolder"
  100.                                         )
  101.                                 ) ;_ 64-bit location
  102.                                 (        (vl-registry-read
  103.                                                  "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\OpenDCL"
  104.                                                  "SamplesFolder"
  105.                                         )
  106.                                 ) ;_ 64-bit location
  107.                         )
  108.                 )
  109.                 (cond
  110.                         ((findfile file)) ; check the support path first
  111.                         (*ODCL:Prefix (findfile (strcat *ODCL:Prefix file)))
  112.                         (file)
  113.                 )
  114.         )
  115. )

  116. ;; If master demo is active, run the main function immediately; otherwise
  117. ;; display a banner. The extra gymnastics allow the sample name to be
  118. ;; specified in only one place, thus making it easier to reuse this code.
  119. (        (lambda (demoname)
  120.                 (if *ODCL:MasterDemo
  121.                         (progn
  122.                                 (princ (strcat "'" demoname "\n"))
  123.                                 (apply (read (strcat "C:" demoname)) nil)
  124.                         )
  125.                         (progn
  126.                                 (princ (strcat "\n" demoname " OpenDCL sample loaded"))
  127.                                 (princ (strcat " (Enter " (strcase demoname) " command to run)\n"))
  128.                         )
  129.                 )
  130.         )
  131.         "Tree"
  132. )
  133. (princ)

  134. ;;;######################################################################</P>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-11-26 22:20:29 | 显示全部楼层
原地踏步 发表于 2013-11-26 19:30
不行啊,老大!
我就是用这种方法的。但当我点Child 1时,返回Child 1,再点Child 2,返回的仍然是Child 1 ...

没太细看,貌似onClick事件和onSelChanged事件,只用一个onSelChanged判断就可以了,为什么要用两个呢?重复了吧。

点评

如果我点了一下 Child 1,下次又点 Child 1 呢?  详情 回复 发表于 2013-11-26 23:37
如果我点了一下 Child 1,下次又点 Child 1 呢?  详情 回复 发表于 2013-11-26 22:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

 楼主| 发表于 2013-11-26 22:52:22 | 显示全部楼层
wxytiger 发表于 2013-11-26 22:20
没太细看,貌似onClick事件和onSelChanged事件,只用一个onSelChanged判断就可以了,为什么要用两个呢? ...

如果我点了一下 Child 1,下次又点 Child 1 呢?

点评

你设个全局变量啊,没变就是原来的啊。onChange后,再赋新值。  详情 回复 发表于 2013-11-26 23:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-11-26 23:18:19 | 显示全部楼层
原地踏步 发表于 2013-11-26 22:52
如果我点了一下 Child 1,下次又点 Child 1 呢?

你设个全局变量啊,没变就是原来的啊。onChange后,再赋新值。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

 楼主| 发表于 2013-11-26 23:37:36 | 显示全部楼层
wxytiger 发表于 2013-11-26 22:20
没太细看,貌似onClick事件和onSelChanged事件,只用一个onSelChanged判断就可以了,为什么要用两个呢? ...

如果我点了一下 Child 1,下次又点 Child 1 呢?

点评

根据你的需要做你的事情呗, 判断 onchange 是否变化了,onclick是否点了,getcuritem 获得当前的选项。  详情 回复 发表于 2013-11-27 00:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-11-27 00:08:22 | 显示全部楼层
原地踏步 发表于 2013-11-26 23:37
如果我点了一下 Child 1,下次又点 Child 1 呢?

根据你的需要做你的事情呗, 判断 onchange 是否变化了,onclick是否点了,getcuritem 获得当前的选项。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

 楼主| 发表于 2013-11-27 20:40:21 | 显示全部楼层
本帖最后由 原地踏步 于 2013-11-27 20:44 编辑

Onclicked 和 Onselchanged 都是自动执行的,我只能将我的程序嵌入它们之中。在执行Onselchanged之前,Onclicked已经执行了,没法判断呀!
我也试着设置了一个 flg,用函数func 来判断到底该执行哪个程序。在 Onclicked 中加入
(if (null flg) (func)) (setq flg nil)
在 Onselchanged 中加入
(func) (setq flg T)
结果是:先点Child 1,再点 child 2,没问题;再点 child 2,没反应;再点 child 2,正确。
也就是说,中间会停一次。从程序分析来讲,也应该是这样的结果。
但这明显不是我想要的呀。我希望点哪一个,就立即得到唯一的结果。

点评

你只在一个事件里面执行你的操作,比如OnClick, 发生change的时候,你代码去执行onClick的回调事件,都在一个onClick里面判断。  详情 回复 发表于 2013-11-28 23:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-11-28 23:34:12 来自手机 | 显示全部楼层
你是想用tree控件做菜单吧,只用onclick判断呢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-11-28 23:53:03 | 显示全部楼层
原地踏步 发表于 2013-11-27 20:40
Onclicked 和 Onselchanged 都是自动执行的,我只能将我的程序嵌入它们之中。在执行Onselchanged之前,Oncl ...



你只在一个事件里面执行你的操作,比如OnClick, 发生change的时候,你代码去执行onClick的回调事件,都在一个onClick里面判断。或者反过来。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

 楼主| 发表于 2013-12-1 00:12:51 | 显示全部楼层
只用onselchanged肯定不行,因为有可能多次执行同一个命令。只用onclicked,如果改变选择,它的反应总要慢一拍,还是不行。
我把文件传上来,麻烦能帮我看看吗?
先谢啦!
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:Tree.rar 
下载次数:12  文件大小:6.3 KB 
下载权限: 不限 以上  [免费赚D豆]

点评

你在OnChange的时候,直接执行你的函数不行吗?  详情 回复 发表于 2013-12-1 00:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-12-1 00:20:42 | 显示全部楼层
原地踏步 发表于 2013-12-1 00:12
只用onselchanged肯定不行,因为有可能多次执行同一个命令。只用onclicked,如果改变选择,它的反应总要慢 ...

你在OnChange的时候,直接执行你的函数不行吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

 楼主| 发表于 2013-12-1 21:03:52 | 显示全部楼层
不管是onclicked还是onselchanged,都应该执行函数。
比如:child1对应函数func1,child2对应函数func2。先点child1,执行func1;再点child2,希望执行func2,但实际上是先再执行一次func1,然后执行func2。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-25 11:04 , Processed in 0.272366 second(s), 68 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表