delphittreenode递归地将子节点追加到父节点
我有一个项目管理的任务。我必须分配模块,这些模块也可以是子模块,所以我想递归地将子模块附加到模块中 例如: 项目模块M1、M2、M3、M4。在M1模块下会有子模块M1S1、M1S2、M1S3,在子模块M1S1下会有许多子模块M1S1S1、M1S1S2、M1S1S3等等 我已经使用递归和TTreeNode编写了这段代码,但我觉得问题在于条件语句delphittreenode递归地将子节点追加到父节点,delphi,recursion,ttreenodes,Delphi,Recursion,Ttreenodes,我有一个项目管理的任务。我必须分配模块,这些模块也可以是子模块,所以我想递归地将子模块附加到模块中 例如: 项目模块M1、M2、M3、M4。在M1模块下会有子模块M1S1、M1S2、M1S3,在子模块M1S1下会有许多子模块M1S1S1、M1S1S2、M1S1S3等等 我已经使用递归和TTreeNode编写了这段代码,但我觉得问题在于条件语句 procedure TForm2.BitBtn1Click(Sender: TObject); begin lGlblProjID := 1; lGl
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
lGlblProjID := 1;
lGlblProjName := 'Project';
ADOConnectionListner.Connected := true;
try
if ADOConnectionListner.Connected then
begin
RootNode := TreeView2.Items.Add(nil, lGlblProjName);
getSubChild(lGlblProjID, RootNode);
end;
except
on E: Exception do
begin
ShowMessage('Exception Class = ' + E.ClassName);
end;
end;
end;
procedure TForm2.getSubChild(var Pid: Integer; var SubRoot: TTreeNode);
var
lcount, I, lcurrentID: Integer;
lcurrentName: String;
lModuleNode: TTreeNode;
begin
// ShowMessage(IntToStr(Pid)+ ' '+SubRoot.Text);
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM treetab Where parent_id =:value1');
ADOQuery1.Parameters.ParamByName('value1').Value := Pid;
ADOQuery1.Active := true;
lcount := ADOQuery1.RecordCount;
for I := 0 to lcount - 1 do
begin
lcurrentID := ADOQuery1.FieldByName('id').AsInteger;
lcurrentName := ADOQuery1.FieldByName('name').AsString;
ShowMessage(' id ' + IntToStr(lcurrentID) + ' dd ' + lcurrentName); // print valu of i
if ((lcurrentID <> 0)and (SubRoot.Text <> '') ) then //or
begin
lModuleNode := TreeView1.Items.AddChild(SubRoot, lcurrentName);
getSubChild(lcurrentID, lModuleNode);
end else // if
// lcurrentID = 0
ShowMessage('end reached');
// TreeView1.Items.AddChild(SubRoot, ADOQuery1.FieldByName('name').AsString);
ADOQuery1.Next;
//*********
end;
end;
我想检索一个特定项目的所有子模块,如本例中的仅id=1的项目。您的问题似乎是非本地ADOQuery1,它在每次递归调用的入口处被清除。因此,您丢失了以前查询中的所有剩余记录。您应该为查询结果安排本地存储 类似于未经测试:
procedure GetSubChild()
type
TTempRecord = record
id: integer;
name: string;
end;
TTempArray = array of TTempRecord;
var
lcount, I, lcurrentID: Integer;
lcurrentName: String;
lModuleNode: TTreeNode;
recs: TTempArray
begin
// ...
// query the db
// ...
lcount := ADOQuery1.RecordCount;
SetLength(recs, lcount);
for i := 0 to lcount-1 do
begin
recs[i].id := ADOQuery1.FieldByName('id').AsInteger;
recs[i].name := ADOQuery1.FieldByName('name').AsString;
ADOQuery1.Next;
end;
for i := 0 to lcount-1 do
begin
lcurrentID := recs[i].id;
lcurrentname := recs[i].name;
// ...
// add to treeview
// call recursively GetSubChild()
// ...
end;
end;
什么条件语句你说你有一个问题,你有什么担心它是错误的?考虑在SSP下有1以上的记录说S1,然后因为它的最后一个叶SQL返回零,树是建立了一半只有P1-SP - SSP - S1,然后树断裂。因为你提到的代码没有测试。我已经测试过了,效果很好。谢谢。@很高兴我能帮上忙!