こんばんわ、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
No.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
アドバイスありがとうございます!
教えていただいた2通りの方法を試して、両方とも上手く動かせることができました。
今回は、前者の方が現在の作りかけを修正するには楽そうなのでこちらの方法を利用させていただきます。
とても勉強になりました。
お忙しい中、本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル・VBA CheckBoxのオブ...
-
カメラスクロールするのを動画...
-
エクセルVBAでオプションボタン...
-
C#で自分のウインド・ハンド...
-
chr関数の呼び出しで「プロ...
-
excelのリストボックスで選択し...
-
fpSpreadコントロール ライセ...
-
(VBA)スピンボタンの大量...
-
エクセル コントロールツール...
-
ユーザーフォームで動的(Me.Con...
-
Groupboxの配下のコントロール...
-
エクセルVBAユーザーフォーム・...
-
winndws セキュリティ
-
TreeGridView(オープンソース)...
-
ExcelVBAでListViewが使用できない
-
vb.netで画面のコントロールId...
-
Labelコントロールの(左右)余...
-
変数をコントロール型で使用す...
-
複数のコマンドボタン(VBAで)...
-
With~EndWithの省略部分と引数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
全てのオブジェクトのプロパテ...
-
EXCELでactivexコントロールを...
-
エクセルVBAでオプションボタン...
-
vb.netで画面のコントロールId...
-
コンボボックスの文字によるif...
-
ListViewのチェックボックスに...
-
フォーム上の現在アクティブな...
-
変数をコントロール型で使用す...
-
ExcelVBAでListViewが使用できない
-
ユーザーフォームで動的(Me.Con...
-
コントロールを移動できない
-
C#で角が丸いテキストボックス
-
アクセス特有の書き方?
-
間違えて配置してしまったコン...
-
OCXって何ですか?
-
'ckbl' コントロールは作成され...
-
VBAのフォームでTextBoxがいっ...
-
ActiveX DLL と ActiveXコント...
おすすめ情報