Type
Pdepdata=^depdata;
Depdata = Record
Id:integer;
depid:string;
depname:string;
End
Procedure FreeTV (Tv:ttreeview);
Var
I:integer;
Begin
For I: = 0 to TV. Items.count-1 do
Begin
Dispose (TV. Items[i]. Data);
End
Tv. Items.clear;
End
Procedure Loadtree (Tv:ttreeview; dst:tdataset);
function Getnodedata:pdepdata;
Begin
New (result);
With result^ do begin
ID: = DST. Fieldbyname (' ID '). Asinteger;
Depid: = DST. Fieldbyname (' Depid '). asstring;
Depname: = DST. Fieldbyname (' Depname '). asstring;
End
End
Var
ParentNode, Newnode:ttreenode;
P:pdepdata;
Found:boolean;
I:integer;
Begin
FREETV (TV); Release tree view
Dst. First;
ParentNode: = nil;
While not DST. Eof DO begin
P: = Getnodedata;
Found: = false;
For I: = TV. Items.count-1 Downto 0 DO begin//Find parent node
If POS (PDEPDATA (TV. Items[i]. Data). Depid, p.depid) = 1 THEN BEGIN
ParentNode: = TV. Items[i];
Found: = true;
Break
End
End
If not found then BEGIN//No parent node found, added to root
ParentNode: = TV. Items.Add (nil, p.depname);
Parentnode.data: = P;
End else//Find parent node, add to parent node
Tv. Items.addchild (ParentNode, P.depname). Data: = P;
Dst. Next;
End
End
Procedure Tform1.button1click (Sender:tobject);
Var
t:cardinal;
Begin
T: = GetTickCount;
Loadtree (TV, MyQuery1);
T: = gettickcount-t;
Caption: = IntToStr (t);
End
Tree-based construction of a DataSet (TreeView & DataSet) method one