关于viewtree请指点迷津!(100分)

  • 主题发起人 主题发起人 问题猫
  • 开始时间 开始时间

问题猫

Unregistered / Unconfirmed
GUEST, unregistred user!
我建了一个表,里面包含:学号、姓名、专业、班级、···等属性。
我想在程序初始化时动态的建立一个树状列表,一专业为第一层,班级为第二层。
请高手指点!
 
var
CNode:TTreeNode;

with Tree do begin
CNode:=Items.AddChild(...,...);
Items.AddChild(CNode,...);


 
比如:
001计算机专业
001001计算机一班
001002计算机二班
002电子专业
002001电子一班
……
以下两个过程是我很久以前用来建立树图的,供你参考:
你只需在from的Create事件中加入代码
begin
Init;
end;
procedure TfmFeeList.Init;
var __Item:TTreeNode;
__c:array[0..20] of Char;
__Add:string;
begin
TreeView.Items.Clear;
With tbTree do begin
First;
while not Eof do begin
__Add := FieldByName('sNo').AsString;
StrPCopy(__c,__Add);
__Add := FieldByName('sName').AsString;
__Item:=TreeView.Items.Add(nil,__Add);
ChapterAddChild(__Item,__c); //再识别子集
end;
end;
end;

procedure TfmFeeList.ChapterAddChild(_SelfItem:TTreeNode;_Self:PChar);
var _c,_s:array[0..20] of Char;
_i:integer;
_Item:TTreeNode;
_Add:string;
begin
With tbTree do
begin
Next;
_i := StrLen(_Self);
while not Eof do
begin
_Add := FieldByName('sNo').AsString;
StrPCopy(_c,_Add);
if (StrLIComp(_c,_Self,_i) = 0) then
begin //是子集
_Add := _Add + '-' + FieldByName('sName').AsString;
_Item:=TreeView.Items.AddChild(_SelfItem,_Add);
ChapterAddChild(_Item,_c); //再识别子集
end
else break;
end;
if not Eof then
begin
StrPCopy(_c,FieldByName('sNo').AsString);
StrPCopy(_s,StrRScan(_Self,'.'));
if StrLIComp(_c,_Self,_i-Length(_s)) = 0 then
begin //是兄弟
_Add := FieldByName('sNo').AsString + '-' + FieldByName('sName').AsString;
_Item:=TreeView.Items.Add(_SelfItem,_Add);
ChapterAddChild(_Item,_c); //再识别子集
end;
end;
end;
end;

 
多谢sundart兄指点,
在你程序的启示下,我编写了如下程序成功完成了树型列表的建立,
程序如下:
还请大哥多多指点,看小弟的程序是否有不足之处!!

procedure TMainoForm.FormCreate(Sender: TObject);
var
__Node:array[0..30] of TTreeNode;
__c: array[0..30] of String;
i,j:integer;
begin
MainGrid.Refresh;
{*************************建立学生树型列表***********************************}
i:=0;
j:=0;
With StuQuery do
begin
Close;
SQL.Clear;
SQL.Add('select distinct zy from "student.db"');
SQL.Add('as one');
Open;

while not Eof do
begin
__c:= fieldbyname('zy').AsString;
If i<30 then
i:=i+1
else
showmessage('The c of array is not enough !');
next;
end;

while j<i do
begin
__Node[j]:=TreeView1.Items.Add(nil,__c[j]);
Close;
SQL.Clear;
SQL.Add('select distinct bj from "student.db"');
SQL.Add('Where zy ='''+__c[j]+'''');
Open;
While not EOF do
begin
TreeView1.Items.AddChild(__Node[j],StuQuery.fieldbyname('bj').AsString);
next;
end;
j:=j+1;
end;
end;
 
后退
顶部