Witam forumowiczów,
Odwieczny temat rzeka, czyli rekurencja. Czy jakaś dobra duszyczka pomoże ogarnąć i podpowie, jak dobrze napisać funkcję w rekurencji? Mam tabelę, elementów, które zawierają id swojego rodzica. Chcę je umieścić w komponencie TTreeView. Zacząłem budować funkcję, ale się zaciąłem i nie wiem jak pociągnąć. Podpowie ktoś?
Moja funkcja:
function TForm1.getTree(parentId: Integer = 0; destNode: string = ''): string;
var
i: integer;
dNode: TTreeNode;
begin
db.dbQuery.Active := False;
db.dbQuery.SQL.Text := 'SELECT * FROM EDI_TplElements WHERE element_parent_id = ' + IntToStr(parentId);
db.dbQuery.Active := True;
for i := 0 to db.dbQuery.RecordCount - 1 do
begin
dNode := FindRootNode(destNode, TreeView1);
if dNode <> nil then
begin
TreeView1.Items.Add(dNode, db.dbQuery.FieldByName('element_name').AsString);
end else
begin
TreeView1.Items.Add(nil, db.dbQuery.FieldByName('element_name').AsString);
end;
end;
end;
A funkcja FindRootNode wygląda tak:
function FindRootNode(ACaption: String; ATreeView: TTreeView): TTreeNode;
var LCount: Integer;
begin
result := nil;
LCount := 0;
while (LCount < ATreeView.Items.Count) and (result = nil) do
begin
if (ATreeView.Items.Item[LCount].Text = ACaption) and (ATreeView.Items.Item[LCount].Parent = nil) then
result := ATreeView.Items.Item[LCount];
inc(LCount);
end;
end;

