2016-06-16 4 views
2

フォームOnCloseイベントを使用するプロジェクトには、多くのフォームがあります。 しかし、私は実行時に他の "汎用" OnCloseをすべてのフォームに追加する必要があります。 新しいイベントメソッドを置き換えるのではなく、新しいイベントメソッドを追加する方法はありますか?したがって、フォームは両方のOnCloseイベントをトリガーします。Delphi - 既存のフォームにOnCloseを割り当てよう

+0

は、独自のTFormはサブクラスを作成し、火災そのあなた自身の2番目のイベントを追加することを検討してください。すべてのフォームでコードを複製する必要はなく、各フォームで使用されるように継承します。 –

+0

一般的なOnCloseを実行時に割り当てる必要があるのはなぜですか?実行時にコードをアタッチすると、そのコードが設計時に何をプレフォームするか分かりません。私が想像する限り、これはOnCloseのためのクリーンアップコードのまれなケースです。 – DrWael

+0

実際、すべてのフォームに近い確認のダイアログを追加するだけです。しかし、多くのFormsは既にOnCloseイベントを所有しているので、次のような新しいメソッドを割り当てることはできません。Form.OnClose:= ConfirmationDialog();またはそれは既存のメソッドを置き換えます –

答えて

6

イベントには、一度に1つのハンドラだけを割り当てることができます。

「フォーム」のOnCloseイベントに「汎用」ハンドラを割り当ててから、ローカルの作業を行うために各フォームが仮想DoClose()イベントをオーバーライドするようにすることができます。ジェネリックハンドラを呼び出す準備ができたら、継承されたDoClose()メソッドを呼び出すことができます。たとえば:

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; 

代替は、実際のイベントハンドラのマルチキャストデリゲートを実装するために、必要に応じて、その後、デリゲートは、他のハンドラを呼び出すことができます。 (コールするDoClose()を使用して

Multicast events using generics

MultiCast Events - Part 1
MultiCast Events - Part 2
また MultiCast Events - Conclusion

は、あなたが完全にOnCloseイベントを無視し、代わりにObserverパターンを実装することができます:ここではそのトピックには、いくつかのブログがありますオブザーバー)。ここでは、そのトピックには、いくつかのブログされています

Observer Design Pattern in Delphi

Delphi and the Observer Pattern

The Observer Pattern

関連する問題