とりこらぼ。

Learn from yesterday,
live for today,
hope for tomorrow.

目次

Blog 利用状況

ニュース

プロフィール

  • 名前:とりこびと
    とるに足らない人間です。

  • Wankuma MVP
    for '平々凡々'

Web Site

  • Memo(Of T)

もうひとつの Blog

広告っぽい

書庫

日記カテゴリ

Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 -

Visual Basic でなんとなくイベントとデリゲート その2。 - イベント ハンドラ -


前回までで、ごく簡単なイベントの宣言と発生、イベント ハンドラの関連付けについて


なんとなく


わかった気がします。今回は少しだけ補足をしておきますね。


イベントに関連するコードで推奨されていることがあります。(あくまで推奨です。)その1で書いた以下のコードに関してですが、

    Public Property DisplayName() As String
        Get
            Return Me._displayName
        End Get
        Set(ByVal value As String)
            Me._displayName = value
            RaiseEvent DisplayNameChanged(MeNew EventArgs)
        End Set
    End Property

上記コードではDisplayNameプロパティ内でイベントを発生させていますが、イベントを発生させるクラスに OnEventName という名前のプロテクト メソッドを作成し、このメソッド内で対象のイベントを発生させます。(あくまで推奨です。)

今回の場合、OnDisplayNameChanged メソッドを作成します。なお、引数 sender はメソッド内で自身を指定するため、OnDisplayNameChanged メソッドの引数にはしません。

    Protected Sub OnDisplayNameChanged(ByVal e As EventArgs)
        RaiseEvent DisplayNameChanged(Me, e)
    End Sub

DisplayNameプロパティからこのOnDisplayNameChangedの呼び出すことにより、DisplayNameChanged イベントを発生させます。

    Public Property DisplayName() As String
        Get
            Return Me._displayName
        End Get
        Set(ByVal value As String)
            Me._displayName = value
            Me.OnDisplayNameChanged(New EventArgs)
        End Set
    End Property




もう一点はイベント ハンドラとするメソッドの名前についてです。その2で記述した下記のコードに関して、

    Private Sub member_DisplayNameChanged(ByVal sender As ObjectByVal e As System.EventArgs)

    End Sub

イベント センダ名、アンダースコア、およびイベント名を組み合わせた標準名前付け規則を使用します。(あくまで推奨です。)今回の場合、「member_DisplayNameChanged」はすでにその規則に則って書かれていますね♪

Visual Studioが自動生成するイベント ハンドラもそうなっていますよね。(Buttion1_Click)



これらは推奨されているだけでそうしなければならないというわけではありませんが、コメント欄にてご指摘いただきそうなので書いておきました。

また、データバインディングのおべんきょ。その2。で書かせていただいたように、「'プロパティ名' + Changed」というイベント名はその名前が意味を持ちます。(っていうか、リンク先でイベントとかやってるよ・・・。)




え?そろそろおしまい?

・・・

・・・ ・・・

・・・ ・・・ ・・・


またおちがない・・・。


そろそろ画伯に怒られそうです。orz

投稿日時 : 2007年10月24日 11:40

Feedback

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 11:56 επιστημη

> イベント センダ名、アンダースコア、およびイベント名を組み合わせた標準(ry

イベント"レシーバ"名、アンダースコア(ry
ぢゃなくて? センダは引数でもらってんぢゃん。

# そか、ここがボケなんだ。奥ゆかしいなぁ(おほほほ

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 12:06 とりこびと

επιστημη さん、コメントありがとうございます。

>イベント"レシーバ"名、アンダースコア(ry

ではないようですね。
http://msdn2.microsoft.com/ja-jp/library/2z7x8ys3(VS.80).aspx
のイベントハンドラのところに書かれていました。

Handles 句を使用するとすっきりするかな・・・?
動的なものはどうすりゃいいのかな・・・。

>そか、ここがボケなんだ。奥ゆかしいなぁ(おほほほ

そんな深いボケできませんwww

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 12:10 επιστημη

あれ、 違うわ。
button1_Clicked てーのは、
"押されたよ"イベントがbutton1で発生した
→ button1が"押されたよ"てゆった
んだからイベントセンダなのか。

いかん、つっこみそこねた orz

OSが"おまえ押されたポいよ"ってbutton1にゆって、
それを button1_Clicked が処理する。
と解釈すればイベントレシーバやなー...

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 13:07 Streetw☆

Onのメソッドの私の思ってる存在意義ですけど、私の場合、ハンドラ有無判定とイベント引数の準備の2つをOnのメソッドの主な役割にしてます。

VisualBasicではハンドラの有無に関係なくRaiseEventを実行できますけど、C#の場合は
if (DisplayNameChanged != null) { ハンドラの呼び出し; }
というコードを書かないといけないので、これをOnのメソッド内に書いとけばスッキリします。

それと、イベントハンドラへの引数の準備はOnのメソッド内で行うようにしてます。
Onのメソッド自体の引数は、イベントハンドラへの引数に含める値を渡すようにしてるので、この例のOnDisplayNameChangedは、私の場合は引数は持たせないです。

# ちがうだろぉ!? 2007/10/24 13:15 東方算程譚

ちがうだろぉ!?

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 13:18 とりこびと

コメントありがとうございます。

>>επιστημηさん

>いかん、つっこみそこねた orz

ふふふふふふふふふふふふ♪
でもどんどんつっこんでくださいね(次のエントリのネタバレ厳禁w)


>>Streetw☆さん

>Onのメソッドの私の思ってる存在意義ですけど、私の場合、ハンドラ有無判定とイベント引数の準備の2つをOnのメソッドの主な役割にしてます。

ほうほう・・・。

>C#の場合

C♯ではイベントハンドラ無しではイベントが発生できないんですかぁ。メモッときます。

>イベントハンドラへの引数の準備はOnのメソッド内で行うようにしてます。

こうすると、そのクラスを継承してOnDisplayNameChangedをオーバーライドするときってどうなるんですか?
引数をいじってイベントを発生させる場合、
BaseのOnDisplayNameChangedはまったく呼ばないってことでしょうか?

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 13:19 とりこびと

げげっ!コメント書いてる間にεπιστημηさんからトラックバックが・・・おそろしや・・・。

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 14:42 Streetw☆

>イベントが発生できないんですかぁ
ハンドラが割り当てられてないとDisplayNameChanged自体がnullだから、判定しないとC#の書き方では☆のところでNullReferenceExceptionが発生するんです。

protected void OnDisplayNameChanged()
{
 if (DisplayNameChanged != null)
  DisplayNameChanged(this, EventArgs.Empty) '☆
}

>BaseのOnDisplayNameChangedはまったく呼ばないってことでしょうか?
うぅ。どういうことかよくわからないです。
http://torikobito.wankuma.com/ClassLibrary/SilverBouquet.Utility.SimpleCounter.aspx
でのOnPropertyChangedと同じつもりなんですけど。
派生先でオーバーライドして引数の値を変更することはできますし、Baseも呼べますけど。。。
今、「とりこびと」という偉い人とメールしてるので、今度その人に聞いときますw

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 15:00 とりこびと

Streetw☆ さん、コメントありがとうございます。

>うぅ。どういうことかよくわからないです。

やっと意味が分かりました。(遅

イベント引数を完全に内部で生成すると思っていました。<メンバ のプロパティなどから直接値をとって。

おkです♪

# ちがうだろぉ!? 2007/10/24 15:19 東方算程譚

ちがうだろぉ!?

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 16:08 Streetw☆

私もやっと意味が分かりました。(遅遅
次みたく書けばよかったんですね。#あまり変わらないかも?w

>この例のOnDisplayNameChangedは、(イベントハンドラへ渡す値はないので、)私の場合は引数は持たせないです。

>ちがうだろぉ!?
え、違うの?(違w

# re: Visual Basic でなんとなくイベントとデリゲート その3。 - イベントに関連することをちょっとだけ追記。 - 2007/10/24 21:13 さかもと

のりおくれとる!!!!


画伯のりおくれとる!!!


怒るでしかしぃっ!!!!

# Visual Basic でなんとなくイベントとデリゲート その4。 - デリゲートとは? - 2007/10/25 8:54 とりこびと ぶろぐ。

Visual Basic でなんとなくイベントとデリゲート その4。 - デリゲートとは? -

タイトル  
名前  
Url
コメント