Einzelnen Beitrag anzeigen

geesmith

Registriert seit: 17. Jan 2003
Ort: Frauenfeld
32 Beiträge
 
Delphi XE5 Architect
 
#1

Treeview: Parent löscht die Daten meiner CustomNode

  Alt 13. Jun 2019, 10:27
Ich benutze eine TreeView und möchte in den einzelnen Nodes zusätzliche Daten speichern.

Um zusätzliche Daten in einer Treeview-Node zu halten, hatte ich mich daher nach Möglichkeiten für eine eigene TTreeNode-Klasse kundig gemacht.
Diese Möglichkeit hatte ich dann gefunden:
https://www.thoughtco.com/store-more...e-view-1058354

Das funktioniert soweit wunderbar... bis ich Frames verwende.

Für meinen Testaufbau und um euch das Problem zu zeigen habe ich folgendes:

unit unit1:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, u_Frame;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  With TFrame2.Create(self) do
  begin
    ShowData;
    Parent := Self;
    ShowData;
  end;
end;

end.
unit u_Frame:
Delphi-Quellcode:
unit u_Frame;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls;

type TCustomNode = class(TTreeNode)
  public
    MyData:String;
end;


type
  TFrame2 = class(TFrame)
    TreeView1: TTreeView;
    procedure TreeView1CreateNodeClass(Sender: TCustomTreeView;
      var NodeClass: TTreeNodeClass);
  private
    { Private-Deklarationen }
  public
    constructor Create(AOwner:Tcomponent); Override;
    procedure ShowData;
  end;

implementation

{$R *.dfm}

{ TFrame2 }

constructor TFrame2.Create(AOwner: Tcomponent);
begin
  inherited Create(AOwner);

  TreeView1.Items.Clear;
  With (TreeView1.Items.AddFirst(nil,'Meine Node') as TCustomNode) do
    MyData := 'abcdef';
end;

procedure TFrame2.ShowData;
begin
  ShowMessage('Meine Daten: '+(TreeView1.Items[0] as TCustomNode).MyData);
end;

procedure TFrame2.TreeView1CreateNodeClass(Sender: TCustomTreeView;
  var NodeClass: TTreeNodeClass);
begin
  NodeClass := TCustomNode;
end;

end.

Der Ablauf ist einfach gehalten:
- Im FormCreate erstellt er das Frame mit meiner TreeView drauf.
- Beim Erstellen des Frames wird eine Node meiner Klasse TCustomNode erstellt. Eine Variable wird mit dem Beispielwert 'abcdef' gefüllt
- Sobald das Frame auf der Form erstellt wurde, zeige ich mit ShowData die Daten der Node an. Das mache ich zweimal: Einmal vor 'Parent := ' und einmal nach.

Ergebnis:
- Beim ersten Mal anzeigen wird 'abcdef' angezeigt ... und beim zweiten Mal '' nichts.

Folgerung:
- Die Zuweisung 'Parent := ' sorgt dafür, dass mein Variablen in meiner Custom-Node geleert werden.


Fragen an euch:
- Wisst ihr warum?
- Mache ich was falsch?
- Gibt es bessere Möglichkeiten?


Grundsätzlich könnte ich damit umgehen, indem ich meine Custom-Node-Werte erst nach dem 'Parent := ' lade. Aber das ganze löst bei mir ein flaues Magengefühl aus und wenn ich noch Frames in Frames verwendet, dann wirds langsam aber sicher kompliziert dieses Verhalten zu berücksichtigen. Am Schluss bin ich übermässig mit Fehlersuche beschäftigt.

Vielen Dank für eure Hilfe!


Ich verwende Delphi 10.1.
Angehängte Dateien
Dateityp: zip Project1.zip (54,2 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat