![]() |
Erweiterte TreeNodes in TreeView-Komponente einfügen?
Guten Morgen, alle miteinander!
Ich habe gestern versucht, eine eigene TreeNode-Klasse in einer TreeView-Komponente zu nutzen, bin dabei aber auf Probleme gestoßen. Nehmen wir einmal an, ich hätte meine TreeNode-Klasse folgendermaßen aufgebaut:
Delphi-Quellcode:
(Ist jetzt aus dem Kopf geschrieben, also nicht zu ernst nehmen).
type
[...] TTreeNodeErw = class ( TTreeNode ) private FID: Integer; public constructor Create ( AOwner: TTreeNodes; ID: Integer ); property ID: Integer read FID write FID; end; [...] implementation [...] { TTreeNodeErw } constructor TTreeNodeErw.Create ( AOwner: TTreeNodes; ID: Integer ); begin inherited Create ( AOwner ); FID := ID; end; Sinn ist es in diesem speziellen Fall, in meiner TreeView-Komponente direkt eine Baumansicht von Datenbankeinträgen zu erzeugen, die eben über die ID (FID) eindeutig angesprochen werden können. Das Modell wäre selbstverständlich erweiterbar, so dass man noch mehr Informationen direkt in den Node mit hineinpackt. Ich kann einen TreeNode dieser Klasse auch direkt in eine TreeView-Komponente einfügen:
Delphi-Quellcode:
Das funktioniert. Aber wenn ich den Knoten anwähle, um mir beispielsweise die ID anzeigen zu lassen:
TreeView.Items.Add ( TTreeNodeErw.Create ( TreeView.Items, 1 ), 'Knoten 1' );
Delphi-Quellcode:
wird mir ein Zufallswert angezeigt, der irgendwo im System herumfliegt. Der TreeView scheint also wirklich nur den TTreeNode-Teil meiner TTreeNodeErw-Klasse zu verwalten. Der Rest scheint verloren zu gehen.
ShowMessage ( IntToStr ( TTreeNodeErw ( TreeView.Selected ).ID ) );
Jetzt meine eigentliche Frage: Kennt jemand eine Möglichkeit, eine solche erweiterte TTreeNode-Klasse direkt in einem TTreeView zu benutzen, ohne dass man auch diesen (und damit auch die TTreeNodes-Klasse und alles, was damit zusammenhängt), ebenfalls anpacken und erweitern zu müssen? :?: Matthias |
Re: Erweiterte TreeNodes in TreeView-Komponente einfügen?
Guten Morgen Matthias.
TTreeNode kapselt das Windows-interne Item eines TreeView-Controls, erweitern kannst du da nichts. Du musst die Eigenschaft Data benutzen um die Verbindung zwischen TreeNode und dem Datensatz nicht abreißen zu lassen. Oft reicht es, wenn du die RecordNo des DataSet dort ablegst. Grüße vom marabu |
Re: Erweiterte TreeNodes in TreeView-Komponente einfügen?
Hallo, Marabu!
Schade, dass es nicht funktioniert... Aber Dein Hinweis auf die Data-Eigenschaft hilft mir sehr! Vielen Dank für die schnelle Antwort! :-D Matthias |
Re: Erweiterte TreeNodes in TreeView-Komponente einfügen?
Hi,
du könntest natürlich noch eine neue Klasse von TCustomTreeView ableiten, die dann deine speziellen TreeNodes verwendet. Persönlich würde ich aber auch den Weg von marabu nehmen und die Eigenschaft Data benutzen. |
Re: Erweiterte TreeNodes in TreeView-Komponente einfügen?
So geht es :
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TTreeNodeEx = class(TTreeNode) private _Beschreibung: String; protected public published property Beschreibung: String read _Beschreibung write _Beschreibung; end; TForm1 = class(TForm) Button1: TButton; TreeView1: TTreeView; StatusBar1: TStatusBar; procedure TreeView1Change(Sender: TObject; Node: TTreeNode); procedure FormCreate(Sender: TObject); procedure TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass); begin NodeClass := TTreeNodeEx; end; procedure TForm1.FormCreate(Sender: TObject); var lvTreeNodeEx: TTreeNodeEx; begin lvTreeNodeEx := Self.TreeView1.Items.AddFirst(nil, 'Test 1') as TTreeNodeEx; lvTreeNodeEx.Beschreibung := 'Beschreibung 1'; lvTreeNodeEx := Self.TreeView1.Items.AddFirst(nil, 'Test 2') as TTreeNodeEx; lvTreeNodeEx.Beschreibung := 'Beschreibung 2'; lvTreeNodeEx := Self.TreeView1.Items.AddFirst(nil, 'Test 3') as TTreeNodeEx; lvTreeNodeEx.Beschreibung := 'Beschreibung 3'; lvTreeNodeEx := Self.TreeView1.Items.AddFirst(nil, 'Test 4') as TTreeNodeEx; lvTreeNodeEx.Beschreibung := 'Beschreibung 4'; lvTreeNodeEx := Self.TreeView1.Items.AddFirst(nil, 'Test 5') as TTreeNodeEx; lvTreeNodeEx.Beschreibung := 'Beschreibung 5'; end; procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); begin if Self.TreeView1.Selected <> nil then StatusBar1.SimpleText := (Self.TreeView1.Selected as TTreeNodeEx).Beschreibung else StatusBar1.SimpleText :=''; end; end. |
Re: Erweiterte TreeNodes in TreeView-Komponente einfügen?
Jetzt bin ich platt und das ist selten. Diese Erweiterung wurde irgendwann nach D5 gemacht und ich habe sie nie bemerkt.
Vielen Dank, Heffalump. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 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 by Thomas Breitkreuz