马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
今天研究了一下ODCL Treeview控件数据的保存与恢复,
思考的时候走了很多弯路,所以把我的做法写下来,也许
能对大家有所帮助,当然,也许大伙还会有更好的方法。
(注意:这里只是介绍一个思路,下面的代码取自我正在写
的程序,并不完整)
思路一:数据文件的结构
- [Tree_DATA]
- ("k1" "" "First Parent")
- ("k5" "k1" "Child 1")
- ("k8" "k5" "Child 1")
- ("k9" "k5" "Child 2")
- ("k10" "k5" "Child 3")
- ("k6" "k1" "Child 2")
- ("k7" "k1" "Child 3")
- ("k78921" "k5" "读入测试")
- ("k2" "" "Second Parent")
- ("k38921" "" "根目录添加测试")
- ("k3" "" "Third Parent")
- ("k4" "" "Fourth Parent")
复制代码
因为我写的是自用非商业性程序,所以数据文件也是很简单
的纯文本格式,直接记录了lisp的表,读写的时候很省事。
其中:
第一项是item自身的key值
第二项是item父节点的key值,若是根节点则为空字符
第三项是item的文字描述
思路二:读取并填充treeview控件
- (defun fill_tree (/ x lst1 lst_str)
- ;读取上述数据文件,每组数据为一项组成字符串列表
- (if (setq lst_str (QAEC_GETINI "eac.dat" "Tree_DATA"))
-
- (progn
- ;把每组数据由字符串转换为表逐项添加
- (foreach x lst_str
- (setq lst1 (read x))
- (if (= (cadr lst1) "")
- ;处理根节点的情况
- (Odcl_Tree_AddParent eac_EACMain_EACTree
- (nth 2 lst1)
- (nth 0 lst1)
- 0
- 2
- 1)
- ;处理子节点的情况
- (Odcl_Tree_AddChild eac_EACMain_EACTree
- (nth 1 lst1)
- (nth 2 lst1)
- (nth 0 lst1)
- 0
- 2
- 1)
- );if
- );foreach
- );progn
- (alert "Can't load tree data")
- );if
- );end
思路三:保存treeview控件的数据
把每个节点的key值、描述文字、父节点的key值这三个数据求出来,
并把所有这些数据组成一个表,再把表按照上述数据文件的格式记录
在文件里,就可以达到保存treeview控件数据的目的。
关键是历遍所有节点生成数据表,下面是我写的这个功能的函数:
(注意,返回的表是倒序的)
- ;;;获取指定ODCL的treeview控件文字和key属性以表格返回
- ;;;Key属性不能有重复
- (defun QAEC_ODCL_Tree_GetList (odcl_ctrl / k1 k2 str1
- odcl_tree_chkchild lst_tree_dat)
- ;;;递归寻找子节点数据的子函数
- (defun odcl_tree_chkchild (key_in / kk1 kk2 str1)
- (Setq kk1 (Odcl_Tree_GetFirstChildItem odcl_ctrl Key_in))
- (if (and kk1 (/= kk1 ""))
- (progn
- (Setq str1 (Odcl_Tree_GetItemText odcl_ctrl kk1))
- (setq lst_tree_dat (cons (list kk1 key_in str1) lst_tree_dat))
- (odcl_tree_chkchild kk1)
- (while (Setq kk2 (Odcl_Tree_GetNextSiblingItem odcl_ctrl kk1))
- (if (/= kk2 "")(progn
- (Setq str1 (Odcl_Tree_GetItemText odcl_ctrl kk2))
- (setq lst_tree_dat (cons (list kk2 key_in str1) lst_tree_dat))
- (odcl_tree_chkchild kk2)
- ));if
- (setq kk1 kk2)
- );while
- );progn
- );if
- );end
-
- (Setq k1 (Odcl_Tree_GetRootItem odcl_ctrl))
- (Setq str1 (Odcl_Tree_GetItemText odcl_ctrl k1))
- (setq lst_tree_dat (cons (list k1 "" str1) lst_tree_dat))
- (odcl_tree_chkchild k1)
-
- (while (Setq k2 (Odcl_Tree_GetNextSiblingItem odcl_ctrl k1))
- (if (/= k2 "")(progn
- (Setq str1 (Odcl_Tree_GetItemText odcl_ctrl k2))
- (setq lst_tree_dat (cons (list k2 "" str1) lst_tree_dat))
- (odcl_tree_chkchild k2)
- ));if
- (setq k1 k2)
- );while
-
- lst_tree_dat
- );end
|