![]() |
VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Hi,
ich habe mein VST mit Daten gefüllt, so dass die Struktur ungefähr so aussieht:
Code:
Die Darstellung soll in einem Grid erfolgen, und zwar jeweils nur für einen Parent-Teil (z.B. alle Child-Elemente von Parent3).
- Parent0
|_ Child |_ Child - Parent1 |_ Child - Parent3 |_ Child |_ Child |_ Child Bisher habe ich zumindest mit
Delphi-Quellcode:
das erste Child-Element ansprechen können.
if VST.GetNodeLevel(Node) = 1
Kann ich auf einen Index zugreifen? Oder muss ich mit GetFirstChild und/oder GetNextSibling arbeiten? Bin planlos. Vielen Dank. |
AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Die sinnvollste Variante ist mit einer Schleife mit GetFirstChild usw. durchzugehen, ja.
Ich habe dafür einfach eine Methode in einem Class helper geschrieben, der das macht und eine anonyme Methode als Callback bekommt. Die ruft er dann für jeden gefundenen Knoten auf. Dazu gibt es noch die Möglichkeit per Breiten- oder Tiefensuche durchzugehen oder eben nur unmittelbare Kindknoten. Wenn du das so machst, kannst du das später einfach universell nutzen. |
AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Ich habe es vorerst mal so gelöst (in diesem Fall zur Anzeige des Child-Elements von Parent3):
Delphi-Quellcode:
Funktioniert allerdings nicht richtig, da die leeren Spalten trotzdem angezeigt werden.
procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var Data : PTData; fChild: PVirtualNode; a, i : Integer; begin a := Node.Index; CellText := ''; // hier meine gewünschte Position if Node.Parent.Index <> 3 then exit; if Sender.GetNodeLevel(Node) = 1 then begin i := 0; // Child-Elemente durchgehen fChild := vst.GetFirstChild(Node.Parent); repeat // Daten anzeigen Data := VST.GetNodeData(fChild); case Column of 0: CellText := Data^.Text; ... end; if i = a then break; fchild:= vst.GetNextSibling(fchild); inc(i); until not assigned(fChild); end; end; Ist die GetText-Prozedur überhaupt die richtige Stelle dafür, oder muss ich die Daten vorher schon irgendwie zurechtbasteln? |
AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Äh, wie jetzt? :shock:
In OnGetText musst du den Text der angegebenen Spalte (Columns) des angegebenen Knotens (Node) in CellText packen. Nicht mehr und nicht weniger. Ich weiß nicht was du da mit einer Schleife oder ähnlichem vorhast, nur dass es mit an Sicherheit grenzender Wahrscheinlichkeit ein Missverständnis bei der Nutzung der Komponente ist. ;-) |
AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Mir ist ist nicht ganz klar was du willst.
Was meinst du mit Zitat:
Oder soll immer nur ein Parent expanded/aufgeklappt sein? Erklär mal bitte genau, was du willst. :) |
AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Vielleicht sollte ich mal etwas genauer erklären, was ich vorhabe: ich möchte den Anwender meines Programms die Daten des Trees durchblättern lassen, wobei jeweils immer nur das aktive Parent (sichtbar) sein.
Ich möchte also nur ein Parent inkl. seiner Child-Elemente anzeigen. Da mein Tree aber logischerweise mehrere Parent-Elemente enthält, dachte ich, dass ich die ungewollten in GetText aussortieren müsste. Ist wohl aber anscheinend nicht so. Deswegen wäre meine Frage, an welcher Stelle die Filterung der Daten sinnvoll wäre, und ob ich GetText danach explizit mit dem gewollten Node aufrufen müsste? |
AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Es gibt für die Filterung schlicht IsVisible als Indexeigenschaft des VirtualStringTree, womit du die unerwünschten Knoten aus- oder einblenden kannst. ;-)
|
AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Ach so ... na dann ist es ja ganz einfach. :-)
An der Stelle, wo das "blättern" stattfindet, setzt du den aktuellen Parent auf unsichtbar und den nächsten auf sichtbar. Und das GetText-Event bekommt keine spezielle Logik ... einfach nur den Text rausgeben. |
AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Hmm, wenn ich das so versuche, werden seltsamerweise die Nodes 1-5 nicht angezeigt, alle anderen schon. GetText gibt nur die Daten aus.
Delphi-Quellcode:
Nachtrag:
procedure zeigeNode(Index: Integer);
var Node : PVirtualNode; begin Node := VST.GetFirst(); while (Node.Index <> Index) do begin VST.IsVisible[Node] := False; Node := VST.GetNext(Node); end; VST.IsVisible[Node] := True; end; Wenn ich in der Methode, in der ich die Daten in den VST lade, die untere Schleife zum Erstellen und Befüllen der Child-Nodes weglasse, kann ich mit zeigeNode problemlos durchblättern.
Delphi-Quellcode:
Node := VST.AddChild(nil); // Node erstellen
VST.IsVisible[Node] := False; // ausblenden Data := VST.GetNodeData(Node); Data^.Nummer := WO_N^.Nummer; while G <> NIL do begin fChild := VST.AddChild(Node); // Child-Node erstellen GerData := VST.GetNodeData(fChild); // Daten in Node eintragen GerData^.Text := G^.Text; // Einträge kopieren G := G^.GNext; // nächster Eintrag end; |
AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Der Code ist etwas unschön (birgt AV's) und unlogisch.
Probiers mal so:
Delphi-Quellcode:
procedure ShowNodes(AIndex : Integer);
var Node : PVirtualNode; begin Node := VST.GetFirst; while Assigned(Node) do begin VST.IsVisible[Node] := Node.Index = AIndex; Node := VST.GetNextSibling(Node); //so bleibst du in der obersten Ebene end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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 by Thomas Breitkreuz