Zum generellen Ansatz des dynamischen Erzeugen von Controls, die mit irgendetwas interagieren sollen, bieten sich eigentlich Frames eher an. Der Code wird erheblich übersichtlicher.
Delphi-Quellcode:
TItemFrame = class( TFrame )
Button1 : TButton;
procedure Button1Click( Sender : TObject );
private
FItem : TItem;
procedure SetItem( const Value : TItem );
public
property Item : TItem read FItem write SetItem;
end;
procedure TItemFrame.SetItem( const Value : TItem );
begin
FItem := Value;
Button1.Enabled := Assigned( FItem );
end;
procedure TItemFrame.Button1Click( Sender : TObject );
begin
// Was auch immer nun mit dem Item machen
DoSomethingWith( FItem );
// oder wenn das Item etwas schlauer ist
FItem.DoSomething;
end;
Und für die Erzeugung und Verwaltung
Delphi-Quellcode:
LItemFrames.Clear;
for LItem in FItems do
begin
LItemFrame := TItemFrame.Create( nil );
try
LItemFrame.Item := LItem;
LItemFrame.Parent := ItemsScrollBox; // halt den Container für die Items
// Positionieren
LItemFrame.Top := ...
LItemFrame.Left := ...
// In einer Liste merken
FItemFrames.Add( LItemFrame );
LItemFrame := nil;
finally
LItemFrame.Free;
end;
end;
Das ist prinzipiell der gesamte Code um die Items darzustellen und auch mit Aktionen zu verknüpfen.
Werden die Aktionen umfangreicher, dann wird das Frame umfangreicher (mehr Buttons, mehr Controls, mehr Farbe, mehr BlingBling), der Code zur Verwaltung bleibt meistens exakt gleich
Damit hat sich meine Frage von selbst beantwortet.
Ich glaube, dass ich jetzt mein Programm ohne Probleme weiterschreiben kann^^.