![]() |
VirtualTreeview
Hallo,
ich möchte eine Baumstrukur mit dem VirtualTreeview aus einer DB darstellen, dazu habe ich bereits ![]() 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:
kann mir bitte jemand helfen?
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; MfG schuetze09 |
Re: VirtualTreeview
hi...
vielleicht liegt der fehler in der dem Aufruf:
Delphi-Quellcode:
du solltest die Baumstruktur so aufbauen:
Wurzel_oc:=AddVSTObject(VST, VST.AddChild(Wurzel, TreeObject), nil);
Delphi-Quellcode:
Und nicht an die Funktion mit addchild übergeben...
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; 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 |
Re: VirtualTreeview
@mitch01
hallo, besten dank, funktioniert wunderbar... aber noch dazu eine Frage: Zitat:
mfg schuetze09 |
Re: VirtualTreeview
hi...
nicht die indexe verwalten sondern referenzen der knoten selbst...
Delphi-Quellcode:
unter
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... ![]() gibts ein gutes Tutorial zum Thema! :coder2: |
Re: VirtualTreeview
DANKE für deine Hilfe, mit diesem Ansatz werde ich es schaffen...
MfG schuetze09 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz