Einzelnen Beitrag anzeigen

Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: "inherited" für umgeleitetes Event

  Alt 15. Mär 2007, 00:24
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
Christian
  Mit Zitat antworten Zitat