AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

Ein Thema von ernschd · begonnen am 11. Aug 2011 · letzter Beitrag vom 16. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
ernschd

Registriert seit: 16. Jan 2008
166 Beiträge
 
Delphi XE8 Professional
 
#1

VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 11. Aug 2011, 17:10
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 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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.592 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 11. Aug 2011, 17:43
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
ernschd

Registriert seit: 16. Jan 2008
166 Beiträge
 
Delphi XE8 Professional
 
#3

AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 15. Aug 2011, 16:00
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?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.592 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 15. Aug 2011, 16:18
Äh, wie jetzt?

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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#5

AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 15. Aug 2011, 16:20
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)

Geändert von chaosben (15. Aug 2011 um 16:20 Uhr) Grund: Wort vergessen
  Mit Zitat antworten Zitat
ernschd

Registriert seit: 16. Jan 2008
166 Beiträge
 
Delphi XE8 Professional
 
#6

AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 15. Aug 2011, 16:35
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?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.592 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 15. Aug 2011, 17:13
Es gibt für die Filterung schlicht IsVisible als Indexeigenschaft des VirtualStringTree, womit du die unerwünschten Knoten aus- oder einblenden kannst.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#8

AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 15. Aug 2011, 19:41
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
ernschd

Registriert seit: 16. Jan 2008
166 Beiträge
 
Delphi XE8 Professional
 
#9

AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 16. Aug 2011, 11:44
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;

Geändert von ernschd (16. Aug 2011 um 12:14 Uhr) Grund: Test hat neue Erkenntnisse geliefert
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#10

AW: VirtualStringTree: wie kann ich nur Children von einem Parent anzeigen lassen?

  Alt 16. Aug 2011, 12:08
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;
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 Uhr.
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