2016-06-16 13 views
2

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

+0

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. –

+0

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

+0

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 –

Antwort

6

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

Delphi and the Observer Pattern

The Observer Pattern