![]() |
.... nochmals VirtualStringTree
Hallo zusammen,
ich kämpfe mal wieder mit der VirtualStringTree-Komponente. :wall: Bis jetzt funktioniert die Darstellung ohne Childnodes und das Prinzip der VirtualStringTree ist mir, glaube ich, auch klar (Trennung von Struktur und Inhalt- grob gesagt). Für eine einzeilig Node habe ich einen einfachen Record, der ungefähr so aussieht:
Delphi-Quellcode:
Wenn ich jetzt aber eine ChildNode hinzufügen will, wie schaut dann der Record aus? Muss ich einfach eine zusätzliche Variable vom Typ PVirtualNode dem Record hinzufügen?
type
tVSTData = record String1 : String; String2 : String; Zahl3 : Integer; end; Gruß Marcus |
Re: .... nochmals VirtualStringTree
nö. du machst einfach node := VST1.addchild(nil); (das is der root). dann machst du VST1.AddChild(Node); // Das is dann das child zu dem root. den record musst du nich ändern..
|
Re: .... nochmals VirtualStringTree
Delphi-Quellcode:
zuallererst : Es fehlt ein Pointer auf die Struktur:
type
tVSTData = record String1 : String; String2 : String; Zahl3 : Integer; end;
Delphi-Quellcode:
Dann musst du der VirtualTree Komponente sagen, wie groß die Struktur ist :
PVSTData = ^tVSTData;
Delphi-Quellcode:
Dann kannst du einfügen
YourVTree.NodeDataSize := SizeOf(tVSTData);
Delphi-Quellcode:
das machst du immer so, wenn du was lesen oder ändern willst
var Node : PVirtualNode;
Data : PVSTData; begin Node := YourVTree.AddChild(nil); Data := YourVTree.GetNodeData(Node); Data^.String1 := '123'; .. end; |
Re: .... nochmals VirtualStringTree
Hallo,
okay, das ist klar. Ich hab nur noch momentan ein Problem mit dem Verständnis bei unterschiedlichen Strukturen für die RootNode und die ChildNodes. Folgende Struktur mal angenommen:
Delphi-Quellcode:
Wenn ich jetzt die Projektdaten hinzufüge und einen Record habe der so ausschaut:
+ Monat
+ Kalenderwoche - Projektnummer, Projektname, Datum . . .
Delphi-Quellcode:
dann wird doch für jedes Projekt, welches ich hinzufüge, eine RootNode Monat und Kalenderwoche hinzugefügt?
type
tVSTData = record Monat : String; Kalenderwoche : String; Projektnummer : Integer; Projektname : String; Datum : TDateTime; end; Gruß Marcus |
Re: .... nochmals VirtualStringTree
Nein, Du hast eigentlich kein Verständnisproblem, denn die Struktur von Root- und Childnodes muss identisch sein.
Du kannst einem Root-Node nicht z.B. geben: |ID|Monate und dem Child |ID|Monate|Tage Allen Nodes im VT liegt die selbe Recordstruktur zugrunde (ob Du sie mit Daten füllst, ist Deine Sache). In Deinem Beispiel hätte der VT dann 5 Spalten: Monat|Kalenderwoche|Projektnummer|Projektname|Datu m Gruß Igotcha P.S. Was Du machen könntest, kannst Du hier auf dem Screenshot sehen (von meiner Anwendung) ![]() Dein Record könnte dann z.B. so aussehen:
Delphi-Quellcode:
Deine Records könnten nun so aussehen:
type
PVSTData = ^TVSTData; TVSTData = record strPeriode: String; iProjektnummer: Integer; strProjektname: String; dDatum: TDateTime; strParentID: String; end;
Code:
Wenn Du jetzt z.B. aus der DB auslesen willst, machst Du ein
PERIODE PROJEKTNR PROJEKTNAME DATUM PARENTID
10/2004 NULL NULL NULL 0 42 12345 Test 11.10.2004 10/2004 42 45678 Test2 13.10.2004 10/2004 11/2004 NULL NULL NULL 0 45 78901 Test3 01.11.2004 11/2004 SELECT * FROM tabelle ORDER BY PARENTID, KW, DATUM liest alles in einer Schleife ein und abhängig von PARENTID erstellst Du einen Rootnode oder einen passenden Childnode zur PARENTID. |
Re: .... nochmals VirtualStringTree
:gruebel:
also wenn ich Monat und Kalenderwoche(um das vorherige Beispiel aufzugreifen) nichts zuweise, und eine Node anlege dann werden die "Einträge" des Records die Leer sind nicht angezeigt? Wenn das so ist, dann wird es natürlich schon etwas klarer. Denn bei den Beispielen habe ich immer nach den Strukturen der Nodes gesucht und es war mir nie klar wie zwischen den einzelnen Nodes (Root,Child) unterschieden wird. Die Unterscheidung findet also nur in der "Befüllung" meines Records/Objects statt? Gruß Marcus |
Re: .... nochmals VirtualStringTree
Schau Dir mal mal meinen editierten Post an.
|
Re: .... nochmals VirtualStringTree
EDIT: Ich habe meine Beispielstruktur editiert, da sie murks war ;-) Du musst nur darauf achten, dass Du Dir irgendwie eine eindeutige PARENTID bastelst (evtl. Nimmst Du noch das Jahr mit rein beim Monat) - mein Beispiel ist nicht eindeutig, da es MONAT=11 und KW=11 geben kann, also für die Spalte ZEITRAUM. Besser, Du schreibst beim Monat noch das Jahr dazu.
Du wirst dabei aber auf ein grundsätzliches "Problem" bei der Arbeit mit VTs stossen, denn man kann Nodes dort nicht direkt anspringen. Sprich sowas wie "hänge den Child an den Node 123" gibt es von Hause aus nicht. Da kannst Du Dir eine Funktion zu schreiben:
Delphi-Quellcode:
Wenn Du also in Deiner Schleife auf einen Eintrag stößt, wo PARENTID <> 0 ist, dann rufst Du auf:
function TfrmMain.FindNodeByPERIODE(aTree: TBaseVirtualTree;
aID: String;): PVirtualNode; var NodeData: pVSTData; begin Result := aTree.GetFirst; while Assigned(Result) do begin NodeData := pVSTData(aTree.GetNodeData(Result)); if NodeData^.strPeriode=aID Then Exit; Result := aTree.GetNext(Result); end; end;
Code:
Und das Child wird an den richtigen Root angehängt.var aktueller_knoten: PVirtualNode; myData: PVSTData; begin <--- SCHLEIFENAUSZUG <--- dieses Konstrukt musst Du in der Schleife für Childs verwenden aktueller_knoten:=DEINVST.AddChild( FindNodebyPERIODE(DEINVST, PARENTID)); myData:=DEINVST.GetNodeData(aktueller_knoten); myData.strPeriode:=inttostr(42); //KALENDERWOCHE myData.strProjektname:='Test'; etc. end; Beim Arbeiten mit VSTs muss man sich erstmal bewußt werden, dass dieser wirklich nichts anderes macht, als spitzenmäßige Visualisierungsmöglichkeiten für Treeview-artige Strukturen zu ermöglichen - die Datenhaltung musst Du selbst machen. Gruß Igotcha |
Re: .... nochmals VirtualStringTree
Wow! Vielen Dank, das hilft mir schon ziemlich weit.
Heute Nachmittag nach der Arbeit wird das erst mal ausprobiert :D VirtualStringTree ist schon eine recht komplexe Komponente, und da erst mal einen Überblick zu bekommen und die Grundlegenden Sachen zu verstehen dauert schon ein weilchen. Gruß Marcus |
Re: .... nochmals VirtualStringTree
ich find den VST nur noch genial :D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 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