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

Option Strict On でのイベントハンドラの関連付けが分かりません。

環境/言語:[Windows7 、 VB.NET]
分類:[.NET]

以下のようなコードを実装しています。

'VB.NET
'ユーザーフォームモジュール

AddHandler Me.KeyDown, AddressOf Me_KeyDown

これは、Option Strict On では、暗黙的な変換ができず、
ビルドエラーになってしまいます。
どのような変換を行えば解決するのでしょうか 
Ctype() ファンクションを使う(?)等でしょうか?

初歩的な質問ですみませんが、宜しくお願いいたします。
■No30766に返信(kane123さんの記事)
> これは、Option Strict On では、暗黙的な変換ができず、
> ビルドエラーになってしまいます。
> どのような変換を行えば解決するのでしょうか 
> Ctype() ファンクションを使う(?)等でしょうか?

Private Sub Me_KeyDown(sender as Object, e as KeyEventArgs)

End Sub

になっていれば大丈夫です。引数の部分が間違っていないでしょうか?

行いたいのはイベントハンドラへの動的な関連付けです。 
Handles 〜 を用いた表記でなく 動的にAddhandlerで行わなければ
ならない事情があります。
■No30768に返信(kane123さんの記事)
>
> 行いたいのはイベントハンドラへの動的な関連付けです。 
> Handles 〜 を用いた表記でなく 動的にAddhandlerで行わなければ
> ならない事情があります。

え? シグネチャが合っていないという適切なアドバイスですよ?
■No30768に返信(kane123さんの記事)
>
> 行いたいのはイベントハンドラへの動的な関連付けです。 
> Handles 〜 を用いた表記でなく 動的にAddhandlerで行わなければ
> ならない事情があります。
Handles 〜 なんて書いてないですが?
すみません。頂いた指摘を元に、自分の現象を掘り下げてみた
ところ、質問がやや間違っておりました。 

おっしゃる通り、私の質問のコードだけを見ると、シグネチャの誤記以外、原因は考えられません。最初に

AddHandler Me.KeyDown, AddressOf Me_KeyDown

と書きましたが
現象を簡略化して伝えるために質問のコードを簡略にしすぎておりました。
このため、回答をミスリードしてしまっていました。本当にすみません。
もう一度、行いたいコードを全て書いて際質問という形にさせて下さい。
以下がコードです。


Option Strict On

Public Class Form2

Private Sub ME_MY_EVENT(ByVal sender As Object, ByVal e As MY_EventArgs) Handles Me.MY_EVENT

Dim EA As MY_EventArgs = CType(e, MY_EventArgs)
' EAを用いた処理

End Sub

Public Event MY_EVENT As EventHandler

Public Class MY_EventArgs
Inherits EventArgs

Public Sub New()

End Sub

End Class

End Class

となっています。
カスタムのイベント「MY_EVENT」は「MY_EVENT_ARGS」 という
System.Eventargsを継承したEventargsを持っています。 

上記のコードは、そのままだと、ビルドエラーになります。
が、回答を参考に、
(ByVal sender As Object, ByVal e As MY_EventArgs)

(ByVal sender As Object, ByVal e As system.eventargs)
に書き換えれば、ビルドは可能になります。

しかし、引き渡された e を用いて処理をするには @ のように
Ctypeを使った変換をハンドラ内に記述する必要が出てきます。
これよりもスマートな記法は無いかと思い、自分で探ってみたところ、
最終形は下記のようになりました。 


Option Strict On

Public Class Form2

Private Sub ME_MY_EVENT(ByVal sender As Object, ByVal e As MY_EventArgs) Handles Me.MY_EVENT

Dim EA As MY_EventArgs = CType(e, MY_EventArgs)

End Sub

Public Event MY_EVENT As MY_EventHandler   ・・・変更
Public Delegate Sub MY_EventHandler(ByVal sender As Object, ByVal e As MY_EventArgs) ・・・追加


Public Class MY_EventArgs
Inherits EventArgs

Public Sub New()

End Sub

End Class

End Class

これでコンパイル可能でした。

結果、やや自己解決となり、申し訳なく思います。
ハンドラやシグネチャそのものに関して不勉強でした。 

shu さん、じゃんぬさん、ありがとうございました。
次回からは、自分の質問内容に抜け要素が無いか気をつける
ように致します。

http://msdn.microsoft.com/ja-jp/library/5z57dxz2(v=vs.80).aspx
今回の質問では、初回レスでとんちんかんな返しをしてしまい、
回答者の方の気分を害されたかもしれません。済みませんでした。
また、第二レスでもソースにインデントが無く、誤字もあり、分かりにくい
表記になってしまっていたことをお詫びします。

次回から気をつけるように致しますので、どうか今後とも
宜しくお願いします。

※本日まで長期不在だったため、「解決済み」にするための本レスも遅くなりました。すみませんでした。
解決済み!

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