TreeView和XML
来源:互联网 发布:linux中文横着显示 编辑:程序博客网 时间:2024/06/05 06:42
本文将教您怎样保存树目录到XML文件及怎样从XML文档重建一个树型目录.
如果您需要一个强大、易传输的格式来保存应用程序的配置, 使用TreeView与XML是一个非常好的选择, 接下来请看......
保存TTreeView项目到XML
首先, 我们新建一个简单的应用程序, 并放置几个组件: 一个TTreeView组件, 两个ImageList组件及一个TXMLDocument组件. 其中的一个图像列表组件用于关联TreeView的Images属性, 另一个用于关联StateImages属性 (请参考: 如何给TreeView 添加复选框和单选按钮 ).这是程序运行时的一个截屏. Tree2XML 过程用于保存树型目录到一个XML文档. 它只有一个参数, 用于给出要保存到XML的TTreeView组件. XML文档使用与应用程序相同的文件名 (当然, 要用'.XML'作为扩展名)
该过程遍历整个TreeView, 每次都调用子过程 ProcessTreeItem. 子过程ProcessTreeItem在同一级节点中递归调用. 该递归算法确保整个TreeView的节点都被处理.
对于每个目录项, 一个XML节点 (IXMLNode) 被建立, 并带有表示Text的属性值和ImageIndex、StateIndex属性. 节点实际上保存了所有与树节点有关的值.
一旦全部树目录项被处理完毕, XML文件也被保存.
注意: 过程ProcessTreeItem被动态创建和操作 TXMLDocument (XMLDoc)组件.
procedure Tree2XML(tree: TTreeView);var tn : TTreeNode; XMLDoc : TXMLDocument; iNode : IXMLNode; procedure ProcessTreeItem( tn : TTreeNode; iNode : IXMLNode); var cNode : IXMLNode; begin if (tn = nil) then Exit; cNode := iNode.AddChild('item'); cNode.Attributes['text'] := tn.Text; cNode.Attributes['imageIndex'] := tn.ImageIndex; cNode.Attributes['stateIndex'] := tn.StateIndex; //子节点 tn := tn.getFirstChild; while tn <> nil do begin ProcessTreeItem(tn, cNode); tn := tn.getNextSibling; end; end; (*ProcessTreeItem*)begin XMLDoc := TXMLDocument.Create(nil); XMLDoc.Active := True; iNode := XMLDoc.AddChild('tree2xml'); iNode.Attributes['app'] := ParamStr(0); tn := tree.TopItem; while tn <> nil do begin ProcessTreeItem (tn, iNode); tn := tn.getNextSibling; end; XMLDoc.SaveToFile(ChangeFileExt(ParamStr(0),'.XML')); XMLDoc := nil;end; (* Tree2XML *)
实际应用中, 您可以在应用程序关闭时导出TTreeView到XML, 使用Form的OnCloseQuery 事件来询问用户是否保存:
// tree是TTreeView 组件的名字procedure TForm1.FormCloseQuery( Sender: TObject; var CanClose: Boolean);begin case MessageDlg('Save tree items to XML?', mtConfirmation, [mbYes, mbNo, mbCancel], 0) of mrYes: Tree2XML(tree); mrNo: CanClose := True; mrCancel: CanClose := False; end;end;
下面是导出XML文档的结果.
从XML装载TTreeView项目
一旦我们有了表示TreeView的XML文件, 我们就能使用它来填充TreeView了. 当应用程序启动时, XML2Tree 过程被调用来构造树目录. tree 参数表示我们要填充的TTreeView组件; XMLDoc 参数指向一个TXMLDocument组件.procedure XML2Tree( tree : TTreeView; XMLDoc : TXMLDocument);var iNode : IXMLNode; procedure ProcessNode( Node : IXMLNode; tn : TTreeNode); var cNode : IXMLNode; begin if Node = nil then Exit; with Node do begin tn := tree.Items.AddChild(tn, Attributes['text']); tn.ImageIndex := Integer(Attributes['imageIndex']); tn.StateIndex := Integer(Attributes['stateIndex']); end; cNode := Node.ChildNodes.First; while cNode <> nil do begin ProcessNode(cNode, tn); cNode := cNode.NextSibling; end; end; (*ProcessNode*)begin tree.Items.Clear; XMLDoc.FileName := ChangeFileExt(ParamStr(0),'.XML'); XMLDoc.Active := True; iNode := XMLDoc.DocumentElement.ChildNodes.First; while iNode <> nil do begin ProcessNode(iNode,nil); iNode := iNode.NextSibling; end; XMLDoc.Active := False;end;
XML2Tree 过程基本上与Tree2XML 操作原理相似. 代码遍历所有的XML节点, 创建 TTreeNode 对象并添加到 TreeView 组件.
就是这样
老实说, 在现在的项目中, 我已经很少用 Registry 或 INI files 来保存配置数据了. XML似乎更友好.- TreeView和XML
- ASP.NET中使用Treeview和XML
- 解析xml文件和使用TreeView空间
- Xml TreeView
- Treeview xml
- TreeView Xml
- 在ASP.NET中使用Treeview控件和XML
- 在ASP.NET中使用Treeview控件和XML
- 在ASP.NET中使用Treeview控件和XML
- 在ASP.NET中使用Treeview控件和XML
- 在ASP.NET中使用Treeview控件和XML
- HierarchicalDataTemplate层次模板绑定XML数据源到Menu和TreeView
- WPF中TreeView和Xml的结合使用案例
- 用XML填充TreeView
- 用.XML填充TreeView
- TreeView承载XML数据源
- XML动态加载TreeView
- 以XML 填充 TreeView
- nginx请求超长解决方案
- 表达式语法 <%$...%>
- struts1常用组件
- [iPhone高级] 基于XMPP的IOS聊天客户端程序(IOS端二)
- 开心网分成策略效果显著 中小研发者获益
- TreeView和XML
- Swing中弹出对话框的几种方式
- 排序算法
- hdu1394 Minimum Inversion Number
- GetStartupInfoTest
- I2C驱动
- dBm与mW
- 简易记事本
- java回调的应用