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)