![]() |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Danke für die Hilfe!
Ich weiß jetzt woran ich gescheitert bin. An dieser Zeile
Delphi-Quellcode:
Wenn das Level 1 jetzt 2 Unterknoten hat, wie unterscheide ich denn dann bei case Sender.GetNodeLevel(Node) = 1, ob ich gerade den ersten oder X-ten Eintrag habe und dessen Text "getten" möchte?
//
Sender.GetNodeData(Node^.Parent); Column wird es ja nicht sein, denn das ist ja für die Spalten da. |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Zitat:
Code:
Jede Node kennt also i.d.R. immer nur den direkten Parent und seine Children. Wenn du jetzt mehrere Ebenen nach oben willst, dann kannst du entweder
Root (entspricht nil)
L Child 1 (Parent ist Root) L Child 1.1 (Parent ist Child 1) L Child 1.1.1 (Parent ist Child 1.1) L Child 1.1.2 (Parent ist Child 1.1) L Child 1.2 (Parent ist Child 1) L Child 1.2.1 (Parent ist Child 1.2) L Child 1.2.2 (Parent ist Child 1.2) L Child 2 (Parent ist Root) L Child 3 (Parent ist Root)
Delphi-Quellcode:
usw. oder aber die VST Funktion
Node1^.Parent1^.Parent^
Delphi-Quellcode:
in einer Schleife verwenden. Wenn die zurückgegebene Node dann
vst.NodeParent[Node]
Delphi-Quellcode:
ist, dann bist du bei der Root Node angelangt.
nil
|
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Code:
Schlecht erklärt von mir, sorry.
L Child 1 (Parent ist Child 1)
L Child 1.1 (Parent ist Child 1) L Child 1.2 (Parent ist Child 1) L Child 1.3 (Parent ist Child 1) Ich meinte natürlich mit "Level " die Children 1.1, 1.2 und 1.3. |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Zitat:
Wenn du dir im GetText Event des Trees den Text ziehen möchtest der zur übergebenen Node gehört, dann gehst du folgendermaßen vor:
Delphi-Quellcode:
Mehr musst du dort nicht machen. Wenn du dir immer den Text aus dem Parent ziehen wolltest und die jeweiligen Children immer unterschiedliche Texte haben, dann müsste ja dein Record n Properties haben wobei n die Anzahl der ChildNodes ist.
type
TVSTData = record NodeText: string; end; PVSTData = ^TVSTData; implementation procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var Data: PVSTData; begin Data := VirtualStringTree1.GetNodeData(Node); CellText := Data^.NodeText; end; Stattdessen trägst du dir beim Erstellen der Node den richtigen Text ein und rufst diesen immer nur ab. Dann hast du die Differenzierung was in einer Node stehen soll immer nur beim Erstellen der Nodes.
Delphi-Quellcode:
Wenn du das jetzt so machst, dann brauchst du an allen anderen Stellen wo du auf den Text zugreifst immer nur noch
procedure TForm1.ErstelleNodes;
var Node: PVirtualNode; NodeData: PVSTData; i: Integer; begin i := 0; while (i < 100) do begin if (((i mod 5) = 0)) and Assigned(Node)) then Node := vst.AddChild(Node) else Node := vst.AddChild(nil); NodeData := vst.GetNodeData(Node); // Hier wird dann abhängig vom NodeLevel ein Text im NodeData hinterlegt case (vst.GetNodeLevel(Node)) of 0: NodeData^NodeText := 'Das ist eine Node auf der obersten Ebene ' + IntToStr(Node^.Index); 1: NodeData^NodeText := 'Das ist eine Node auf der zweiten Ebene ' + IntToStr(Node^.Index); end; Inc(i); end; end;
Delphi-Quellcode:
abzurufen und schon hast du den richtigen Text. Da ist dann nix mehr mit Parent suchen und daraus den Text auslesen oder bilden oder was weiß ich.
NodeData^.NodeText
Der Code ist jetzt nur hier im Editor geschrieben und nicht compiliert/getestet. Es könnte also der ein oder andere Fehler drin sein. Ich hoffe das ist jetzt gut und verständlich erklärt. Wenn nicht dann scheu dich nicht, nochmal nachzufragen. PS: Wenn du das mal verstanden hast, dann ist es wirklich sehr einfach (wie alles im Leben). Und dann kommt der nächste Schritt wo du nur noch die Property RootNodeCount des VST verwendest und dann mit den bereits angesprochenen Events
Delphi-Quellcode:
und
OnInitNode()
Delphi-Quellcode:
arbeitest.
OnInitChildren()
|
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Ok jetzt bin ich total raus, da ich definitiv nichts mehr verstehe. Genau deswegen hasse ich dieses Control, da die Handhabung völlig unnütz kompliziert ist.
Mein Ziel war es eigentlich Nodes erstellen zu können (ich mache das mit einer TObjectList), die im VST anzeigen zu lassen und dann abspeichern zu können, indem ich durch jedes Node gehe. Ich glaube ich gebe mich geschlagen. Denn wozu etwas verwenden, wenn ich kein Wort davon verstehe. So mache ich es übrigens
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var aVSTData: TVSTData; i: Integer; begin aVSTDataClasses := TVSTDataClasses.Create; for i := 0 to 1 do begin aVSTData := TVSTData.Create; aVSTData.sTitle := 'Title ' + IntToStr(i); aVSTData.sInformation := IntToStr(i) + ' #2'; aVSTData.sInformation2 := IntToStr(i) + ' #3'; aVSTDataClasses.Add(aVSTData); end; VirtualStringTree1.RootNodeCount := aVSTDataClasses.Count; end; |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Sieht doch schonmal ganz gut aus. Ich versuche mal, dir ein entsprechendes Beispiel zu basteln das deinem Vorhaben ähnlich kommt. Kann allerdings etwas dauern.
|
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Das wäre nett :oops:
Ansonsten könnte ich auch TTreeView nehmen, aber da hat man nicht die Vielfalt, wie sie das VirtualStringTree bietet. |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Jim,
anbei mal ein kleines Demo Projekt. Ich hoffe es wird deutlich, wie der Tree funktioniert. Das Beispiel habe ich jetzt direkt mit den Events
Delphi-Quellcode:
und
OnInitNode()
Delphi-Quellcode:
gemacht, da du das ja in deinem Beispiel auch angedeutet hattest. Das ist sowieso der bessere Weg.
OnInitChildren()
Ich habe jetzt keine Speichern Procedure geschrieben, sondern lediglich eine kleine Procedure, die durch den Tree läuft und alle Nodes in einem Memo zusammenfasst. Das kann teilweise auch etwas dauern. Deshalb solltest du auch später deine Speicher Methode in einen Thread auslagern damit das Programm nicht hängen bleibt. Aber das war mir jetzt zu viel Arbeit und darum ging es ja auch nicht. Ich wollte nur andeuten, wie man durch den VST iteriert. Beim Speichern der Daten würde ich sowieso nur durch die ObjectList laufen und mir dort entsprechend die Daten zusammensuchen. Wenn noch etwas unklar sein sollte, dann kannst du dich ja nochmal melden. |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Danke ersteinmal für dieses Beispiel.
Ich finde es super kompliziert muss ich sagen. Was man alles schreiben muss, um das mit dem VirtualStringTree anzeigen zu lassen, ist extrem. Nur zum Vergleich wie es mit dem TTreeView ist:
Delphi-Quellcode:
// Button
var aNode: TTreeNode; begin aNode := TreeView1.Items.Add(nil, 'Test 1'); TreeView1.Items.AddChild(aNode, 'Test 1.1'); TreeView1.Items.AddChild(aNode, 'Test 1.2'); aNode := TreeView1.Items.Add(nil, 'Test 2'); TreeView1.Items.AddChild(aNode, 'Test 2.1'); TreeView1.Items.AddChild(aNode, 'Test 2.2'); |
AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
Der Unterschied ist, daß hier keine Trennung von Daten und Oberfläche passiert, weil die Daten direkt im Control gehalten werden. Im Laufe der Zeit wirst Du merken, daß das nicht optimal ist.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 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