動的に複数のコントロールを追加するには?


Non  2006-12-22 18:53:02  No: 134681

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

ラベルをひとつ追加するのはできたのですが…。


魔界の仮面弁士  2006-12-22 20:22:36  No: 134682

そういう使い方をするのであれば、コントロール配列にして
Load した方が手っ取り早いですよ。

どうしても Controls.Add にするならば、イベント管理用のクラスを
作るなどの手間が必要になるでしょう。


Non  2006-12-22 22:12:06  No: 134683

魔界の仮面弁士さん、お返事ありがとうございます。

ラベルのキャプションには、実際にはそれぞれ異なる名前が入り、
表示位置もそれぞれことなっています。
コントロール配列にしても同じこと?だと思うのですが、Loadでの書き方を
どうするとよいでしょうか?


Non  2006-12-22 22:44:35  No: 134684

度々、すいません。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


魔界の仮面弁士  2006-12-22 23:26:16  No: 134685

『コントロール配列』と、『コントロールの配列』は別物です。

前者は、デザイン時にコントロールを貼っておき、Index プロパティを
指定しただけのものです。これについては、動的にコントロール増減するために
  Load Label1(1)
でロードしたり、Unload でアンロードしたりできます。
また、インデックスの最大値は、i = Label1.UBound のように
「UBoundプロパティ」で取得できます。

後者は、今回Nonさんが書いたように、コントロール型の配列にSetしたもので、
こちらは Load ステートメントで増やすことができません。
こちらの場合、インデックスの最大値は、i = UBound(Label1) のように、
「UBound 関数」で取得することになります。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加