Einzelnen Beitrag anzeigen

Aviator

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

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