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

UserControlのイベントについて

環境/言語:[Windows XP]
分類:[.NET]

こんにちは お世話さまです。

UserControl内で処理するイベントについて教えて下さい。
on〜と〜のイベント捕捉の使い分けがわかりません。
例えばpaintの場合次が考えられます。
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  処理内容
  MyBase.OnPaint(e) '必要に応じて記入
End Sub

Private Sub TimeZoneNameLableCtl_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
  処理内容
End Sub

このUserControlからこのクラスのインスタンスにpaintイベントを発生させる場合は Me.OnPaint(e)メソッドですが
システムからイベントが発生しこのクラスで処理する場合(paint,mouse等)on〜と〜のどちらで対応するのが正しいのでしょうか?


MS VB2005 サンプルのデジタル時計のImageButtonCtl.vb ではon〜イベント
同じくデジタル時計のTimeZoneNameLabelCtl.vb では〜イベントを使用しています。
デジタル時計サンプル http://go.microsoft.com/?linkid=5104485

宜しくお願いします。
MyBase.On〜がイベント処理の本体と考えてもよいと思います。
したがって、派生クラスでは
機能拡張の際はOn〜をオーバーライド、
イベントを発生させる場合はMe.On〜の呼び出し
でよいと思います。

派生クラスは内側のクラスですから、親のイベントをハンドルするのは考えが逆転していますよね。
2006/08/02(Wed) 22:27:21 編集(投稿者)

■No16932に返信(まどかさんの記事)

まどかさん ありがとうございます。

> MyBase.On〜がイベント処理の本体と考えてもよいと思います。
> したがって、派生クラスでは
> 機能拡張の際はOn〜をオーバーライド、
> イベントを発生させる場合はMe.On〜の呼び出し
> でよいと思います。
>

納得しました。


> 派生クラスは内側のクラスですから、親のイベントをハンドルするのは考えが逆転していますよね。

内側のクラスの意味が理解し辛いのですが子クラスの事でしょうか?
上述は次の事と関係ありますか?

派生クラスで〜イベント(On〜イベントでない)で処理した場合
派生クラスを継承した子クラスで派生クラスの〜イベントが不要の場合困ります。
しかしOn〜イベントなら子クラスで派生クラスのOn〜イベントが何もしないよう
オーバーライドする事が可能という事でしょうか?

宜しくお願いします。
> 派生クラスを継承した子クラスで派生クラスの〜イベントが不要の場合困ります。
> しかしOn〜イベントなら子クラスで派生クラスのOn〜イベントが何もしないよう
> オーバーライドする事が可能という事でしょうか?

継承は縦の関係とすれば、
おっしゃる派生クラス(途中のクラス)の処理をしたくないということは横の関係、
つまりその子クラスは基底クラスを継承して派生クラスと同レベルの存在のように思います。
派生クラスがその親のみを知り親の親を知らないということからも不可能ということになるのではないでしょうか。
実際そのような手段もありませんし。

おっしゃる関係を維持したままであれば、子クラスの実装でMyBaseを呼び出さないで
すべて自前で処理するしかないのではないでしょうか。

#なんか混乱してます。どなたかフォローお願いします。m(_ _)m
ちなみに※を実行したくないという意味ですよね?

Public Class Class1
Inherits TextBox
Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
MessageBox.Show("Class1") ※
MyBase.OnTextChanged(e) ※
End Sub
End Class
Public Class Class2
Inherits Class1
Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
MessageBox.Show("Class2")
MyBase.OnTextChanged(e)
End Sub
End Class
2006/08/03(Thu) 09:17:13 編集(投稿者)

■No16940に返信(まどかさんの記事)
まどかさん有難うございます。
お蔭様で私の頭の中で整理ができました。

> ちなみに※を実行したくないという意味ですよね?
>
> Public Class Class1
> Inherits TextBox
> Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
> MessageBox.Show("Class1") ※
> MyBase.OnTextChanged(e) ※
> End Sub
> End Class
> Public Class Class2
> Inherits Class1
> Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
> MessageBox.Show("Class2")
> MyBase.OnTextChanged(e)
> End Sub
> End Class
>

そうです。この例ですとClass2でClass1の※を実行しない事が可能です。

しかしClass1の※部分の実装が次のような場合を考えてみます。
Private Sub Class1_TextChanged( 〜 ) Handles MyBase.TextChanged
  MessageBox.Show("Class1") ※
End Sub

この場合Class2でClass1の※を実行させない方法は無いと思います。
on〜イベントを使うと実行させる、させないがClass2で制御できますので良いと思えてきました。
〜イベントはインスタンスで使うのですね。
> on〜イベント

On〜はイベントではなく、自身の挙動を変更するためのプロシージャです。
イベントハンドラ(Handles)はイベント通知を受け取った結果、何か処理をおこなうということで
イベントを発生させるオブジェクトを利用しているという立場になります。

という風に考えてみては。
■No16953に返信(まどかさんの記事)

丁寧な回答有難うございました。
お蔭様で違いが区別できるようになりました。
解決済み!

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