这是一个窗体中加载树的完整代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
TreeView1: TTreeView;
Button1: TButton;
ADOQuery1: TADOQuery;
ADOConnection1: TADOConnection;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FParentList:TStringList;
FChildList:TStringList;
{ Private declarations }
procedure DropTemp;
procedure OpenEmpData;
procedure MakeTree;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DropTemp;
begin
with ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('drop table #Temp ');
try
ExecSQL;
except
end;
end;
end;
procedure TForm1.OpenEmpData;
begin
with ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('declare @Level int ');
Sql.Add('declare @WorkCount int ');
Sql.Add(' ');
Sql.Add('set @Level=1 ');
Sql.Add(' ');
Sql.Add('select @Level C001, sal_no C002, up_sal_no C003 into #temp from salm where up_sal_no is null ');
Sql.Add(' or up_sal_no = '''' ');
Sql.Add(' ');
Sql.Add('Select @WorkCount = count(*) from #temp ');
Sql.Add(' ');
Sql.Add('while @WorkCount > 0 ');
Sql.Add('begin ');
Sql.Add(' set @Level=@Level + 1 ');
Sql.Add(' ');
Sql.Add(' insert into #temp ');
Sql.Add(' select @Level, b.sal_no, b.up_sal_no ');
Sql.Add(' from #temp a inner join salm b on a.C002 = B.up_sal_no ');
Sql.Add(' where a.c001 = @level-1 ');
Sql.Add(' ');
Sql.Add(' Select @WorkCount = count(*) from #temp where C001 = @Level ');
Sql.Add(' ');
Sql.Add('end ');
Sql.Add(' ');
Sql.Add('select ');
Sql.Add(' A.C001, B.SAL_NO, B.NAME, A.C003 ');
Sql.Add('from #temp A Inner Join SALM B ');
Sql.Add('on A.C002 = B.SAL_NO ');
Sql.Add('order by 1,2 ');
Open;
end;
end;
procedure TForm1.MakeTree;
var
PTreeNode: TTreeNode;
CTreeNode: TTreeNode;
iLevel : Integer;
begin
with TreeView1.Items do
begin
Clear;
FParentList.Clear;
FChildList.Clear;
PTreeNode := Add(nil, 'Root'); // Create Root
FParentList.AddObject('',PTreeNode);
iLevel := 1;
with ADOQuery1 do
while not Eof do
begin
if iLevel <> FieldByName('C001').AsInteger then
begin
FParentList.Clear;
FParentList.Assign(FChildList);
FChildList.Clear;
iLevel := iLevel + 1;
end;
PTreeNode :=
TTreeNode(FParentList.Objects[FParentList.IndexOf(FieldByName('C003').AsString)]);
if ASSigned(PTreeNode) then
begin
CTreeNode := AddChild(PTreeNode, FieldByName('SAL_NO').AsString +' '+FieldByName('NAME').AsString);
FChildList.AddObject(FieldByName('SAL_NO').AsString, CTreeNode);
end;
Next;
end;
end;
//TreeView1.FullExpand ;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DropTemp;
OpenEmpData;
MakeTree;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FParentList:=TStringList.Create ;
FChildList:=TStringList.Create ;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FParentList.Free;
FChildList.Free;
end;
end.