Zitat von
Kedariodakon:
Öhm ka, hab ich einfach so gemacht, kann man auch ohne Property machen...
Das hab ich mir gedacht, jetzt hab ich Sicherheit! Thank you!
Zitat von
Kedariodakon:
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:
...
Aber du gibst schlussendlich nur einen frei!
...
DAS war an dieser Stelle die wichtige Frage! Danke für die Info! Ich hasse es, wenn andere Programmierer Anwendungen schreiben, die zwar irgendwie "funktionieren" aber man merkt am Programmverhalten, dass da was nicht sauber läuft. Da bleiben beim Beenden TrayIcons oder Taskbareinträge zurück oder das Programm bleibt zwischendurch hängen. Deshalb bemühe ich mich in meinen Programmen sauber zu arbeiten!
Zitat von
Kedariodakon:
Da musst du dir was anderes einfallen lassen, z.b. eine Liste mit Eventhandlern oder ähnliches....
Mit Arrays habe ich schon oft gearbeitet. Diesmal werde ich mir mal TList vornehmen.
Zitat von
Kedariodakon:
So der nächste wichtige Punkt, du überprüfst nicht ob es vorher überhaupt ein Event gab!
...
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...
Das
hatte ich vorher.
Das ging beim Testen/Probieren verloren.
Das ist ein sehr wichtiger Punkt, denn darum geht es in diesem Thread ja: Es soll ein (Click-)Event abgefangen und zurückgeleitet werden,
falls auch was zum Zurückleiten da ist. Denn sonst könnte ich ja einfach im Original-(Click-)Event meinen ausgelagerten Code aufrufen. Der ausgelagete Code soll aber auch ausgeführt werden, wenn im Form garkein (Click-)Event existiert.
Zitat von
Kedariodakon:
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;
Bye Christian
Dazu habe ich mir auch schon Gedanken gemacht. Das kannst du daran erkennen, dass ich "Ctrl: TObject" verwendet habe. Prinzipiell könnte ich mit den obigen Codes und deiner Abfrage "If Assigned(Ctrl) ..." arbeiten. Aber du weißt ja wie das ist: hat man mal Blut geleckt, will man mehr! Hast du eine Idee, wie ich das OnClick allgemeiner gestalten kann? Also so, dass es für Buttons, Labels, Panels usw. gleichermaßen funktioniert? Ich hatte schon experimentiert, das OnClick selbst anstatt das Control zu übergeben. Das scheiterte jedoch daran, dass es sich nicht als "Var" übergeben lässt und ohne "Var" sich nichts zuweisen lässt.
Ein TypeCasting "(Ctrl as TButton).OnClick := ..." wirft ja bei Fehlern eine
Exception während "TButton(Ctrl).OnClick := ..." gutmütig über ein übergebenes Label hinwegsieht. Das war schonmal mein Ansatz, den Code für mehrere Control-Typen benutzen zu können. Ich hätte es aber gerne noch sauberer!
Gruß,
Guido.