はるさんの プログラミング講習 ?題
複数イベントの共有
VB6.0で便利だった「コントロール配列」が VB.netで使えなくなったので、そのかんたんな代替方法
このページでは、「複数のコントロールのイベント」を 「ひとつのプロシージャで共有(まとめて受け取る)方法」について。
● VB6.0
フォーム ソース Private Sub Command1_Click(Index As Integer) MsgBox (CStr(Index) + "が押されました。") End SubVB6.0では、コントロールを(同一フォーム上で ) コピー&ペーストすると、
コントロールを配列にすることができた。
これにより、複数のコントロールを、ひとつのイベントプロシージャで取り扱うことができた。
サンプルソースでは、押されたボタンのインデックス番号(Index)を表示している。
● VB.net
VB.net では、コントロールを コピー&ペーストしても、配列にはならない。
コントロールの配列の概念がなくなったからだ。※参考
VB 6.0 ユーザーのための VB .NET 移行ガイド - 標準コントロール
コントロール配列
Visual Basic 6.0 のコントロール配列をアップグレードすると、Visual Basic 6.0 互換機能を利用
して、コントロール配列を利用するプログラムに置き換えられ、従来と同様の動作をします。http://www.microsoft.com/japan/msdn/net/vbtransitionguide/chapter5/chapter5_4.asp
それはいいんだけど、肝心なのは VB.netで 配列するには どうすりゃいいの?だろ。
ところが、これの対応方法について 書かれているページがない!非常に不親切で、たとえば こんなカンジ↓
http://www.microsoft.com/japan/msdn/vbasic/techinfo/upgrade/transition/default.asp
Visual Basic 6.0 コントロール配列とは、同じ名前および種類を共有するコントロールのグループです。同じイベント プロシージャを共有しています。コントロール配列には少なくとも要素が 1 つあり、システム リソースと使用可能なメモリ容量に応じて要素が増加します。コントロール配列が同じ要素には、固有のプロパティが設定されています。
Visual Basic .NET Windows Form アーキテクチャでは、コントロール配列が使用されていた多くのケースをネイティブに処理します。たとえば Windows Forms では、単一のイベント ハンドラを使用して、複数のコントロール上で複数のイベントを処理することができます。
アップグレード ウィザード 互換ライブラリの Control Array Windows Forms 拡張コントロールにこの機能が組み込まれています。
わけわからん。だから どう代替せいっ ちゅうねん。
できます、は わかったから、方法を書け!っての。
万事こんな調子だから、VB.net は、VB6.0 に敬遠されたんだよ(5年間も)。
● こうする!
んとね。 VB.net では、プロシージャ名は、イベントに連動しない。
Handles に始まる イベントハンドル名を指定することで、そのプロシージャが イベントプロシージャになる。
そこで、まず ひとつめのボタンで イベントプロシージャを作る。
そして、以下のように イベントハンドルを カンマ区切りで書き足せばいい。
これで、複数のイベントをひとつのプロシージャで処理できるようになる。
フォーム & ソース Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click, Button2.Click, Button3.Click MessageBox.Show("タブインデックス " + sender.tabindex.ToString + " が押されました。") End Sub
VB.net の「ハンドラー」で イベント処理するやり方って、いい言語仕様だよ。
(VC++では標準的な仕様だったけどね)
これのおかげで、自由度がひろがることが多い。
たとえば、ダブルクリックでも 同じプロシージャで処理をしたければ、 Handles に Button1.DoubleClick を追加するだけでいいでしょ。
しかも、異なるコントロール(たとえばラベルコントロールとか)のイベントを統合・含めることもできるし。
(従来の コントロール配列では 同種のコントロ−ルでないとイベント共有はできなかったでしょ)
また、senderクラス で受け取るのも便利。
sender からは、呼び出したコントロールの属性を すべて引き出せるから、たとえば「ボタン表面の文字(Text)」も識別基準にできるしね。
イベントの統合の方法は、他にもクラス化・サブクラス化とか あるんだけど、当面は これで充分じゃないかな。
● このページの VB6&VB.netの サンプルソース
Diamond Apricot - SHIODEME-SPT