Ich habe viele Formulare in meinem Projekt, das das Formular OnClose-Ereignis verwendet. Ich muss jedoch eine andere "generische" OnClose auf alle Formulare in Runtime hinzufügen. Es gibt eine Möglichkeit, nur die neue Ereignismethode hinzuzufügen, anstatt sie zu ersetzen? Das Formular löst also beide OnClose-Ereignisse aus.Delphi - Formular OnClose auf einem vorhandenen zuweisen
Antwort
Es kann immer nur ein Handler einem Ereignis zugewiesen werden.
Was Sie tun könnten, ist die Zuweisung der "generischen" Handler zu jedem Formular OnClose
Ereignis, und dann jedes Formular überschreiben seine virtuelle DoClose()
Ereignis, um ihre lokale Arbeit zu tun. Sie kann die vererbte Methode DoClose()
aufrufen, wenn sie bereit ist, den generischen Handler aufzurufen. Zum Beispiel:
type
TMyForm = class(TForm)
protected
procedure DoClose(var Action: TCloseAction); override;
end;
procedure TMyForm.DoClose(var Action: TCloseAction);
begin
// do something here...
inherited; // <-- call OnClose handler
end;
Die Alternative ist ein Multicast-Delegate für die tatsächlichen Ereignishandler zu implementieren, und dann kann der Delegat andere Handler aufrufe je nach Bedarf. Hier sind ein paar Blogs zu diesem Thema:
Multicast events using generics
MultiCast Events - Part 1
MultiCast Events - Part 2
MultiCast Events - Conclusion
Alternativ können Sie das OnClose
Ereignis ganz ignorieren und ein Observer-Muster implementieren statt (mit DoClose()
die anrufen Beobachter). Hier sind ein paar Blogs zu diesem Thema:
Observer Design Pattern in Delphi
Betrachten Sie Ihre eigene TForm Unterklasse und geben Sie Ihr eigenes zweites Ereignis, das ausgelöst zu schaffen. Anstatt Code in allen Ihren Formularen duplizieren zu müssen, erben Sie ihn, sodass er in jedem Ihrer Formulare verwendet wird. –
Darf ich fragen, warum Sie das generische OnClose zur Laufzeit zuweisen müssen? Wenn ich Code zur Laufzeit anfüge, bedeutet das, dass ich nicht weiß, was der Code zur Entwurfszeit vornimmt. Soweit ich es mir vorstelle, ist dies ein seltener Fall im Aufräum-Code, wie für was OnClose ist. – DrWael
Eigentlich muss ich nur einen Dialog der Bestätigung in jedem Formular hinzufügen. Aber viele Formulare haben bereits ein OnClose-Ereignis, daher kann ich nicht einfach eine neue Methode zuweisen wie: Form.OnClose: = ConfirmationDialog(); oder es wird die existierende Methode ersetzen –