天天看點

Delphi 中用 Xml 配置文檔生成 Treeview

用遞歸方法,使用 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,如需轉載請自行聯系原作者

繼續閱讀