For Each文を使って、formに複数のラベル(コントロール)を
追加するにはどうしたらいいですか?
Option Explicit
Private WithEvents MyLabel As Label
'動的ラベルの追加
Private Sub Command1_Click()
Set MyLabel = Form1.Controls.Add("VB.Label", "MyLabel")
MyLabel.Caption = "動的ラベル"
MyLabel.Left = 400
MyLabel.Top = 100
MyLabel.Width = 2000
MyLabel.Height = 400
MyLabel.Visible = True
End Sub
ラベルをひとつ追加するのはできたのですが…。
そういう使い方をするのであれば、コントロール配列にして
Load した方が手っ取り早いですよ。
どうしても Controls.Add にするならば、イベント管理用のクラスを
作るなどの手間が必要になるでしょう。
魔界の仮面弁士さん、お返事ありがとうございます。
ラベルのキャプションには、実際にはそれぞれ異なる名前が入り、
表示位置もそれぞれことなっています。
コントロール配列にしても同じこと?だと思うのですが、Loadでの書き方を
どうするとよいでしょうか?
度々、すいません。Loadを使ってこのように書いてみましたが、
エラーになってしまいました。
Private Sub Command2_Click()
Dim i As Integer
Dim Label1() As Label
For i = 0 To 10
Load Form1.Controls.Label1(i)
Label1(i).Caption = "動的ラベル" & CStr(i + 1)
Label1(i).Left = 400
Label1(i).Top = 100 * cnt * 5
Label1(i).Width = 2000
Label1(i).Height = 400
Label1(i).Visible = True
i = i + 1
Next
End Sub
『コントロール配列』と、『コントロールの配列』は別物です。
前者は、デザイン時にコントロールを貼っておき、Index プロパティを
指定しただけのものです。これについては、動的にコントロール増減するために
Load Label1(1)
でロードしたり、Unload でアンロードしたりできます。
また、インデックスの最大値は、i = Label1.UBound のように
「UBoundプロパティ」で取得できます。
後者は、今回Nonさんが書いたように、コントロール型の配列にSetしたもので、
こちらは Load ステートメントで増やすことができません。
こちらの場合、インデックスの最大値は、i = UBound(Label1) のように、
「UBound 関数」で取得することになります。
ツイート | ![]() |