<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>VisualBasic</title><link>http://blogs.wankuma.com/kzt/category/2042.aspx</link><description>VisualBasicに関するエントリ</description><managingEditor>kazuto</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>kazuto</dc:creator><title>[VB][C#] イベントアクセサ</title><link>http://blogs.wankuma.com/kzt/archive/2009/03/25/170208.aspx</link><pubDate>Wed, 25 Mar 2009 20:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/kzt/archive/2009/03/25/170208.aspx</guid><wfw:comment>http://blogs.wankuma.com/kzt/comments/170208.aspx</wfw:comment><comments>http://blogs.wankuma.com/kzt/archive/2009/03/25/170208.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kzt/comments/commentRss/170208.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kzt/services/trackbacks/170208.aspx</trackback:ping><description>イベントにはイベントアクセサと言うものがありますが、VBでのイベントアクセサに少し違和感。&lt;br&gt;
発端はVBでのイベントアクセサに指定するデリゲートは「戻り値の型を持つ事が出来ない」事からです。&lt;br&gt;
&lt;br&gt;
VBではコードによるイベントのアタッチは下記の方法が一般的には使用されているように見えます。&lt;br&gt;
(あくまでも自分の経験上です）&lt;br&gt;
&lt;br&gt;
&lt;div class="code"&gt;
&lt;div style="font-family: メイリオ; font-size: 8pt; color: black; background: white;"&gt;
&lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt; Button1.Click, &lt;span style="color: blue;"&gt;AddressOf&lt;/span&gt; Button1_Click
&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
C#でのアタッチ方法はこのようにします。&lt;br&gt;
&lt;br&gt;
&lt;div class="code"&gt;
&lt;div style="font-family: メイリオ; font-size: 8pt; color: black; background: white;"&gt;
Button1.Click += Button1_Click;
&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
この二つを比較すると、自分は断然C#の方が「&lt;span style="color: lightblue; font-size: 12pt;"&gt;&lt;b&gt;ButtonのClickイベントにイベントハンドラを&lt;span style="color: yellow; font-size: 15pt;"&gt;登録して！&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;」のように感じます。&lt;br&gt;
VBでのイベントアタッチは「&lt;span style="color: lightblue; font-size: 12pt;"&gt;&lt;b&gt;ButtonがClickされたら、イベントハンドラを&lt;span style="color: yellow; font-size: 15pt;"&gt;呼んでね♪&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;」って感じます。&lt;br&gt;
&lt;br&gt;
どちらも角度を変えた言い方であってどちらも正解だと思うのですが、VBではキーワードを使用した定義が多い為か、「呼んでね♪」って印象が植えつく理由の一つとして「キーワードが多い」事かな？って感じてます。&lt;br&gt;
イベントアクセサの実装をスタートとして、VBで実現不可の実装を「目的のみ達成するアプローチ」を試しにやってみます。&lt;br&gt;
&lt;br&gt;
- VB -&lt;br&gt;
&lt;div class="code"&gt;
&lt;div style="font-family: メイリオ; font-size: 8pt; color: black; background: white;"&gt;
&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; Sample
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; funcList &lt;span style="color: blue;"&gt;As&lt;/span&gt; Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;) = &lt;span style="color: blue;"&gt;Function&lt;/span&gt;() &lt;span style="color: blue;"&gt;False&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Custom&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt; Func &lt;span style="color: blue;"&gt;As&lt;/span&gt; Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; Action(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;String&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; funcList = &lt;span style="color: blue;"&gt;DirectCast&lt;/span&gt;([Delegate].Combine(funcList, value), Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;AddHandler&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; funcList = &lt;span style="color: blue;"&gt;DirectCast&lt;/span&gt;([Delegate].Remove(funcList, value), Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;RemoveHandler&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt;()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; OnFunc()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;RaiseEvent&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Event&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnFunc()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; func &lt;span style="color: blue;"&gt;As&lt;/span&gt; Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;) &lt;span style="color: blue;"&gt;In&lt;/span&gt; funcList.GetInvocationList()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; func &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; result &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt; = func()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
- C# -&lt;br&gt;
&lt;div class="code"&gt;
&lt;div style="font-family: メイリオ; font-size: 8pt; color: black; background: white;"&gt;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Sample&lt;/span&gt;
&lt;br&gt;{
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; funcList = () =&amp;gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; Func
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;add&lt;/span&gt; { funcList += &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;remove&lt;/span&gt; { funcList -= &lt;span style="color: blue;"&gt;value&lt;/span&gt;; }
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;virtual&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnFunc()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;gt; func &lt;span style="color: blue;"&gt;in&lt;/span&gt; funcList.GetInvocationList())
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (func != &lt;span style="color: blue;"&gt;null&lt;/span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; result = func();
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;br&gt;}
&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
上記実装ではVBではコンパイルエラーになります。これはVBでのイベントアクセサでは「&lt;b&gt;イベントに戻り値の型があるデリゲートは指定出来ない&lt;/b&gt;」という仕様があるためです。&lt;br&gt;
なのでこの問題を回避する為に、イベントアクセサを使用せずイベントアクセサメソッドを実装して回避します。&lt;br&gt;
&lt;br&gt;
&lt;div class="code"&gt;
&lt;div style="font-family: メイリオ; font-size: 8pt; color: black; background: white;"&gt;
&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; Sample
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; funcList &lt;span style="color: blue;"&gt;As&lt;/span&gt; Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;) = &lt;span style="color: blue;"&gt;Function&lt;/span&gt;() &lt;span style="color: blue;"&gt;False&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; AddFunc(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; funcList = &lt;span style="color: blue;"&gt;DirectCast&lt;/span&gt;([Delegate].Combine(funcList, value), Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; RemoveFunc(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; value &lt;span style="color: blue;"&gt;As&lt;/span&gt; Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; funcList = &lt;span style="color: blue;"&gt;DirectCast&lt;/span&gt;([Delegate].Remove(funcList, value), Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overridable&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnFunc()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; func &lt;span style="color: blue;"&gt;As&lt;/span&gt; Func(&lt;span style="color: blue;"&gt;Of&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt;) &lt;span style="color: blue;"&gt;In&lt;/span&gt; funcList.GetInvocationList()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; func &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; result &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;Boolean&lt;/span&gt; = func()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
もうこの時点で「Eventキーワード」を捨てる事になり、そのクラスを使用する側への提供アプローチを変える必要があります。&lt;br&gt;
また外部よりイベントを発行を行わせない為にも、「funcList」変数は外部に公開出来ません。&lt;br&gt;
イベントとして外部からはもう見えないので、イベントアクセサメソッドのみしか残らないので、使用する側からしたら「&lt;span style="color: lightblue; font-size: 12pt;"&gt;&lt;b&gt;なんでAddFuncやRemoveFuncが必要なのよ！！！！&lt;/b&gt;&lt;/span&gt;」と言われちゃいます。&lt;br&gt;
&lt;br&gt;
「&lt;span style="font-size: 8pt;"&gt;いやいや・・・。イベントとして実装出来ないから、イベントハンドラをデリゲートリストに登録して頂きたく思っているのですが・・・&lt;/span&gt;」って言ってる間に&lt;br&gt;
「&lt;span style="color: yellow; font-size: 18pt;"&gt;&lt;b&gt;イベントハンドラは登録するんじゃなく呼んでもらうんだよっっっ！！！！&lt;/b&gt;&lt;/span&gt;」&lt;br&gt;
&lt;br&gt;
こんな展開になります。&lt;br&gt;
VBでは「RaiseEventキーワード」があるので通常イベント発行はデリゲートを直接呼ぶ事はないですが、C#のようにデリゲートを呼んでイベント発行を行う事も出来るわけで・・。&lt;br&gt;
&lt;br&gt;
まず、戻り値のあるイベント実装ってVBでは見た事ない（出来ない）ので、こんな実装アプローチはしないと思いますが、以前MSDNマガジン2008年9月号で掲載されている&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc785480.aspx" target="_blank"&gt;WPF におけるルーティング イベントとルーティング コマンドについて&lt;/a&gt;内のカスタムコマンドのサンプル実装をVBに落として試していた時に違和感を感じる事になったのがきっかけです。&lt;br&gt;
そもそも言語が違うしこのような物はいっぱいあるんだと思いますが、VB側目線（自分はほぼVB開発が主なので）で見た場合「キーワードを使用して植えついてしまう印象と、目的は達成出来てもキーワードを捨てる事によるギャップ」が凄く感じる件でした。&lt;br&gt;
&lt;br&gt;
結論は「きちんと学習しましょう」になるんだと思いますが、ちょっとした言語の違いを感じる事だったので (^^;&lt;br&gt;
このような言語の違いって見つけて調べるのって何気に楽しいですね。&lt;br&gt;
&lt;br&gt;
ってかC#の開発をやりたいな・・・。&lt;br&gt;
&lt;br&gt;&lt;img src ="http://blogs.wankuma.com/kzt/aggbug/170208.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuto</dc:creator><title>[Windowsアプリケーション][VisualBasic] カスタムコントロールは難しい</title><link>http://blogs.wankuma.com/kzt/archive/2009/01/13/166268.aspx</link><pubDate>Tue, 13 Jan 2009 16:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/kzt/archive/2009/01/13/166268.aspx</guid><wfw:comment>http://blogs.wankuma.com/kzt/comments/166268.aspx</wfw:comment><comments>http://blogs.wankuma.com/kzt/archive/2009/01/13/166268.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kzt/comments/commentRss/166268.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kzt/services/trackbacks/166268.aspx</trackback:ping><description>カスタムコントロールの実装は難しい・・。&lt;br&gt;
&lt;br&gt;
今回、某掲示板の質問で「TextBoxを継承したカスタムコントロールのスマートタグにある"MultiLine"を非表示にしたい。」と言うものがあり、解いてみようと試みたが完全に行き詰まりました。&lt;br&gt;
&lt;br&gt;
まず、System.Windows.Forms.Design.ControlDesignerクラスの派生クラスを実装し、それをカスタムコントロールのDesignerAttributeに指定してみたがこれだと既存のControlDesignerを上書いてしまい継承元のControlDesignerの機能を捨てる事になってしまう。&lt;br&gt;
具体的には既存のControlDesignerの機能を使用しつつも、「既存スマートタグ内のDesignerActionListを無効、または非表示にする」事が出来ないかやってみたが、この手の情報が余りにも無さすぎです・・。&lt;br&gt;
&lt;br&gt;
とりあえずこんな感じの実装をしてみました。&lt;br&gt;
&lt;br&gt;
&lt;div style="font-family: メイリオ; font-size: 8pt; color: black; background: white; padding: 3px;"&gt;
&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System
&lt;br&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.ComponentModel
&lt;br&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.ComponentModel.Design
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; CustomTextBoxActionList
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; DesignerActionList
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; component &lt;span style="color: blue;"&gt;As&lt;/span&gt; IComponent)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.New(component)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetSortedActionItems() &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.ComponentModel.Design.DesignerActionItemCollection
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; items &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; DesignerActionItemCollection()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'&amp;#12392;&amp;#12426;&amp;#12354;&amp;#12360;&amp;#12378;&amp;#12504;&amp;#12483;&amp;#12480;&amp;#12540;&amp;#12450;&amp;#12452;&amp;#12486;&amp;#12512;&amp;#12398;&amp;#12415;&amp;#36861;&amp;#21152;&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; items.Add(&lt;span style="color: blue;"&gt;New&lt;/span&gt; DesignerActionHeaderItem(&lt;span style="color: #a31515;"&gt;"Sample Header"&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; items
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;
&lt;br&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;
&lt;/div&gt;
&lt;br&gt;
このようにカスタムコントロールのスマートタグに追加するSystem.ComponentModel.Design.DesignActionListクラスの派生クラスを作り、確認用にヘッダーアイテムのみ返却。&lt;br&gt;
&lt;br&gt;
次にカスタムコントロールクラスをこんな感じで。&lt;br&gt;
&lt;br&gt;
&lt;div style="font-family: メイリオ; font-size: 8pt; color: black; background: white; padding: 3px;"&gt;
&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System
&lt;br&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.ComponentModel
&lt;br&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.ComponentModel.Design
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; CustomTextBox
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; TextBox
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; DesignerActionList
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.New()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnHandleCreated(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.EventArgs)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.OnHandleCreated(e)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.Site &lt;span style="color: blue;"&gt;Is&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Return&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; designerActionService &lt;span style="color: blue;"&gt;As&lt;/span&gt; DesignerActionService = &lt;span style="color: blue;"&gt;TryCast&lt;/span&gt;(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetService(&lt;span style="color: blue;"&gt;GetType&lt;/span&gt;(DesignerActionService)), DesignerActionService)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; designerHost &lt;span style="color: blue;"&gt;As&lt;/span&gt; IDesignerHost = &lt;span style="color: blue;"&gt;TryCast&lt;/span&gt;(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetService(&lt;span style="color: blue;"&gt;GetType&lt;/span&gt;(IDesignerHost)), IDesignerHost)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; (designerActionService &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;) &lt;span style="color: blue;"&gt;AndAlso&lt;/span&gt; (designerHost &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; lists &lt;span style="color: blue;"&gt;As&lt;/span&gt; DesignerActionListCollection = designerActionService.GetComponentActions(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'&amp;#12371;&amp;#12371;&amp;#12364;&amp;#24494;&amp;#22937;&amp;#12539;&amp;#12539;&amp;#12539;&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; list &lt;span style="color: blue;"&gt;As&lt;/span&gt; DesignerActionList &lt;span style="color: blue;"&gt;In&lt;/span&gt; lists
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; list.GetType().Name = &lt;span style="color: #a31515;"&gt;"TextBoxActionList"&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; designerActionService.Remove(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, list)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.action &lt;span style="color: blue;"&gt;Is&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.action = &lt;span style="color: blue;"&gt;New&lt;/span&gt; CustomTextBoxActionList(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; lists.Contains(action) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; designerActionService.Add(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.action)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;
&lt;/div&gt;
&lt;br&gt;
詳細としては&lt;br&gt;
&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;OnHandleCreatedメソッド内でDesignerActionServiceを取得する。&lt;/li&gt;
&lt;li&gt;取得したDesignerActionServiceのGetComponentActionsメソッドを使用して既存のスマートタグアイテムを取得する。&lt;/li&gt;
&lt;li&gt;既存のスマートタグアイテム("MultiLine")を、DesignerActionServiceのRemoveメソッドを使用して削除する。(今回名前判断をしてますが、他に判定方法が解らなかった・・)&lt;/li&gt;
&lt;li&gt;カスタムスマートタグアイテムをDesignerActionServiceのAddメソッドを使用して追加する。&lt;/li&gt;
&lt;/ol&gt;
このような実装ですが、今までカスタムスマートタグを追加するならDesignerActionServiceクラスを使用して追加すれば良いと思っていたので、削除も同様にDesignerActionServiceクラスを使用して削除すれば良いと思っていたら削除されないわけです。&lt;br&gt;
&lt;br&gt;
カスタムスマートタグアイテムはきちんと追加されるのに既存スマートタグを削除する事が出来ません！！！（キッパリ&lt;br&gt;
そもそも、ここらへんで良く使用するDesigner～ホニャララやIDesigner～ホニャララなどと言った物の分かりやすい情報が上手く見つけれない。&lt;br&gt;
&lt;br&gt;
皆さんはどのようにここらへんの勉強をされてますか？&lt;br&gt;
本当に難しいですね・・・orz&lt;br&gt;&lt;img src ="http://blogs.wankuma.com/kzt/aggbug/166268.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>