AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualTreeview

Ein Thema von schuetze09 · begonnen am 19. Nov 2004 · letzter Beitrag vom 19. Nov 2004
Antwort Antwort
schuetze09

Registriert seit: 3. Mär 2004
113 Beiträge
 
Delphi 2005 Architect
 
#1

VirtualTreeview

  Alt 19. Nov 2004, 07:20
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
  Mit Zitat antworten Zitat
mitch01

Registriert seit: 12. Nov 2004
12 Beiträge
 
#2

Re: VirtualTreeview

  Alt 19. Nov 2004, 08:36
hi...

vielleicht liegt der fehler in der dem Aufruf:

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
  Mit Zitat antworten Zitat
schuetze09

Registriert seit: 3. Mär 2004
113 Beiträge
 
Delphi 2005 Architect
 
#3

Re: VirtualTreeview

  Alt 19. Nov 2004, 09:01
@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
  Mit Zitat antworten Zitat
mitch01

Registriert seit: 12. Nov 2004
12 Beiträge
 
#4

Re: VirtualTreeview

  Alt 19. Nov 2004, 10:08
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!
  Mit Zitat antworten Zitat
schuetze09

Registriert seit: 3. Mär 2004
113 Beiträge
 
Delphi 2005 Architect
 
#5

Re: VirtualTreeview

  Alt 19. Nov 2004, 10:12
DANKE für deine Hilfe, mit diesem Ansatz werde ich es schaffen...

MfG
schuetze09
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:36 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