パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
コントロール配列 (準備中)
--------------------------------------------------------------------------------
Visual Basic(VB4〜VB6)ではデザイン時にコントロール配列を使うことができました。
Visual Basic(VB4〜VB6)におけるコントロール配列について。
--------------------------------------------------------------------------------
ViB.net(VB2005〜)はデザイン時にコントロール配列を配置することができず、コードの中で配置
する方法をとります。ViB.net(VB2005〜)におけるコントロール配列の使い方は「VB.netのコントロール配列」
をご参照下さい。
また、コントロール配列とオブジェクト変数の配列は似ているように見え混同しがちですが、性質や用途が異なります。
オブジェクト変数の配列は「 」をご参照下さい。
Visual Basic(VB4〜VB6)をこのページではVBと記載します。
コントロール配列とは、同じ種類のコントロール(Button, Label, TextBoxなど)を配列のようにまとめて
管理する仕組みです。
コントロール配列についてどういうものか具体例をあげてみます。
画像1は15パズルゲームの画面ですが、1〜15と空白の4×4の16マスはlabel(ラベル)で作成しています。
Labelを16個配置していくと、デフォルトでは、nameプロパティがLabel1, Label2,Label3,
... Label15, Label16
というLabelが作成されます。
これらの16個のラベルは「空白と隣接しているマスは空白と入れ替えることができる」という共通の動作を
します。なので、Label1〜Label16にそれぞれにその動作をするコードを書くよりは、Label1でLabel1(0)〜Label1(15)
という配列を作って管理すれば、はるかに簡潔で管理しやすいプログラムになります。
このようにコントロール配列を使うことにより、同じような動作をする複数のコントロールを1つのイベントプロシージャで
処理することができるようになります。
(画像1)
コントロール配列を作成する方法としては、@デザイン時に配置する方法と、Aコード内で動的に生成する方法
があります。
(1)デザイン時に配置する
図2はLabel1(0)のプロパティウィンドウです。
ここでは、IndexプロパティとNameプロパティに注目してください。
NameはLabel1で、Indexは0に設定しています。
NameをLable1のままで、Indexを1,2,3...に設定することで、Label1(1), Label1(2),
Label1(3), ... とLabel1の
配列を作ることができます。
(図2)
(2)コードの中で動的に配置する。
@コントロールの雛型を作成する
まず、Form上に雛型となるコントロールを1つ配置します。雛型になるコントロールはIndex=0にしておきます。
(これがLabel1(0)とする)
ALoadメソッドを使って追加していく
Form上のLabel1(0)をテンプレートにして以下のようにLoadメソッドでLable1の配列を追加していくことができます。
Loadで追加されたコントロールはテンプレートになったコントロールのプrッパティを引き継ぎますが、Index, Tabindex,
Visibleの値はコピーされません。Visibleはデフォルトで非表示なので、表示するにはVisible=Trueにします。
コントロール配列の不要になった要素(Index)を削除するときは、Unloadメソッドを使い
Unload Label1(n) のようにします。
削除されたコントロール配列にはアクセスできなくなります。
また削除されたIndexに次の要素(Index)が自動的に詰められるということはなく、削除された要素(Index)は空のまま残ります。
削除された要素(Index)を再利用する時は、Load Label1(n) のように再度loadメソッドで追加します。
For i = 1 to 15 Load Label1(i) Lable1(i).Left = Label1(0).Left + (i Mod 4) * 50 Label1(i).Top = Label1(0).Top + (i \ 4) * 50 Label1(i).Visible = True Next
コントロール配列になったコントロールは1つのイベントプロシージャで処理できるようになります。
上記の15パズルの例ではLabel1(0)〜Label1(15)が1つのイベントプロシージャで処理できます。
通常のコントロールのイベントプロシージャにはIndexという引数はありませんが、
コントロール配列のイベントプロシージャにはIndexという引数があります。
この引数Indexにコントロール配列のIndexの値が入りますので、この引数Indexを使って
どの要素(Index)のイベントが発生したのかを知ることができます。
参考までに15パズルのコントロール配列のLabel1のイベントプロシージャのコードを掲載しておきます。
引数Indexにクリックされたマス(コントロール配列 Label1)のIndexの値が渡されます。
spaceという変数には空白のマスの位置情報が入っており、Indexとspaceを比較することにより、
位置の入れ替えができるかどうか判断し、入れ替え処理をしています。
詳しい説明は「15パズル」をご参照下さい。
Private Sub Label1_Click(Index As Integer) If (space = 1 Or space = 2 Or space = 5 Or space = 6 Or space = 9 Or space = 10 Or space = 13 Or space = 14) And (Index - 1 = space Or Index + 1 = space Or Index - 4 = space Or Index + 4 = space) Then Label1(space).Caption = Label1(Index).Caption Label1(Index).Caption = "" space = Index End If If (space = 0 Or space = 4 Or space = 8 Or space = 12) And (Index - 1 = space Or Index - 4 = space Or Index + 4 = space) Then Label1(space).Caption = Label1(Index).Caption Label1(Index).Caption = "" space = Index End If If (space = 3 Or space = 7 Or space = 11 Or space = 15) And (Index + 1 = space Or Index - 4 = space Or Index + 4 = space) Then Label1(space).Caption = Label1(Index).Caption Label1(Index).Caption = "" space = Index End If k = k + 1 flag = 0 For i = 0 To 15 If Label1(i).Caption = i + 1 Then flag = flag + 1 Next Label2.Caption = k Label3.Caption = flag If flag = 15 Then MsgBox (Str(k) + "回で完了") End Sub