找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1152|回复: 0

[LISP程序]:ODCL Treeview控件数据的保存与恢复

[复制链接]
发表于 2002-11-10 04:08:29 | 显示全部楼层 |阅读模式

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

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

×
今天研究了一下ODCL Treeview控件数据的保存与恢复,
思考的时候走了很多弯路,所以把我的做法写下来,也许
能对大家有所帮助,当然,也许大伙还会有更好的方法。

(注意:这里只是介绍一个思路,下面的代码取自我正在写
的程序,并不完整)

思路一:数据文件的结构


  1. [Tree_DATA]
  2. ("k1" "" "First Parent")
  3. ("k5" "k1" "Child 1")
  4. ("k8" "k5" "Child 1")
  5. ("k9" "k5" "Child 2")
  6. ("k10" "k5" "Child 3")
  7. ("k6" "k1" "Child 2")
  8. ("k7" "k1" "Child 3")
  9. ("k78921" "k5" "读入测试")
  10. ("k2" "" "Second Parent")
  11. ("k38921" "" "根目录添加测试")
  12. ("k3" "" "Third Parent")
  13. ("k4" "" "Fourth Parent")
复制代码


因为我写的是自用非商业性程序,所以数据文件也是很简单
的纯文本格式,直接记录了lisp的表,读写的时候很省事。
其中:
第一项是item自身的key值
第二项是item父节点的key值,若是根节点则为空字符
第三项是item的文字描述


思路二:读取并填充treeview控件


  1. (defun fill_tree (/ x lst1 lst_str)

  2.   ;读取上述数据文件,每组数据为一项组成字符串列表
  3.   (if (setq lst_str (QAEC_GETINI "eac.dat" "Tree_DATA"))
  4.   
  5.     (progn
  6.      ;把每组数据由字符串转换为表逐项添加
  7.       (foreach x lst_str
  8.         (setq lst1 (read x))
  9.         (if (= (cadr lst1) "")
  10.           ;处理根节点的情况
  11.           (Odcl_Tree_AddParent eac_EACMain_EACTree
  12.                               (nth 2 lst1)
  13.                               (nth 0 lst1)
  14.                               0
  15.                               2
  16.                               1)
  17.           ;处理子节点的情况
  18.           (Odcl_Tree_AddChild eac_EACMain_EACTree
  19.                               (nth 1 lst1)
  20.                               (nth 2 lst1)
  21.                               (nth 0 lst1)
  22.                               0
  23.                               2
  24.                               1)
  25.         );if
  26.       );foreach
  27.     );progn
  28.     (alert "Can't load tree data")
  29.   );if
  30. );end


思路三:保存treeview控件的数据
把每个节点的key值、描述文字、父节点的key值这三个数据求出来,
并把所有这些数据组成一个表,再把表按照上述数据文件的格式记录
在文件里,就可以达到保存treeview控件数据的目的。

关键是历遍所有节点生成数据表,下面是我写的这个功能的函数:
(注意,返回的表是倒序的)


  1. ;;;获取指定ODCL的treeview控件文字和key属性以表格返回
  2. ;;;Key属性不能有重复
  3. (defun QAEC_ODCL_Tree_GetList (odcl_ctrl / k1 k2 str1
  4.                         odcl_tree_chkchild lst_tree_dat)
  5.   ;;;递归寻找子节点数据的子函数
  6.   (defun odcl_tree_chkchild (key_in / kk1 kk2 str1)
  7.     (Setq kk1 (Odcl_Tree_GetFirstChildItem odcl_ctrl Key_in))
  8.     (if (and kk1 (/= kk1 ""))
  9.       (progn
  10.         (Setq str1 (Odcl_Tree_GetItemText odcl_ctrl kk1))
  11.         (setq lst_tree_dat (cons (list kk1 key_in str1) lst_tree_dat))
  12.         (odcl_tree_chkchild kk1)

  13.         (while (Setq kk2 (Odcl_Tree_GetNextSiblingItem odcl_ctrl kk1))
  14.           (if (/= kk2 "")(progn
  15.             (Setq str1 (Odcl_Tree_GetItemText odcl_ctrl kk2))
  16.             (setq lst_tree_dat (cons (list kk2 key_in str1) lst_tree_dat))
  17.             (odcl_tree_chkchild kk2)
  18.           ));if
  19.           (setq kk1 kk2)
  20.         );while
  21.       );progn
  22.     );if
  23.   );end
  24.   
  25.   (Setq k1 (Odcl_Tree_GetRootItem odcl_ctrl))
  26.   (Setq str1 (Odcl_Tree_GetItemText odcl_ctrl k1))
  27.   (setq lst_tree_dat (cons (list k1 "" str1) lst_tree_dat))
  28.   (odcl_tree_chkchild k1)
  29.   
  30.   (while (Setq k2 (Odcl_Tree_GetNextSiblingItem odcl_ctrl k1))
  31.     (if (/= k2 "")(progn
  32.       (Setq str1 (Odcl_Tree_GetItemText odcl_ctrl k2))
  33.       (setq lst_tree_dat (cons (list k2 "" str1) lst_tree_dat))
  34.       (odcl_tree_chkchild k2)
  35.     ));if
  36.     (setq k1 k2)
  37.   );while
  38.   
  39.   lst_tree_dat
  40. );end

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

本版积分规则

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

GMT+8, 2024-11-16 13:48 , Processed in 0.251697 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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