Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Treeview-Ast absprechen

  Alt 24. Jul 2014, 21:56
Insgesamt denke ich mir, du gehst die Sache von der falschen Seite an.

Denke nicht daran, wie du da etwas in einem TreeView bekommst, sondern überlege, wie die deine Datenstruktur als Baum-Struktur aufbaust. Die Anzeige im TreeView kommt erst danach.

Nehmen wir uns mal folgende Klasse
Delphi-Quellcode:
TDataTreeNode = class abstract
private
  FCaption : string;
  FChilds : TList<TDataTreeNode>;
protected
  function GetCaption : string; virtual;
  function GetContext : TObject; virtual;
public
  constructor Create( const Caption : string );
  destructor Destroy; override;
published
  property Caption : string read GetCaption;
  property Childs : TList<TDataTreeNode> read FChilds;
  property Context : TObject read GetContext;
end;

constructor TDataTreeNode.Create( const Caption : string );
begin
  inherited Create;
  FCaption := Caption;
  FChilds := TObjectList<TDataTreeNode>.Create( True );
end;

destructor TDataTreeNode.Destroy;
begin
  FChilds.Free;
  inherited;
end;

function TDataTreeNode.GetCaption : string;
begin
  Result := FCaption;
end;

function TDataTreeNode.GetContext : TObject;
begin
  Result := nil;
end;
Jetzt benötigst du z.B. einen Zweig für die Verwaltungs-Daten
Delphi-Quellcode:
TVerwaltungNode = class( TDataTreeNode )
private
  FVerwaltung : Tierhaltung;
protected
  function GetContext : TObject; override;
public
  constructor Create( Verwaltung : TVerwaltung );
end;

constructor Create( Verwaltung : TVerwaltung );
begin
  inherited Create( 'Verwaltung' );
  FVerwaltung := Verwaltung;
  Childs.Add( TLizenzenNode.Create( 'Aktive Lizenzen', Verwaltung.AktiveLizenzen ) );
  Childs.Add( TLizenzenNode.Create( 'Lizenzen (inaktiv)', Verwaltung.InaktiveLizenzen ) );
end;

function TVerwaltungNode.GetContext : TObject;
begin
  Result := FVerwaltung;
end;
und dazu eben passend
Delphi-Quellcode:
TLizenzenNode = class( TDataTreeNode )
private
  FLizenzen : TList<TLizenz>;
public
  constructor Create( Caption : string; Lizenzen : TList<TLizenzen> );
end;

constructor TLizenzenNode.Create( Caption : string; Lizenzen : TList<TLizenz> );
var
  LLizenz : TLizenz;
begin
  constructor Create( Caption );
  for LLizenz in TLizenz do
    Childs.Add( TLizenzNode.Create( LLizenz ) );
end;
und zu guter letzt noch
Delphi-Quellcode:
TLizenzNode = class( TDataTreeNode )
private
  FLizenz : TLizenz;
public
  constructor Create( Lizenz : TLizenz );
end;

constructor Create( Lizenz : TLizenz );
begin
  inherited Create( Lizenz.Nummer );
  FLizenz := Lizenz;
end;
Das wäre schon mal die grobe Richtung. Wenn du jedem Node jetzt auch noch einen Kontext verpasst, dann kannst du anhand des Kontexts auch noch eine passendes Frame/Formular erzeugen und anzeigen.

Den Baum im TreeView kannst du jetzt mit diesen Objekten aufbauen, indem du die Caption und die Childs abfragst.

(Umgetestet und frei Hand heruntergetippt. Es fehlt auf jeden Fall noch die Benachrichtigung bei Veränderungen innerhalb der Objekte, an die sich die Form dranhängen kann)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (24. Jul 2014 um 22:00 Uhr)
  Mit Zitat antworten Zitat