HOME >> 山崎はるかのメモ >> プログラミング講習(2)

 はるさんの プログラミング講習 ?題

複数イベントの共有


VB6.0で便利だった「コントロール配列」が VB.netで使えなくなったので、そのかんたんな代替方法

このページでは、「複数のコントロールのイベント」を 「ひとつのプロシージャで共有(まとめて受け取る)方法」について。


VB6.0

フォーム ソース
Private Sub Command1_Click(Index As Integer)

    MsgBox (CStr(Index) + "が押されました。")

End Sub
VB6.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で 配列するには どうすりゃいいの?だろ。
ところが、これの対応方法について 書かれているページがない!

非常に不親切で、たとえば こんなカンジ↓

Visual Basic 6.0

コントロール配列とは、同じ名前および種類を共有するコントロールのグループです。同じイベント プロシージャを共有しています。コントロール配列には少なくとも要素が 1 つあり、システム リソースと使用可能なメモリ容量に応じて要素が増加します。コントロール配列が同じ要素には、固有のプロパティが設定されています。

Visual Basic .NET

Windows Form アーキテクチャでは、コントロール配列が使用されていた多くのケースをネイティブに処理します。たとえば Windows Forms では、単一のイベント ハンドラを使用して、複数のコントロール上で複数のイベントを処理することができます。

アップグレード ウィザード

互換ライブラリの Control Array Windows Forms 拡張コントロールにこの機能が組み込まれています。

http://www.microsoft.com/japan/msdn/vbasic/techinfo/upgrade/transition/default.asp

わけわからん。だから どう代替せいっ ちゅうねん。
できます、は わかったから、方法を書け!っての。

万事こんな調子だから、VB.net は、VB6.0 に敬遠されたんだよ(5年間も)。


こうする!

んとね。 VB.net では、プロシージャ名は、イベントに連動しない。
Handles に始まる イベントハンドル名を指定することで、そのプロシージャが イベントプロシージャになる。

そこで、まず  ひとつめのボタンで
イベントプロシージャを作る。
そして、以下のように イベントハンドルを カンマ区切りで書き足せばいい。

これで、複数のイベントをひとつのプロシージャで処理できるようになる。

フォーム & ソース
 
Private Sub Button1_Click(ByVal sender As System.ObjectByVal 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

■メモエリアに戻る