用遞歸方法,使用 xml 文檔生成 Treeview 樹形視圖。由于是動态生成,是以可以通過修改 xml 的邏輯來定制 Treeview 的結構,
進而實作了 xml 對 Treeview 的動态配置,而不用修改代碼。
xml 檔案如下:
<?xml version=”1.0″ encoding=”gb2312″?>
<root topic=”頻道清單” catalog=”none”>
<channel topic=”作業系統” catalog=”none”>
<channel topic=”Windows頻道” catalog=”windows” />
<channel topic=”DOS頻道” catalog=”dos” />
<channel topic=”Linux” catalog=”linux” />
</channel>
<channel topic=”菜鳥專區” catalog=”cainiaozhuanqu” />
<channel topic=”應用軟體” catalog=”app” />
<channel topic=”安全專區” catalog=”safe” />
<channel topic=”代碼實驗室” catalog=”lab” />
<BBS topic=”電腦學習社群” catalog=”none”>
<subBBS topic=”子社群-1″ catalog=”sub1″ />
<subBBS topic=”子社群-2″ catalog=”sub2″ />
</BBS>
</root>
程式代碼如下:
unit tree_xml;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs, ComCtrls, StdCtrls, XMLDoc, XMLIntf;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Memo1: TMemo;
Button1: TButton;
procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1Click(Sender: TObject);
private
procedure CreateTreeview(XmlNode: IXMLNode; TreeNode: TTreeNode);
{ Private declarations }
public
{ Public declarations }
end;
pRec = ^TData;
TData = record
sCatalog: string;
sReserved: String
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CreateTreeview(XmlNode: IXMLNode; TreeNode: TTreeNode);
i: integer;
ParentTreeNode, CurrentTreeNode: TTreeNode;
pData: pRec;
begin
New(pData);
pData^.sCatalog := XmlNode.AttributeNodes[’catalog’].NodeValue;
CurrentTreeNode := TreeView1.Items.AddChildObject(TreeNode,
XmlNode.AttributeNodes[’topic’].NodeValue, pData); //pointer(…)
if XmlNode.HasChildNodes then
begin
ParentTreeNode := CurrentTreeNode;
for i:=0 to XmlNode.ChildNodes.Count-1 do
begin
CreateTreeview(XmlNode.ChildNodes[i], ParentTreeNode);
end;
end;
{——————————————————————}
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var pData: pRec;
pData := Treeview1.Selected.Data;
Memo1.Lines.Add(pData^.sCatalog);
procedure TForm1.Button1Click(Sender: TObject);
oXml: TXMLDocument;
oXml := TXMLDocument.Create(self);
oXml.FileName := ‘_Treeview.xml’;
oXml.Active:=true;
CreateTreeview(oXml.ChildNodes.FindNode(’root’), Treeview1.Items.GetFirstNode);
Treeview1.FullExpand; //節點全部展開
oXml.Free;
end.
注意程式中 Treeview 的 TreeView1.Items.AddChildObject 方法,其最後一個參數用來儲存該節點的相關資料,是一個指針類型的資料,使用時要格外小心。本例中,先定義一個記錄類型,再定義一個指針指向它,然後作為 AddChildObject 的最後一個參數。記錄類型可以儲存節點的很多相關參數,本例中隻用到了一個,實際使用時可以任意擴充。
本文轉自網眼51CTO部落格,原文連結:http://blog.51cto.com/itwatch/286535,如需轉載請自行聯系原作者