ソース上でコントロール配列を動的に配置する場合の手法が解りません。
フォーム上に貼り付けられたコントロール配列を、動的に可変させるにはLOAD/UNLOADなどで良いようですが、1つめの要素(0)から動的に生成させる事は出来ないものでしょうか?
ご存知の方いらっしゃいましたら、よろしく手ほどきのほどお願いいたします。

A 回答 (5件)

試していませんが、これででょうでしょうか?


---
Private myBtn(9) As VB.CommandButton

Private Sub Form_Load()

Dim i As Integer

For i = 0 To 9
Set myBtn(i) = Form1.Controls.Add("VB.CommandButton", "cmdBtn" & i)
Next
End Sub
    • good
    • 0
この回答へのお礼

完璧に動作確認できました。
発想の転換ですね~。
後はReDim preserve あたりでいけそうですね。
本当に助かりました、ありがとうございます!

お礼日時:2001/06/13 15:21

確認しました。


やはり、起動後は、Indexはさわれませんね。

todo36さんの方法が最適のようです。

セットしておく先は、配列の変わりにCollectionを
使う手もありますね。
    • good
    • 0
この回答へのお礼

わざわざ確認して頂き、ありがとうございます。
Collectionも追々使用していくつもりです。
しかし、いろんな切り口があるんですね~。
VBも奥が深いと痛感してます。
ありがとうございました。

お礼日時:2001/06/14 11:27

現在VB6がさわれない環境にあるので、確認できないのですが(夜まで待っていただければ、自宅でチェックします)、



Dim objBtn As Object

set objBtn = Form1.Controls.Add "VB.CommandButton", "cmdBtn"
objBtn.Index = 0

として、objBtn.Index=0がエラーにならなければ、

Load cmdBtn(1)

が通りそうな気がするのですが。
objBtn.Index=0がエラーになるのであれば、当然cmdBtn(0)がないので、Loadも出来ないと思います。
    • good
    • 0
この回答へのお礼

何回もありがとうございます。書き忘れましたがVB6です。
とりあえずTodo36さんのお答えで壁は越えられましたが、arataさん式の別なアプローチもありそうなので、締め切りは明日にしたいと思います。
このままだと、Set は通りましたが、やはり Load でエラーが出てしまいました。

お礼日時:2001/06/13 15:34

VB6では、Indexが0のコントロールを用意しなくても、動的にコントロールを追加することができます。



Controls.Add

を調べてみて下さい。
これで追加したコントロールのIndexを0に設定することが出来るかどうかは、やってみてないので、わかりません。

VB5以前では、Indexが0のコントロールを用意しないと動的に生成させることはできません。

参考URL:http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/98 …

この回答への補足

ありがとうございます。
Form1.Controls.Add "VB.CommandButton", "cmdBtn"
などとして、
Load cmdBtn(1)
とした場合エラーになるので、最初からコントロール配列としての定義が必要???と思い質問させて頂きました。
フォーム上で配置したコントロール配列には、問題なく増減できるのですが・・・。

補足日時:2001/06/13 13:14
    • good
    • 0

 ただ単に一つめの要素から(0),(1)・・・のようにコントロール配列を順番に生成したいって事ですか?

この回答への補足

早速ありがとうございます。その通りです。
まっさらなフォームにコマンドボタン10個をソースリストから生成するような感じです。
単純なコントロールなら、Addメソードなどで良いのですが、このメソードでは btnMyButton(0) のような配列要素を生成できないようなので・・・。
引き続きご教授くださるとありがたいです。

補足日時:2001/06/13 11:38
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q2次元動的配列の第一引数のみを可変にする

ReDim Preserve aStrSKU(x, 2)
aStrSKU(x, 0) = strPre
aStrSKU(x, 1) = サブ2
aStrSKU(x, 2) = サブ3

x = x + 1

上記のソースをDo Untilでまわしているのですが、
2週目以降にxに1を足して行数だけ増やしたいのですが、
2週目でエラーが発生します。
行数だけ要素数を増やす方法はありますか?

Aベストアンサー

こんな感じで

Structure column
Dim col1 As String
Dim col2 As String
Dim col3 As String
End Structure

Private Sub test()

Dim aStrSKU() As column
Dim x As Integer

Do Until x = 3
ReDim Preserve aStrSKU(x)
aStrSKU(x).col1 = "strPre"
aStrSKU(x).col2 = "サブ2"
aStrSKU(x).col3 = "サブ3"

x = x + 1
Loop

End Sub

Q動的配列が存在(要素が有る)か否かを判定できますか?

VBAで、「For ループが初期化されていません」エラーが発生します。
動的配列が要素0の時に発生するようです。
動的配列の要素が生成された場合だけ、Forループしたいのですが、
どうやって判定すればよいのでしょうか?
-------------------------------
Dim 配列() As Integer
Dim i As Integer
i = 0
If (i < 0) Then ' 本当は真になったり偽になったり
ReDim 配列(0 To i)
配列(i) = a + b
i = i + 1
End If

'' if ★★★ then '' 配列が有るか確認
For Each c In 配列
MsgBox c
Next
'' end if
-------------------------------

Aベストアンサー

こんにちは。

動的配列の要素が生成された時だけ、For ~Loop するなら、#2 さんのご指摘のように、動的配列を生成したときに、フラグを立てるのが一番簡単ですね。配列変数を、Integerと最初から宣言してしまっていますから、それ自体が変化したことを、値を取り出す方法以外には、チェックできませんね。

以下は未知の変数の配列を調べる場合、VBAでは以下のような方法を使います。

 On Error Resume Next
 dummy = 配列(0)
 Err.Clear  'プロシージャ内で、使いまわしする場合は、必要
 On Error GoTo 0
 If dummy <> Empty Then
  For Each c In 配列
   MsgBox c
  Next
 End If
 dummy = Empty 'dummy を使いまわしする場合は、一旦空にする。

Q【VB2005】 実行時に動的にコントロールを作成した後のコントロールへの処理

こんばんわ、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

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

VB5.0を使っていたときはコントロール配列を使って簡単にできた事が2005になってコントロール配列を使えなくなったため行き詰ってしまいました。
内容は、ある操作をすると画面にコントロールが1つずつ追加されていき、そのコントロールのプロパティを他のコントロールから操作できるようにする物です...続きを読む

Aベストアンサー

原因は
>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

原因は
>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 S...続きを読む

Qコード上でコントロール配置

いつもお世話になっております。
コード上でコントロールを配置したいのですが、うまくいきません。

Dim location As New Point(100, 100)
Dim button As Button

button = New Button
button.Height = 50
button.Weight = 50
button.Location = location
button.Visible = True

何が足りないのか・・教えていただきたいです。。

Aベストアンサー

ボタンを配置する先が不明なので、表示されないのでしょう。

Me.Controls.Add(button)

##Weight->Widthの間違い?

ただし、これでボタンが配置できたとしても、イベントの処理
は行えませんよ。

QVBのコントロール配列を二次元配列にする方法

タイトル通りです。
テキストボックスなどをコントロール配列で持つときに二次元配列で持つ方法はないでしょうか?

ご回答の方、宜しくお願いします。

Aベストアンサー

コントロールのIndexプロパティを利用する方法では二次元配列はできません。
しかし、変数としての二次元配列ならできます。

Dim TextBoxes(3, 10) As TextBox

などとすると、テキストボックスの多次元配列ができます。
ただし、この変数にはインスタンスがないので、インスタンスは別に作成してやる必要があります。

以下に例を示します。

名前がTexts、Indexが0のTextBoxを配置します。
フォームモジュールに以下を貼り付けます。

Option Explicit

Private TextBoxes(3, 10) As TextBox

Private Sub Form_Load()

On Error Resume Next
Dim N As Long, M As Long, T As Long

For N = 0 To 2

For M = 0 To 9

T = N * 10 + M
Load Texts(T) 'Load Texts(0)はエラーだが無視される
Set TextBoxes(N, M) = Texts(T)
TextBoxes(N, M).Left = N * 1320
TextBoxes(N, M).Top = M * 300
TextBoxes(N, M).Visible = True

Next M

Next N

End Sub

Private Sub Texts_Click(Index As Integer)

MsgBox "これは(" & (Index \ 10) & ", " & (Index Mod 10) & ")です"

End Sub

この方法を使う場合、TextBoxes(N, M)のIndexプロパティはN * 10 + Mを示すので、注意が必要です。

コントロールのIndexプロパティを利用する方法では二次元配列はできません。
しかし、変数としての二次元配列ならできます。

Dim TextBoxes(3, 10) As TextBox

などとすると、テキストボックスの多次元配列ができます。
ただし、この変数にはインスタンスがないので、インスタンスは別に作成してやる必要があります。

以下に例を示します。

名前がTexts、Indexが0のTextBoxを配置します。
フォームモジュールに以下を貼り付けます。

Option Explicit

Private TextBoxes(3, 10) As TextBox

...続きを読む


人気Q&Aランキング

おすすめ情報