Einzelnen Beitrag anzeigen

Benutzerbild von Kedariodakon
Kedariodakon

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

Re: "inherited" für umgeleitetes Event

  Alt 17. Mär 2007, 17:57
Zitat von Guido Eisenbeis:
Davon habe ich auch alles verstanden bis auf eins:

In Unit1 wird ein Feld "FButon1EventHandler" angelegt. Bis hierhin ist das klar. Dann wird aber noch ein Property "Buton1EventHandler" angelegt, das lediglich in das Feld hineinschreibt oder daraus ausliest. Wozu dient der indirekte Weg über dieses Property?
Öhm ka, hab ich einfach so gemacht, kann man auch ohne Property machen... Ist also nichts wildes, hatte glaub ich vorher noch eine SetButon1EventHandler um Irgendwas zu testen...



Zitat von Guido Eisenbeis:
Die brennende Frage ist nun: Warum funktioniert das? Oder funktioniert es nicht wirklich?
Jain, funktionieren schon aber nicht sauber!, zum einen:

Du erzeugst jedesmal solch eienn Eventhandler:
Delphi-Quellcode:
procedure InitClickEventRetouring(Ctrl: TObject);
begin
  MyEventReceiver := TMyEventReceiver.Create; // <- "Knackpunkt" !
  { ... }
end;
Aber du gibst schlussendlich nur einen frei!
Delphi-Quellcode:
finalization
  MyEventReceiver.Free;
Da musst du dir was anderes einfallen lassen, z.b. eine Liste mit Eventhandlern oder ähnliches....


So der nächste wichtige Punkt, du überprüfst nicht ob es vorher überhaupt ein Event gab!
Delphi-Quellcode:
procedure TMyEventReceiver.ClickIntern(Sender: TObject);
begin
  { ... }
  OnClickOrig(Sender);
end;
Das solltest du ändern in:
Delphi-Quellcode:
procedure TMyEventReceiver.ClickIntern(Sender: TObject);
begin
  { ... }
  If Assigned( OnClickOrig ) Then OnClickOrig(Sender);
end;
Sprich du schaust erstmal ob der Methodenzeichner belegt wurde, bevor du ihn ausführst...


Als leztes nur eine kleine Anmerkung:
Delphi-Quellcode:
procedure InitClickEventRetouring(Ctrl: TObject);
begin
  {...}
  TButton(Ctrl).OnClick := MyEventReceiver.ClickIntern;
end;
Hier solltest du eventuell nachschaun, ob Ctrl überhaupt ein Wert hat! Aber viel wichtiger, udem kann da ein Wert übergeben werden, der gar keine OnClick Ereigniss hat, bzw. schon gar nicht ein TButton ist!

Da gehört also sowas hin wie:
Delphi-Quellcode:
procedure InitClickEventRetouring(Ctrl: TObject);
begin
  {...}
  If Assigned( Ctrl ) And ( Ctrl Is TButton ) Then TButton(Ctrl).OnClick := MyEventReceiver.ClickIntern;
end;
das wärs erstmal von meinen Anmerkungen....

Bye Christian
Christian
  Mit Zitat antworten Zitat