AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Daten-Rekord zu TreeView hinzufügen - Problem/AV
Thema durchsuchen
Ansicht
Themen-Optionen

Daten-Rekord zu TreeView hinzufügen - Problem/AV

Ein Thema von Jim Carrey · begonnen am 2. Nov 2016 · letzter Beitrag vom 3. Nov 2016
Antwort Antwort
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV

  Alt 2. Nov 2016, 17:07
Wie würde ich bei diesem Beispiel denn an den String "sInformation" kommen und es im Child eines Nodes anzeigen lassen?
Also generell werden Daten eigentlich der Node zugeordnet, die auch später die Informationen anzeigen soll. Man kann natürlich auch auf die Node Daten des Parents zugreifen und sich dort die Informationen ziehen.

Hier mal ein Beispiel wie das aussehen könnte (nur hier im Editor runtergetippt).

Das wäre jetzt der Fall, wenn die Daten der Node zugeordnet werden, welche diese auch anzeigen soll.
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
  Data := VirtualStringTree1.GetNodeData(Node);

  case Sender.GetNodeLevel(Node) of
    0: CellText := Data^.sTitle;
    1: CellText := Data^.sInformation;
  end;
end;
Das wäre jetzt der Fall, wenn die Daten vom Parent gezogen werden.
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
  case Sender.GetNodeLevel(Node) of
    0:
    begin
      Data := Sender.GetNodeData(Node);
      CellText := Data^.sTitle;
    end;

    1:
    begin
      Data := Sender.GetNodeData(Node^.Parent); // Hier kann man ja sicher sein, dass ein Parent existiert, da der NodeLevel 1 ist
      CellText := Data^.sInformation;
    end;
  end;
end;
Eigentlich nicht so kompliziert. Du musst eben nur die richtige Datenstruktur im Hintergrund haben um ordentlich damit arbeiten zu können. Alternativ zu den Records kannst du auch Klassen verwenden (mache ich lieber). Die lassen sich dann einfacher mit ObjectLists speichern und das FreeNode Event fällt dadurch auch weg. Zusätzlich kann man statt AddChild() die Events OnInitNode() und OnInitChildren() verwenden, was den virtuellen Modus nochmal etwas besser herausstechen lässt.

Wenn du es dann ganz extrem machen willst, dann kannst du den Klassen auch jeweils ein Interface spendieren und pro NodeLevel eine eigene Klasse hinterlegen. Dieses Interface stellt dann bspw. eine GetText() Methode zur Verfügung mit der sich der Tree bequem die anzuzeigenden Daten ziehen kann.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#2

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV

  Alt 2. Nov 2016, 17:51
Danke für die Hilfe!
Ich weiß jetzt woran ich gescheitert bin. An dieser Zeile
Delphi-Quellcode:
//
Sender.GetNodeData(Node^.Parent);
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?
Column wird es ja nicht sein, denn das ist ja für die Spalten da.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV

  Alt 2. Nov 2016, 18:03
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?
Hmm, die Frage verstehe ich jetzt nicht so ganz. Ein Tree ist ja so aufgebaut:

Code:
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)
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 Node1^.Parent1^.Parent^ usw. oder aber die VST Funktion vst.NodeParent[Node] in einer Schleife verwenden. Wenn die zurückgegebene Node dann nil ist, dann bist du bei der Root Node angelangt.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#4

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV

  Alt 2. Nov 2016, 18:12
Code:
 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)
Schlecht erklärt von mir, sorry.
Ich meinte natürlich mit "Level " die Children 1.1, 1.2 und 1.3.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV

  Alt 2. Nov 2016, 18:34
Schlecht erklärt von mir, sorry.
Ich meinte natürlich mit "Level " die Children 1.1, 1.2 und 1.3.
Ich glaube du hast den Sinn des VST/eines TreeViews noch nicht so ganz verstanden.

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

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:
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;
Wenn du das jetzt so machst, dann brauchst du an allen anderen Stellen wo du auf den Text zugreifst immer nur noch NodeData^.NodeText 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.

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 OnInitNode() und OnInitChildren() arbeitest.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#6

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV

  Alt 2. Nov 2016, 18:42
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;

Geändert von Jim Carrey ( 2. Nov 2016 um 18:48 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV

  Alt 2. Nov 2016, 19:58
Sieht doch schonmal ganz gut aus. Ich versuche mal, dir ein entsprechendes Beispiel zu basteln das deinem Vorhaben ähnlich kommt. Kann allerdings etwas dauern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:52 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