Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualTreeview (https://www.delphipraxis.net/34199-virtualtreeview.html)

schuetze09 19. Nov 2004 07:20


VirtualTreeview
 
Hallo,

ich möchte eine Baumstrukur mit dem VirtualTreeview aus einer DB darstellen, dazu habe ich bereits
VirtualTreeView und Baumstruktur
gelesen.bei mir übertragen und es funktioniert auch soweit ganz gut.
Leider haben ich nicht zwei "Ebenen" sondern drei. Und hier liegt mein Problem, die dritte krieg ich einfach nicht hin...

Hier mein Code:

Delphi-Quellcode:
procedure SelectWID_VST(VST: TVirtualStringTree);
var
  ADODataSet, ADODataSet_sw, ADODataSet_oc: TADODataSet;
  TreeObject: TTreeDataClass;
  Wurzel, Wurzel_oc: PVirtualNode;
  rs_sw, rs_oc: _Recordset;

function AddVSTObject(avst: TCustomVirtualStringTree; aNode: PVirtualNode; aObject: TObject): PVirtualNode;
var
  Data: PTreeData;
begin
  Result := avst.AddChild(aNode);
  avst.ValidateNode(Result, False);
  data := avst.GetNodeData(Result);
  data^.FObject := aObject;
end;

begin
  ADODataSet:= TADODataSet.Create(nil);
  ADODataSet.Connection:=DataModule_DBConnect.ADOConnection1;
  ADODataSet_sw:= TADODataSet.Create(nil);
  ADODataSet_sw.Connection:=DataModule_DBConnect.ADOConnection1;
  ADODataSet_oc:= TADODataSet.Create(nil);
  ADODataSet_oc.Connection:=DataModule_DBConnect.ADOConnection1;
  VST.BeginUpdate;
  VST.NodeDataSize:= SizeOf(TTreeData);
  VST.DeleteChildren(VST.RootNode, true);
  try
    ADODataSet.CommandText:='Select distinct(tbl_w_daten.fk_w_id), tbl_w_daten.username, (tbl_umgebung.env || '+''' - '''
                           +' || tbl_umgebung.beschreibung)as env from tbl_w_daten, tbl_umgebung, tbl_w_id where tbl_w_id.fk_env_id '
                           +'= tbl_umgebung.pk_env_id and tbl_w_id.pk_w_id = tbl_w_daten.fk_w_id order by tbl_w_daten.fk_w_id';
    ADODataSet.Open;
    rs:=ADODataSet.Recordset;
    while not rs.EOF do
    begin
      TreeObject:= TTreeDataClass.Create;
      TreeObject.WID:=FormatFloat('000000', rs.Fields['FK_W_ID'].Value);
      TreeObject.ICON:=0;
      Wurzel:= AddVSTObject(VST, Nil, TreeObject);
      ADODataSet_sw.CommandText:='select tbl_w_daten.fk_w_id, tbl_application.pk_sw_product_id, tbl_application.pk_sw_product_id, tbl_application.sw_product, tbl_w_art.w_art from tbl_application, tbl_w_daten, tbl_w_art where tbl_w_daten.fk_w_id='
                     +VarToStr(rs.Fields['FK_W_ID'].Value)+' and tbl_w_daten.fk_sw_product_id = tbl_application.pk_sw_product_id'
                     +' and tbl_w_daten.fk_w_art_id = tbl_w_art.pk_w_art_id';
      ADODataSet_sw.open;
      rs_sw:=ADODataSet_sw.Recordset;
      while not rs_sw.EOF do
      begin
        TreeObject:= TTreeDataClass.Create;
        TreeObject.ICON:=1;
        Try
          If VarToStr(rs_sw.Fields['sw_product'].Value) > '' Then
          Begin
            TreeObject.SW:=VarToStr(rs_sw.Fields['sw_product'].Value);
            TreeObject.USER:=VarToStr(rs.Fields['USERNAME'].Value);
            TreeObject.ART:=VarToStr(rs_sw.Fields['W_ART'].Value);
            TreeObject.ENV:=VarToStr(rs.Fields['ENV'].Value);

            ADODataSet_oc.CommandText:='select cm_no from tbl_cm_no where fk_w_id='+VarToStr(rs.Fields['FK_W_ID'].Value)
                                      +' and fk_sw_product_id='+VarToStr(rs_sw.Fields['PK_SW_PRODUCT_ID'].Value);
            ADODataSet_oc.Open;
            rs_oc:=ADODataSet_oc.Recordset;

            Wurzel_oc:=AddVSTObject(VST, VST.AddChild(Wurzel, TreeObject), nil);
            while not rs_oc.EOF do
            begin
              TreeObject:=TTreeDataClass.Create;
              TreeObject.ICON:=1;
              try
                if VarToStr(rs_oc.Fields['CM_NO'].Value) > '' then
                begin
                  TreeObject.OC:=VarToStr(rs_oc.Fields['CM_NO'].Value);
                  AddVSTObject(VST, Wurzel_oc, TreeObject);
                end;
              except
                TreeObject.Free;
              end;
              rs_oc.MoveNext;
            end;
            ADODataSet_oc.Close;
            rs_oc.Close;
            AddVstObject(VST,wurzel, TreeObject);
          end;
        except
          TreeObject.Free;
        end;
        rs_sw.MoveNext;
      end;
      ADODataSet_sw.Close;
      rs_sw.Close;
      rs.MoveNext;
    end;
  except
    on e : Exception do
    begin
      MDialog(e.Message,mtError,[mbOK]);
    end;
  end;
  ADODataSet.Close;
  ADODataSet.Free;
  VST.EndUpdate;
kann mir bitte jemand helfen?

MfG
schuetze09

mitch01 19. Nov 2004 08:36

Re: VirtualTreeview
 
hi...

vielleicht liegt der fehler in der dem Aufruf:

Delphi-Quellcode:
Wurzel_oc:=AddVSTObject(VST, VST.AddChild(Wurzel, TreeObject), nil);
du solltest die Baumstruktur so aufbauen:

Delphi-Quellcode:
 var wurzel1, wurzel2: PVirtualNode;
begin
  //oberste ebene an root-Knoten anbinden -> nil
  wurzel1 := AddVstObject(VST, nil, TreeObject);
  //ebene 2 -> an Knoten wurzel1 anbinden
  wurzel2 := AddVstObject(VST, wurzel1, TreeObject);
  //ebene 3 -> wie ebene 2 -> neue Wurzel übergeben
  AddVstObject(VST, wurzel2, TreeObject);
end;
Und nicht an die Funktion mit addchild übergeben...
du würdest ja an die Funktion ein child übergeben und die Funktion hängt an dieses leere child noch ein child mit deinen Daten -> du müsstest dann schon auf Ebene 4 sein...

So kannst du beliebig verschachtelte Strukturen aufbauen...
Zur Vereinfachung nicht Variablen wurzel1, wurzel2 etc verwenden, sondern ein Array in dem du die knoten verwaltest

grüße

schuetze09 19. Nov 2004 09:01

Re: VirtualTreeview
 
@mitch01

hallo, besten dank, funktioniert wunderbar...
aber noch dazu eine Frage:

Zitat:

Zur Vereinfachung nicht Variablen wurzel1, wurzel2 etc verwenden, sondern ein Array in dem du die knoten verwaltest
also für jede Ebene ein Array in dem die knotenindexe verwaltet werden?

mfg
schuetze09

mitch01 19. Nov 2004 10:08

Re: VirtualTreeview
 
hi...
nicht die indexe verwalten sondern referenzen der knoten selbst...

Delphi-Quellcode:
var meineKnoten : Array of PVirtualNode;

//und in der funktion dann immer die node ins array schreiben dann musst
//du nicht für jeden unterknoten eine neue variable wurzel1, wurzel2 etc. nehmen
//also :

meineKnoten[x] := AddVstObject(VST, nil, TreeObject);
//erste Ebene!

//und dann für jede Unterebene:
meineKnoten[y] := AddVstObject(VST, meineKnoten[x], TreeObject);
//zweite ebene
//und immer so weiter...
unter
Delphi Source
gibts ein gutes Tutorial zum Thema!
:coder2:

schuetze09 19. Nov 2004 10:12

Re: VirtualTreeview
 
DANKE für deine Hilfe, mit diesem Ansatz werde ich es schaffen...

MfG
schuetze09


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz