Es funktioniert mit einem kleinen Trick auch mit einer normalen Prozedur, allerdings darf man da dann nicht vergessen, dass Delphi intern ja noch den Self-Pointer mitgibt, eine Methode also immer einen versteckten Parameter mehr hat.
Delphi-Quellcode:
procedure DynamicClickProcedure(Self: TObject; Sender: TObject);
begin
{ Self ist immer nil, muss allerdings als Parameter enthalten sein um die richtige Parameterreihenfolge zu gewährleisten }
if Sender is TButton then
ShowMessage('Button ''' + TButton(Sender).Caption + ''' wurde gedrückt');
end;
procedure TForm1.FormCreate(Sender: TObject);
var
NewButton: TButton;
begin
NewButton := TButton.Create(Self);
with NewButton do
begin
Parent := Self;
Caption := 'Neuer Button';
Top := 10;
Left := 10;
Height := 30;
Width := 100;
@OnClick := @DynamicClickProcedure;
end;
end;
@Chakotay: im FormCreate-Event solltest du nie die globale Referenz (in deinem Beispiel "Form1") verwenden, sondern immer nur den Self-Pointer! Das OnCreate-Ereignis wird von der AfterConstruction-Methode aufgerufen. Zu diesem Zeitpunkt ist der Constructor zwar bereits abgearbeitet, allerdings wurde der globalen Variable noch nicht der neue Wert zugewiesen...
Edit: kleinen Fehler korrigiert - thx @ neolithos (nächstes Posting)