Nunja, falls da nochmehr OnClick-Events dazu kommen sollten, heißt das Unwort des Jahres "Observer"...
Sprich, leite den TButton ab und versehe diesen dann mit "Observer" Eigenschaften, am Besten natürlich mit hilfe von Interfaces (geht aber auch ohne)...
Als Ergebniss hast du dann einen Button der soviele OnClick-Events hat wie du magst...
Alles andere wär auch nur wildes rumgeflicke...
Beispiel wär, dass du die Klasse "TMyEventReceiver" mit einer Methode versiehst, die das OnClick-Event bespielt und sich den alten Wert merkt und ihn entsprechend ausführt...
Da mal so ein Flickwerk:
Delphi-Quellcode:
Unit Unit2;
Interface
Uses StdCtrls, Classes;
Type
TMyEventReceiver =
Class
Private
{ Private-Deklaration }
FOwnerButton: TButton;
// Von wo kommt das Event?
FOldOnClick: TNotifyEvent;
// Speichern des alten Events
Procedure SetOwnerButton(
Const Value: TButton );
Protected
{ Protected-Deklaration }
Procedure InternOnClick( Sender: TObject );
Property OwnerButton: TButton
Read FOwnerButton
Write SetOwnerButton;
Property OldOnClick: TNotifyEvent
Read FOldOnClick
Write FOldOnClick;
{ ... }
Procedure MyOwnButton1Click( Sender: TObject );
Public
{ Public-Deklaration }
Destructor Destroy;
Override;
Procedure SetButtonOnClick(
Const aButton: TButton );
Procedure Reset;
End;
Var MyEventReceiver: TMyEventReceiver;
Implementation
Uses Dialogs;
Destructor TMyEventReceiver.Destroy;
Begin
Reset;
// Vor dem freigeben reseten...
Inherited;
End;
Procedure TMyEventReceiver.SetButtonOnClick(
Const aButton: TButton );
Begin
OwnerButton := aButton;
// initialisieren mit dem neuen Button...
End;
Procedure TMyEventReceiver.Reset;
Begin
If Assigned( OwnerButton )
Then Begin // Wenn schonmal initialisiert, dann zurücksetzen
OwnerButton.OnClick := OldOnClick;
// Alter Click
FOwnerButton :=
Nil;
// Owner nil'en
End;
OldOnClick :=
Nil;
// OldOnClick Speicher nil'en
End;
Procedure TMyEventReceiver.SetOwnerButton(
Const Value: TButton );
Begin
Reset;
// Vor einem neubespielen reseten...
If Assigned( Value )
Then Begin // Werte setzen nur, wenn auch was übergeben wurde...
FOwnerButton := Value;
OldOnClick := Value.OnClick;
Value.OnClick := InternOnClick;
End;
End;
Procedure TMyEventReceiver.InternOnClick( Sender: TObject );
Begin
If Assigned( OldOnClick )
Then OldOnClick( Sender );
// Altes Event auslösen, falls es belegt war
MyOwnButton1Click( Sender );
// Deine Funktion...
End;
Procedure TMyEventReceiver.MyOwnButton1Click( Sender: TObject );
Begin
ShowMessage( '
Ich bin im umgeleiteten Event.' );
End;
end.
Der Aufruf in Unit1 sieht das so aus:
Delphi-Quellcode:
unit Unit1;
// Enthält einen Button, dessen Click-Event
// und das FormCreate-Event.
...
implementation
{$R *.dfm}
uses
Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('
Ich bin im Original-Event.');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Unit2.MyEventReceiver.SetButtonOnClick( Button1 );
end;
end.
Hoffe es funktioniert (ist ungetestet...)...
Bye Christian