Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Erweiterte TreeNodes in TreeView-Komponente einfügen? (https://www.delphipraxis.net/66893-erweiterte-treenodes-treeview-komponente-einfuegen.html)

mjenke 6. Apr 2006 07:39


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:
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;
(Ist jetzt aus dem Kopf geschrieben, also nicht zu ernst nehmen).

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:
TreeView.Items.Add ( TTreeNodeErw.Create ( TreeView.Items, 1 ), 'Knoten 1' );
Das funktioniert. Aber wenn ich den Knoten anwähle, um mir beispielsweise die ID anzeigen zu lassen:

Delphi-Quellcode:
ShowMessage ( IntToStr ( TTreeNodeErw ( TreeView.Selected ).ID ) );
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.

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

marabu 6. Apr 2006 07:54

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

mjenke 6. Apr 2006 10:53

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

Die Muhkuh 6. Apr 2006 13:49

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.

Heffalump 6. Apr 2006 14:28

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.

marabu 6. Apr 2006 18:19

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