Witam,
Mam taki problem, o którym pisano już nie raz. Otóż muszę wygrnerować drzewo z Itemów z bazy danych w TreeView.
W bazie mam następujące dane:
id_kat, id_korzenia, nazwa. Kod, który napisałem do robienia tego wygląda następująco:
procedure TForm1.BudujDrzewoKategorii(Sender: TObject);
var
i,j:integer;
TreeViewer: TTreeView;
begin
TreeViewer:=(Sender as TTreeView);
TreeViewer.Items.Clear;
QueryKat.SQL.Clear;
QueryKat.SQL.Add('select * from kategorie order by id_korzenia, id_kat');
QueryKat.Open;
QueryKat.Tag:=Max(QueryKat.RowsAffected,QueryKat.RecordCount);
Kategorie:=nil;
SetLength(Kategorie,QueryKat.Tag);
if QueryKat.Tag>0 then
begin
for i:=0 to QueryKat.Tag-1 do
begin
Kategorie[i]:=QueryKat.FieldByName('id_kat').AsInteger;
if QueryKat.FieldByName('id_korzenia').AsInteger=0 then
begin
TreeViewer.Items.Add(nil,QueryKat.FieldByName('nazwa').AsString);
end
else
begin
for j:=0 to Length(Kategorie)-1 do
begin
if Kategorie[j]=QueryKat.FieldByName('id_korzenia').AsInteger then
TreeViewer.Items.AddChild(TreeViewer.Items[j],QueryKat.FieldByName('nazwa').AsString);
end;
end;
QueryKat.Next;
end;
end;
end;
Gdzie Kategorie[] to globalna tablica w której przechowuję id_kat i-tego węzła w drzewie.
No i problem polega na tym, że jeśli w bazie wszystko jest po kolei to ładnie śmiga, ale problem zaczyna się w momencie kiedy w bazie najpierw jest child który ma parenta dodanego później. Wtedy po prostu takie dane liście nie są dodawane. (To jest zresztą logiczne na podstawie kodu). Wiem, że rozwiązaniem jest tutaj rekurencja ale od dwóch dni się z nią męczę i nie mogę dojść do strzału. Czy ktoś może mi podpowiedzieć jak to zrobić rekurencyjnie?
Pozdrawiam i dziękuję za pomoc.