procedure DataSetToTreeView(DataSet: TDataSet; var TreeView: TTreeView; NodeRoot: string); var Nodes: array of TTreeNode; Strs: array of string; i: integer; begin //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ with DataSet do begin Close; Open; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SetLength(Nodes, FieldCount+1); SetLength(Strs, FieldCount); Nodes[0] := TreeView.Items.AddChild(nil, NodeRoot); for i:=Low(Strs) to High(Strs) do Strs[i] := #255; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ First; while not Eof do begin for i:=Low(Strs) to High(Strs) do if Strs[i]<>Fields[i].AsString then begin Strs[i] := Fields[i].AsString; Nodes[i+1] := TreeView.Items.AddChild(Nodes[i],Fields[i].AsString); end; Next; end; Close; end; end;
我程序里的一段,和数据库关联,你自己研究一下吧:procedure TMDIChild.LoadTreeView; var strsql,tid:string; begin try
DataModule3.ADOTable3.open; DataModule3.ADOTable3.Locate('DTname',RzComboBox1.Text,[lopartialkey]); tid:=inttostr(DataModule3.ADOTable3.FieldByName('id').value); strsql:='select * from T where TypeID='+tid; DQ.Active :=false; DQ.SQL.Clear ; DQ.SQL.Add(strsql); DQ.Active :=true; DQ.Filtered :=true; DQ.Filter := 'Parent=0'; U_DiGui(0,RzTreeView1.TopItem );//´Óµ±Ç°0²ã¿ªÊ¼µÝ¹é½¨Ê÷ except showmessage('×ÖµäÀïûÓÐÊý¾Ý£¡'); end; end; procedure TMDIChild.U_DiGui(parentID:Cardinal;ParentNode:TTreeNode); var tmpTBData:array of TableData; i,j:integer; tmpNode:TTreeNode;begin RzProgressBar.TotalParts :=DQ.RecordCount; RzProgressBar.PartsComplete :=0; j:=DQ.RecordCount; setlength(tmpTBData,j);//±£´æµÝ¹æÉÏÒ»²ã½áµãÖµ for i:=0 to j-1 do begin tmpTBData[i].ID := Cardinal(DQ.fieldbyname('ID').value); tmpTBData[i].Name := DQ.fieldbyname('Name').value; tmpTBData[i].ParentID := Cardinal(DQ.fieldbyname('Parent').value); DQ.Next; end; for i:=0 to j-1 do begin //µÝ¹æµ÷Óý¨Á¢ËùÓнáµã tmpNode:=RzTreeView1.Items.AddChild(ParentNode,tmpTBData[i].Name); RzProgressBar.PartsComplete:=RzProgressBar.PartsComplete+1; // tmpNode.ImageIndex:=2; new(pData); pData^.ID:=tmpTBData[i].ID; tmpNode.Data:=pData; DQ.Filter := 'Parent=' + IntToStr(Integer(tmpTBData[i].ID)); if DQ.RecordCount >0 then begin U_DiGui(tmpTBData[i].ID,tmpNode ); end; end; end;
var Nodes: array of TTreeNode;
Strs: array of string;
i: integer;
begin
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
with DataSet do
begin
Close;
Open;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SetLength(Nodes, FieldCount+1);
SetLength(Strs, FieldCount);
Nodes[0] := TreeView.Items.AddChild(nil, NodeRoot);
for i:=Low(Strs) to High(Strs) do Strs[i] := #255;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
First;
while not Eof do
begin
for i:=Low(Strs) to High(Strs) do
if Strs[i]<>Fields[i].AsString then
begin
Strs[i] := Fields[i].AsString;
Nodes[i+1] := TreeView.Items.AddChild(Nodes[i],Fields[i].AsString);
end;
Next;
end;
Close;
end;
end;
var
strsql,tid:string;
begin
try
DataModule3.ADOTable3.open;
DataModule3.ADOTable3.Locate('DTname',RzComboBox1.Text,[lopartialkey]);
tid:=inttostr(DataModule3.ADOTable3.FieldByName('id').value);
strsql:='select * from T where TypeID='+tid;
DQ.Active :=false;
DQ.SQL.Clear ;
DQ.SQL.Add(strsql);
DQ.Active :=true;
DQ.Filtered :=true;
DQ.Filter := 'Parent=0';
U_DiGui(0,RzTreeView1.TopItem );//´Óµ±Ç°0²ã¿ªÊ¼µÝ¹é½¨Ê÷
except
showmessage('×ÖµäÀïûÓÐÊý¾Ý£¡');
end;
end;
procedure TMDIChild.U_DiGui(parentID:Cardinal;ParentNode:TTreeNode);
var
tmpTBData:array of TableData;
i,j:integer;
tmpNode:TTreeNode;begin
RzProgressBar.TotalParts :=DQ.RecordCount;
RzProgressBar.PartsComplete :=0;
j:=DQ.RecordCount;
setlength(tmpTBData,j);//±£´æµÝ¹æÉÏÒ»²ã½áµãÖµ
for i:=0 to j-1 do begin
tmpTBData[i].ID := Cardinal(DQ.fieldbyname('ID').value);
tmpTBData[i].Name := DQ.fieldbyname('Name').value;
tmpTBData[i].ParentID := Cardinal(DQ.fieldbyname('Parent').value);
DQ.Next;
end;
for i:=0 to j-1 do begin //µÝ¹æµ÷Óý¨Á¢ËùÓнáµã
tmpNode:=RzTreeView1.Items.AddChild(ParentNode,tmpTBData[i].Name);
RzProgressBar.PartsComplete:=RzProgressBar.PartsComplete+1;
// tmpNode.ImageIndex:=2;
new(pData);
pData^.ID:=tmpTBData[i].ID;
tmpNode.Data:=pData;
DQ.Filter := 'Parent=' + IntToStr(Integer(tmpTBData[i].ID));
if DQ.RecordCount >0 then begin
U_DiGui(tmpTBData[i].ID,tmpNode );
end;
end;
end;