Einzelnen Beitrag anzeigen

Aviator

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

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

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