复制代码代码如下:
Einheit Einheit1;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Varianten, Klassen, Grafiken, Steuerelemente, Formulare,
Dialoge, StdCtrls, ComCtrls, DB, ADODB;
Typ
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = Gepackter Datensatz
NodeID: Ganzzahl;
ParentID: Ganzzahl;
NodeType: Ganzzahl;
ChnNodeTitle: String;
ImageIndex: SmallInt;
SelectedIndex: SmallInt;
Ende;
TForm1 = Klasse(TForm)
tv1: TTreeView;
btn1: TButton;
qry1: TADOQuery;
procedure btn1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
Privat
{Private Erklärungen}
function StaticBuildTree(TreeView:TTreeView ):Boolean;
Funktion AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
function FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
öffentlich
{Öffentliche Erklärungen}
Ende;
var
Form1: TForm1;
Durchführung
{$R *.dfm}
function TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;
var
AddNodeInfo : PNodeInfoEx;
beginnen
Ergebnis := Falsch;
qry1.LoadFromFile('c:/AdminixTree.xml');//这里以XML文件做为数据源
Treeview.Items.BeginUpdate;//记住:在进行批量添加数据时要使用BeginUpdate,来暂时关闭由于添加数据而触发的某些事件(如OnChange事件等)
Treeview.Items.Clear;//Treeview anzeigen
versuchen
versuchen
wenn qry1.RecordCount >0 dann
beginnen
qry1.First;
while Nicht qry1.Eof do
beginnen
New(AddNodeInfo) ;//生成结构体
AddNodeInfo^.NodeID := qry1.FieldByName('NODE_ID').AsInteger;
AddNodeInfo^.ParentID := qry1.FieldByName('PARENT_ID').AsInteger;
AddNodeInfo^.NodeType := qry1.FieldByName('NodeType').AsInteger;
AddNodeInfo^.ChnNodeTitle := qry1.FieldByName('ChnNodeTitle').AsString;
AddNodeInfo^.ImageIndex := qry1.FieldByName('ImageIndex').AsInteger;
AddNodeInfo^.SelectedIndex := qry1.FieldByName('SelectedIndex').AsInteger;
AddTreeItem(Treeview,AddNodeInfo);//Eine neue Struktur für Treeview
qry1.Next;
Ende;
Ende;
außer
Application.MessageBox('生成树结点失败',MB_ICONSTOP+MB_OK);
erhöhen;//向上级抛异常
Ende;
qry1.Close;
Ergebnis := True;
Endlich
Treeview.Items.EndUpdate;
Ende;
Ende;
//在加入结点时,应先判断加入的是父结点还是子结点,判断的依据是在已存在的树结点中是否存在该结点的ParentID
Funktion TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
var
ParentNode: TTreeNode;
beginnen
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
Wenn ParentNode <> Null, dann
Ergebnis := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo))
anders
Ergebnis := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
wenn Ergebnis<>nil dann
beginnen
Result.ImageIndex := AddNodeInfo.ImageIndex;
Result.SelectedIndex := AddNodeInfo.SelectedIndex;
Ende;
Ende;
//这里是判断是否存在其父结点
Funktion TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
var
i: Ganzzahl;
beginnen
Ergebnis := null;
for i := 0 to Treeview.Items.Count-1 do
beginnen
wenn CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID dann
beginnen
Ergebnis := Treeview.Items[i];
Ausfahrt;
Ende;
Ende;
Ende;
//生成树结构
procedure TForm1.btn1Click(Sender: TObject);
beginnen
StaticBuildTree (tv1)
Ende;
//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dis Pose时为什么要进行强制转型后释放,以前有专门的讲解,在此不在累述
procedure TForm1.FormDestroy(Sender: TObject);
var
i: Ganzzahl;
beginnen
for i := 0 to tv1.Items.Count-1 do
beginnen
Dispose( PNodeInfoEx(tv1.Items[i].Data) )
Ende;
Ende;
Ende.
复制代码代码如下:
//如何访问树结点?
procedure TForm1.tv1MouseDown(Sender: TObject; Button: TMouseButton;
Schicht: TShiftState; X, Y: Ganzzahl);
var
pNode:TTreeNode;
beginnen
pNode:=tv1.GetNodeAt(x,y);
if (pNode<>nil) und (Button=mbleft) then
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
Ende;