[Delphi] TVirtualStringTree i Budowa Drzewka

0

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
  • Header2

    • Kategoria3
      • Pod Kategoria
  • Header3

    • Kategoria4
      • Pod Kategoria
      • Pod Kategoria
      • Pod Kategoria
      • Pod Kategoria
    • Kategoria5

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

0

Naprawde nikt nie potrafi mi pomoc ??

0

Poszukaj na google

0
ziomalski napisał(a)

Poszukaj na google

Pytalem google i mowi ze nie wie

1 użytkowników online, w tym zalogowanych: 0, gości: 1