DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ボタンクリック時の共通前処理・後処理

環境/言語:[VS2005,VB.NET,NET Fremework2.0]
分類:[.NET]

ボタンクリック時の共通的な前処理と後処理を行いたいのですが、
全部のボタンに、共通メソッドを呼び出す処理を記述したくないのですが、
ボタンクリックイベントの何か良い方法はないでしょうか。
これから新規に作成するので、どのような方法でも良いです。
行いたい前処理・後処理は今のところ以下の物を考えています。
●前処理
・自ボタンの抑止
・マウスカーソルを砂時計にする。
・ログ出力
・フォームイベント連動抑止
●後処理
・自ボタンの抑止解除
・マウスカーソルを矢印に戻す。
・ログ出力
■No20818に返信(五右衛門さんの記事)
> ボタンクリック時の共通的な前処理と後処理を行いたいのですが、
> 全部のボタンに、共通メソッドを呼び出す処理を記述したくないのですが、
> ボタンクリックイベントの何か良い方法はないでしょうか。

タイミングさえ保証されれば良いのであれば、OnClick の前と後にイベントを実装して拡張すればよいと思います。
方法としては拡張コントロールが最も容易だとは思います。
じゃんぬねっとさん、ご回答ありがとうございます。
拡張コントロールは作成したことがあるのですが、
以下の部分のコーディング方法がわかりません。
>OnClick の前と後にイベントを実装して拡張すればよいと思います。
もう少し、ご教授していただけないでしょうか。
よろしくお願いします。
こんな感じに作成して実験したところ、うまくできたようです。
「変だぞ?」、「こっちの方が良いぞ」って箇所や方法がありましたらご指摘ください。
使用する側は、MainProcessingイベントに主処理を書いてもらうつもりです。
本当は、CustomButton_Clickイベントにいつものように書きたいですが、無理でしょうね。
じゃんぬねっとさん、ありがとうございました。

Public Class CustomButton
Inherits System.Windows.Forms.Button
Public Event Preprocessing(ByVal sender As Object, ByVal e As EventArgs)
Public Event MainProcessing(ByVal sender As Object, ByVal e As EventArgs)
Public Event Postprocessing(ByVal sender As Object, ByVal e As EventArgs)

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)

'カスタム描画コードをここに追加します。
End Sub

Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
' 前処理イベント発生
RaiseEvent Preprocessing(Me, e)
' 主処理イベント発生
RaiseEvent MainProcessing(Me, e)
' 後処理イベント発生
RaiseEvent Postprocessing(Me, e)
End Sub

Private Sub CustomButton_Preprocessing(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Preprocessing
Debug.Print("前処理")
End Sub

Private Sub CustomButton_Postprocessing(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Postprocessing
Debug.Print("後処理")
End Sub

End Class
解決済み!
> 使用する側は、MainProcessingイベントに主処理を書いてもらうつもりです。
>
> Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
> ' 前処理イベント発生
> RaiseEvent Preprocessing(Me, e)
> ' 主処理イベント発生
> RaiseEvent MainProcessing(Me, e)
> ' 後処理イベント発生
> RaiseEvent Postprocessing(Me, e)
> End Sub

処理を共通化したいということではなかったのですか?
書かれたコードは結局ユーザーに処理を書かせることになり、何も変わりませんが。
CustomButtonを作ったということはみんなにそれを使ってもらうということです。
共通処理が埋め込まれているので書かなくていいですよって。

なので、イベント発生ではなくて、そこに共通化したい処理を書き提供するのです。
2007/10/29(Mon) 16:31:23 編集(投稿者)
2007/10/29(Mon) 16:31:17 編集(投稿者)

■No20823に返信(まどかさんの記事)
> 処理を共通化したいということではなかったのですか?
> 書かれたコードは結局ユーザーに処理を書かせることになり、何も変わりませんが。
> CustomButtonを作ったということはみんなにそれを使ってもらうということです。
> 共通処理が埋め込まれているので書かなくていいですよって。
>
> なので、イベント発生ではなくて、そこに共通化したい処理を書き提供するのです。

うぉ。そうでした。何でもイベントにしなきゃって思ってしまっていました。
ご指摘ありがとうございます。
前処理と後処理は、private subにすることにします。

' 前処理
Call doPreprocessing()
' 主処理イベント発生
RaiseEvent ButtonClick(Me, e)
' 後処理
Call doPostprocessing()
解決済み!
> ' 前処理
> Call doPreprocessing()
> ' 主処理イベント発生
> RaiseEvent ButtonClick(Me, e)
> ' 後処理
> Call doPostprocessing()

主処理は、通常のユーザーが期待するイベントのはずですので
基底のButtonのClickを発生させます。

MyBase.OnClick(e)

これが無いと、CustomButton.Clickイベントが発生しません。
目的からはこれを殺して独自のイベントを発生させる必要は無いでしょう。

と言いつつ、じゃんぬさんが
> OnClick の前と後にイベントを実装して拡張すればよいと思います。
と書かれてますね。
結局、ユーザーが処理するためのトリガーを用意するのか、コントロールに押し込めてしまうかの違いです。
解決済み!
2007/11/01(Thu) 12:51:45 編集(投稿者)

おおっ!ご指摘ありがとうございます。
本当に、勉強になりました。
じゃんぬねっとさん、まどかさん有難うございます。

■No20825に返信(まどかさんの記事)
>> ' 前処理
>> Call doPreprocessing()
>> ' 主処理イベント発生
>> RaiseEvent ButtonClick(Me, e)
>> ' 後処理
>> Call doPostprocessing()
>
> 主処理は、通常のユーザーが期待するイベントのはずですので
> 基底のButtonのClickを発生させます。
>
> MyBase.OnClick(e)
>
> これが無いと、CustomButton.Clickイベントが発生しません。
> 目的からはこれを殺して独自のイベントを発生させる必要は無いでしょう。
>
> と言いつつ、じゃんぬさんが
>>OnClick の前と後にイベントを実装して拡張すればよいと思います。
> と書かれてますね。
> 結局、ユーザーが処理するためのトリガーを用意するのか、コントロールに押し込めてしまうかの違いです。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板