Mr.Tの場所

特攻野郎Aチームじゃないよー

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  253  : 記事  0  : コメント  3687  : トラックバック  52

ニュース

  • 性別:男
  • 猫1:まる
  • 猫2:もろ
  • 猫3:にゃん左部郎
  • タバコ:男は黙ってJPS
[わんくま同盟] C#, VB.NET 掲示板

書庫

日記カテゴリ

Mr.Tです、こんにちは。


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

http://blogs.wankuma.com/torikobito/archive/2007/10/24/103755.aspx

刈歩 菜良さんのコメント

> Handles Button1.Click, Button2.Click
って、複数イベントをはっつけた時、イベントの発生順序はどうなりますか?

 

発生順に関しては、AddHandlerで行った場合、その行った順番でイベントが発生します。
addHandler Button1.click addressof Test1
addHandler Button1.click addressof Test2
addHandler Button1.click addressof Test3

この場合は、Test1()→Test2()→Test3()と実行されます。
また、
addHandler Button1.click addressof Test1
addHandler Button1.click addressof Test1
と二回登録した場合は、二回Test1 が実行されます。

さらに、Test1に対して、Handles Button1.cllickと書くと、都合3回実行されることになります。

 

この状態でRemoveHandler Button1.Click ,addressof Test1を行うと、登録されているものが一つだけなくなります。

今度は全く実行されません。

これは直前に登録されたものを引っぺがすのではなく、全てざっくりなくなります。

これは内部でListとして扱われているため、登録されたものが一つだけなくなります。

   

さて、Handlesで行った場合は、希望通りの実行はされません。

Private Sub C004(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MsgBox("No1")
End Sub

Private Sub B002(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MsgBox("No2")
End Sub

Private Sub B003(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MsgBox("No3")
End Sub

私のマシン、No3→No1→No2でした。

#希望通りに行う方法があるのかどうかはちょっとわかりませんでした。

コンパイル時にAddHandlerのように登録順番が勝手に決められているのであれば、コンパイルしなおせば順番がかわるのか、
と思いきや変化しませんでした。


なんちゅうか、こっちが指定できない順番が、ソースをコンパイルした時点で変更できないような形で出来上がっているような印象です。

#おそらく、ここらへんはとりこびっちさんは「あたりめーだろ」的にスルーしてくれて、
#Hanldlesで指定したときの順番がどうやって決められているか、について追記してくれるに違いない。

#2007/11/27追記 間違いがあったため修正

投稿日時 : 2007年10月24日 13:47

コメント

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 14:02 とりこびと
私、今勉強中の身ですが?w

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 14:04 とりこびと
・・・といいつつ、いくつか書けることもあるかも、なのであまり期待せずにお待ちくださいw

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 14:06 とりこびと
連投すみません。

>発生順に関しては、AddHandlerで行った場合、その行った順番でイベントが発生します。

これもあながちそうなるとも限らないと考えています。

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 14:11 επιστημη
せんせぇしつもん。

貼ってもいないハンドラを引っぺがしたらどぉなりますか?

# バナナはダメなんですか? 持ってきてないんですけど、それでも没収ですか?


# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 14:24 Ognac
Ognacです。疑問あります、先生。

addHandler Button1.click addressof Test1
addHandler Button1.click addressof Test2
addHandler Button1.click addressof Test3

のように Button1.Clickに Handler句を追加する際に、既に登録済みか否か判定できないものですか?
以前に同様のことをしたかったのですが、デキネェという結論だったのです。
したい事。

if Button1.ClickにTest1が未登録 then addHandler Button1.click addressof Test1

無理っぽいよね。


# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 14:38 IIJIMAS
>さて、Handlesで行った場合は、希望通りの実行はされません。

古いMSDNマガジンの記事ですが
http://www.microsoft.com/japan/msdn/msdnmag/issues/05/06/EventHandling/default.aspx
によりますと、
Handlesだと順番は制御できないと書いてあります。


# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 14:49 とりこびと
>http://www.microsoft.com/japan/msdn/msdnmag/issues/05/06/EventHandling/default.aspx

うほっ、ネタ丸カブリな予感。

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 14:51 刈歩 菜良
ごめんなさい。
実は知ってて質問しました。
(^_^;)

Handles 使うと順番制御できんから嫌いっ!
ちゅーことを言いたかったんっす。
(^.^)

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 14:54 刈歩 菜良
お?
よく見たら私の質問がすっとんきょーだ。
なのに Mr.T さんの解説は望み通り。
さては、Mr.T さんもえすぱー??
# 単なるモヒカンとお(ry

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 15:00 Mr.T
>発生順に関しては、AddHandlerで行った場合、その行った順番でイベントが発生します。
これもあながちそうなるとも限らないと考えています。

IIJIMASさんが指摘しているMSDNマガジン内に
こうあります。
引用--
Invoke メソッドは、各イベント リスナをそれらが追加された順序で呼び出します (この順序を制御することはできません)。Handles 句ではなく、AddHandler ステートメントと RemoveHandler ステートメントを使用するときは、マルチキャスト デリゲートに項目が追加される順序についての制御を開発者が単純に引き継ぎます。アプリケーションが同じイベントの AddHandler ステートメントを呼び出すたびに、そのイベントの新しいリスナがリストの末尾に追加されます。
ここまで--

これによると、末尾追加に追加されていくなら、登録順になるのではないでしょうか?

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 15:08 επιστημη
> これによると、末尾追加に追加されていくなら、登録順になるのではないでしょうか?

ハンドラの追加/削除/発火は再定義できるから"末尾追加とは限らない"とも言えんでねぇの、と。


# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 15:17 とりこびと
>ハンドラの追加/削除/発火は再定義できるから"末尾追加とは限らない"とも言えんでねぇの、と。

いやん♪

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 15:27 Mr.T
>貼ってもいないハンドラを引っぺがしたらどぉなりますか?

なんも出ませんです。
先のMSDNマガジンから判断するにQueueみたいなリストなんじゃないかな、と。
#MSDNマガジンでもリスト、っていってるし。

その考え方でいくなら、リストに対して、これこれに該当するモンを除け、
というループの処理を行うだけで、一回も処理されなくてもエラーにゃならないというとこじゃないかなと。

裏づけがとれなくて非常に申し訳ないです。


# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 15:29 Mr.T
>if Button1.ClickにTest1が未登録 then addHandler Button1.click addressof Test1

未登録であろうがなかろうが、RemoveHandlerしてから、AddHandlerしてしまえば、よさそうです。

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 15:31 Mr.T
>ごめんなさい。
>実は知ってて質問しました。
もちろん、それも想定内(バキ

># 単なるモヒカンとお(ry
ええ、飛行機に乗れません。麻酔で眠っている
間に移動して欲しいです。


# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 15:33 IIJIMAS
C#のお話ですが、イベントハンドラの順番の話題の過去スレありました。
GDNJ
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-38995.htm
MSDNフォーラム
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=2092022&SiteID=7


# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 16:32 刈歩 菜良
> GDNJ
> http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-38995.htm

す、すごすぎる。
さながら神々の祭典ですね。
ら、らべるが高すぎる。

とてつもなく勉強になりました。

# で、登録順ってことでOK?

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 17:21 Mr.T
イベントの実体が、MulticastDelegateであるならば、
イベントの発生順は、MulticastDelegate.GetInvocationList
から返されるリストはDelegateの配列なので順番があります。
しかし、そもそもイベントの実装がMultiCastDelegateであるかどうかは別で、そういう実装をしていない可能性もあるってのが、MSDNフォーラムの囚人さんの言い分なんだな、と。
シャノンさんも、http://blogs.wankuma.com/shannon/archive/2007/06/29/82933.aspx
で、書いてあるんだけど、順番は気にするようなやりかたすんな、と。

つまり、AddHandlerであっても登録順にみえるけど、毎回そうなんじゃとはだーれもいわん、という認識でよいのでしょうかね?


# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 18:25 刈歩 菜良
GDNJではC#言語仕様でdelegateの順序は定義されていて、それを使ってイベントを実現している標準コントロールは登録順と解釈したのですが...

> しかし、そもそもイベントの実装がMultiCastDelegateであるかどうかは別で、そういう実装をしていない可能性もあるってのが(ry

自分でイベントを実装した場合は順序を無視した実装もできるけど、Windows FormやASP.NETでは順番って読みました(仕様上も)。

なので、Windows FormやASP.NETならば順番に依存した処理OKと解釈したのですが...

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/10/24 23:07 Mr.T
>自分でイベントを実装した場合は順序を無視した実装もできるけど、Windows FormやASP.NETでは順番って読みました(仕様上も)。

ぐは、GDNJの方は最後まで読んでなかったです。ILレベルまで落とした結果から判断するに、WindowsFormやASP.NETでは保障される、ってことでOKですね。
ありがとうございます>かるぼさん

# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/11/27 11:39 とりこびと
宿題をいただいていていまさらコメントですが、

>RemoveHandler Button1.Click ,addressof Test1を行うと、今度は全く実行されません。

>これは直前に登録されたものを引っぺがすのではなく、全てざっくりなくなります。

これが再現できなくて困っています。

Public Class Form1

Public Sub New()

InitializeComponent()

AddHandler Button1.Click, AddressOf Test1
AddHandler Button1.Click, AddressOf Test1
RemoveHandler Button1.Click, AddressOf Test1

End Sub

Private Sub Test1(ByVal sender As System.Object, ByVal e As System.EventArgs)

MessageBox.Show("ちょww")

End Sub

End Class

この状態ではハンドラない状態になるってことですよね?


# re: Visual Basic のイベントハンドラの登録でちょっとだけ遊ぶ 2007/11/27 12:22 Mr.T
Mr.Tです、こんにちは。
自分のサンプル探してみたんですが、みつからん(;;)
確かやってみた覚えはあるんだけど、どうやったか覚えてない>にわとり頭

というか、最新のとりこびとさんのエントリからすると、どうしたってオレの書いた話にはならんです。
EventhandlerListであっても、EventHandlerであっても
リストとして登録されることになるので、ざっくり
消えるわけがない!

もいっかい、やってみる...
...やってみた...イベントおきるやん。
...Listなら、全部消えるわけないやん。

消えるわけないやんか!

んがー...ごめんなさい。間違いです。
エントリ内も修正しときます...


# Illikebuisse gewxw 2021/07/04 12:00 pharmacepticacom
hydroxychloroquine usmle https://www.pharmaceptica.com/

# yevjdgwony@live.jp 2022/10/16 10:07 シャネル 時計 コピー
丁寧で迅速な対応で、安心して取引できました。ショップスタッフからの自筆レターも添えられており、好感が持てます。新品品購入では情報と安心感が決め手になります。機会があったらリピートしたいショップです。
シャネル 時計 コピー https://www.b2kopi.com/product/detail.aspx-id=3675.htm

# Test, just a test 2022/12/13 14:32 candipharm.com
canadian generic pills http://candipharm.com

Post Feedback

タイトル
名前
Url:
コメント