Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen? (https://www.delphipraxis.net/162195-virtualstringtree-wie-kann-ich-nur-children-von-einem-parent-anzeigen-lassen.html)

ernschd 11. Aug 2011 16:10

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:
- Parent0
  |_ Child
  |_ Child

- Parent1
  |_ Child

- Parent3
  |_ Child
  |_ Child
  |_ Child
Die Darstellung soll in einem Grid erfolgen, und zwar jeweils nur für einen Parent-Teil (z.B. alle Child-Elemente von Parent3).

Bisher habe ich zumindest mit
Delphi-Quellcode:
if VST.GetNodeLevel(Node) = 1
das erste Child-Element ansprechen können.

Kann ich auf einen Index zugreifen? Oder muss ich mit GetFirstChild und/oder GetNextSibling arbeiten? Bin planlos.

Vielen Dank.

jaenicke 11. Aug 2011 16:43

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.

ernschd 15. Aug 2011 15:00

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:
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;
Funktioniert allerdings nicht richtig, da die leeren Spalten trotzdem angezeigt werden.
Ist die GetText-Prozedur überhaupt die richtige Stelle dafür, oder muss ich die Daten vorher schon irgendwie zurechtbasteln?

jaenicke 15. Aug 2011 15:18

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. ;-)

chaosben 15. Aug 2011 15:20

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:

Die Darstellung soll in einem Grid erfolgen, und zwar jeweils nur für einen Parent-Teil (z.B. alle Child-Elemente von Parent3).
Wenn du ein Grid willst, kannst du einfach die Grid-Extension des VST anschalten.

Oder soll immer nur ein Parent expanded/aufgeklappt sein?

Erklär mal bitte genau, was du willst. :)

ernschd 15. Aug 2011 15:35

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?

jaenicke 15. Aug 2011 16:13

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. ;-)

chaosben 15. Aug 2011 18:41

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.

ernschd 16. Aug 2011 10:44

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:
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;
Nachtrag:
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;

chaosben 16. Aug 2011 11:08

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 02:20 Uhr.
Seite 1 von 2  1 2      

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