Witam,
mecze sie juz 2 tydodnie z tym i nie udalo mi sie nic wymyslec, prosze o szybka pomoc.
Potrzebuje zbudowac drzewko na podstawie danych pobranych z bazy sql.
A teraz jak to ma wygladac. Mam record
PCategoria = ^TCategoria;
TCategoria = packed record
Next: PCategoria;
id: Integer;
nombre: String[150];
id_parent: Integer;
visible: String[1];
orden: Integer;
nivel: Integer;
W sekcji OnCreate Formy pobieram dane z bazy sql w ten sposob:
if not data.checkConnect then Exit;
data.ZQuery_Categoria.Active:= False;
data.ZQuery_Categoria.SQL.Clear;
data.ZQuery_Categoria.SQL.Add('SELECT * FROM mlab_categorias ORDER BY id ASC');
data.ZQuery_Categoria.ParamByName('nivel').AsInteger:= 0;
data.ZQuery_Categoria.Active:= True;
data.ZQuery_Categoria.First;
if not data.ZQuery_Categoria.IsEmpty then begin
FAC.VST1.BeginUpdate;
FAC.VST1.Clear;
FAC.VST1.NodeDataSize:= SizeOf(TCategoria);
FAC.VST1.RootNodeCount:= GetMyHeaderCount; //data.ZQuery_Categoria.RecordCount;
FAC.VST1.EndUpdate;
end;
Zapytanie sql zawiera powiedzmy 20 rekordow (ilosc ta moze sie zmieniac) dlatego napisalem sobie 2ga funkcje "GetMyHeaderCount" ktora zwraca mi licznik tylko ilosci naglowkow poniewaz "data.ZQuery_Categoria.RecordCount" budowala mi 20 glownych Nod-ow, a jest ich tylko 3 w zapytaniu reszta to ChildNode, uklad wyglada tak:
-
3 to Header czyli glowny Node
-
5 to Kategoria (ChildNode)
-
12 to pod Kategorie
Wyglada to tak: -
Header1
-
Kategoria1
- Pod Kategoria
- Pod Kategoria
- Pod Kategoria
- Pod Kategoria
- Pod Kategoria
- Pod Kategoria
- Pod Kategoria
- Kategoria2
-
Kategoria1
-
Header2
-
Kategoria3
- Pod Kategoria
-
Kategoria3
-
Header3
-
Kategoria4
- Pod Kategoria
- Pod Kategoria
- Pod Kategoria
- Pod Kategoria
- Kategoria5
-
Kategoria4
w OnInitNode przypisalem dane z zapytania sql do rekordu:
var
Level: Integer;
data_Categoria: PCategoria;
begin
if not data.checkConnect then Exit;
data_Categoria:= Sender.GetNodeData(Node);
//Initialize(data_Encabeza^);
data_Categoria^.id:= data.ZQuery_Categoria.FieldValues['id'];
data_Categoria^.nombre:= data.ZQuery_Categoria.FieldValues['nombre'];
data_Categoria^.id_parent:= data.ZQuery_Categoria.FieldValues['id_parent'];
data_Categoria^.visible:= data.ZQuery_Categoria.FieldValues['visible'];
data_Categoria^.orden:= data.ZQuery_Categoria.FieldValues['orden'];
data_Categoria^.nivel:= data.ZQuery_Categoria.FieldValues['nivel'];
if not data.ZQuery_Categoria.Eof then data.ZQuery_Categoria.Next;
Level := Sender.GetNodeLevel(Node);
if Level < 2 then
Include(InitialStates, ivsHasChildren);
if Level > 0 then
Node.CheckType := TCheckType(Level)
else
Node.CheckType := ctTriStateCheckBox;
-
wartosc "nivel" okresla na jakim poziomie jest rekord jezeli:
0: to Header
1: to Kategoria
2: to pod Kategoria -
wartosc "id_parent" okresla przynaleznosc do konkretnego naglowka czy kategorii, jezeli Header to id_parent = 0, a jezeli pod kategoria czy kategoria to id_parent zawiera wartosc id rodzica do ktorego nalezy.
w GetText probowalem posluzyc sie czyms takim, ale nie udalo mi sie osiagnac planowanego wyniku:
var
Level: Integer;
data_Categoria: PCategoria;
begin
data_Categoria:= Sender.GetNodeData(Node);
Level := Sender.GetNodeLevel(Node);
if Node.Parent = Sender.RootNode then begin
CellText:= data_Categoria^.nombre; // Tutaj mamy Header
end else begin // Tutaj tworzymy Kategorie i pod Kategorie
if Level=1 then begin
end;
if Level=2 then begin
end;
end;
Nie wiem czy udalo mi sie wytlumaczyc zrozumiale , ale mam nadzieje ze uda Wam sie mi jak najszybciej pomoc rozwiazac ten problem ,
Pozdrawiam