プロが教える店舗&オフィスのセキュリティ対策術

こんばんわ、VB5.0を1週間ほどかじって現在2005に乗り換えたばかりのド初心者です。
(用語の使い方などが間違っている可能性があるかもしれません。おかしなところは指摘していただけるとありがたいです)

VB5.0を使っていたときはコントロール配列を使って簡単にできた事が2005になってコントロール配列を使えなくなったため行き詰ってしまいました。
内容は、ある操作をすると画面にコントロールが1つずつ追加されていき、そのコントロールのプロパティを他のコントロールから操作できるようにする物です。
検索などで情報を集めて、なんとかコントロールを追加していくことができるようにはなったのですが、プロパティを変更するためにコントロールにアクセスする際にエラーになってしまって困っています。

一つだけコントロールが追加された場合は、問題なくプロパティをいじれるのですが、2つ以上追加した場合に最新のコントロール以外のプロパティをいじろうとするとエラーになってしまうのです。
下に私の作りたいプログラムを簡潔にしたサンプルソースを記述させていただきます。
間違いの指摘やアドバイスをいただければ幸いです。


FormにはAddButtonというボタンが一つだけあります。

Dim Index As Integer

Private Buttons() As System.Windows.Forms.Button
Private Labels() As System.Windows.Forms.Label

Private Sub AddButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddButton.Click

Index += 1
Me.Buttons = New System.Windows.Forms.Button(Index) {}
Me.Labels = New System.Windows.Forms.Label(Index) {}

Me.SuspendLayout()

Me.Buttons(Index - 1) = New System.Windows.Forms.Button

Me.Buttons(Index - 1).Text = Index - 1
Me.Buttons(Index - 1).Size = New Size(30, 30)
Me.Buttons(Index - 1).Location = New Point((Index - 1) * 30, 50)

Me.Labels(Index - 1) = New System.Windows.Forms.Label

Me.Labels(Index - 1).Text = Index - 1
Me.Labels(Index - 1).Size = New Size(30, 30)
Me.Labels(Index - 1).Location = New Point((Index - 1) * 30, 100)

AddHandler Me.Buttons(Index - 1).Click, _
AddressOf Me.Buttons_Click

Me.Controls.AddRange(Me.Buttons)
Me.Controls.AddRange(Me.Labels)
Me.ResumeLayout(False)

End Sub

Private Sub Buttons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Labels(sender.text).ForeColor = Color.Red

End Sub

A 回答 (1件)

原因は


>Me.Buttons = New System.Windows.Forms.Button(Index) {}
です。クリックするたびこの部分で配列が全て初期化されています。
配列の中身を保持したまま配列の大きさを変える場合は

ReDim Preserve Me.Buttons(Index-1)

とします。



配列を使わずにlistを使用する方法もあります。

Private Index As Integer
Private lstButtons As New List(Of System.Windows.Forms.Button)()

Private Sub AddButton_Click(ByVal sender As System.Object...省略)

Me.lstButtons.Add(New System.Windows.Forms.Button())
Me.lstButtons.Item(Index).Text = Convert.ToString(Index)
Me.lstButtons.Item(Index).Size = New Size(30, 30)

Index += 1

End Sub
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます!
教えていただいた2通りの方法を試して、両方とも上手く動かせることができました。
今回は、前者の方が現在の作りかけを修正するには楽そうなのでこちらの方法を利用させていただきます。

とても勉強になりました。
お忙しい中、本当にありがとうございました。

お礼日時:2007/05/05 04:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!