コントロール配列について

解決


愛新覚羅ふ儀  2006-08-15 16:28:11  No: 96264

どうか、宜しくお願いします。
VB2005ではButton1(0)、Button1(1)、Button1(2)…みたいなコントロール配列が無いそうですが、どのようにしたらコントロール配列の代わりになるでしょうか?教えて下さい。


もげ  2006-08-15 17:28:16  No: 96265

|■ タイトル
|    ・「〜するには?」のような質問形式にしてください。
|    ・「〜について」の形式は好ましくありません。

コントロールの配列を作成する
http://dobon.net/vb/dotnet/control/buttonarray.html

Visual Basic .NET と Visual C# .NET におけるコントロール配列の作成
http://www.microsoft.com/japan/msdn/vs/general/vbtchCreatingControlArraysInVisualBasicNETVisualCNET.aspx

とか。


愛新覚羅ふ儀  2006-08-15 18:01:58  No: 96266

一辺が50のピクチャーボックスを縦横に3つづつ並べて、

①④⑦
②⑤⑧
③⑥⑨

のようにコントロール配列にしようとしました。しかし、エラーだらけでした。すみませんが、何が悪くどのようにしたら良いのか教えて下さい。

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

         'ピクチャーボックスのコントロール配列の作成(ここでは9つ作成)
        Me.PictureBox1 = New System.Windows.Forms.PictureBox1(9) {}

        'ピクチャーボックスのコントロールのインスタンス作成し、プロパティを設定する
        Me.SuspendLayout()
        Dim i As Integer
        For i = 0 To Me.PictureBox1.Length - 1
            'インスタンス作成
            Me.PictureBox1(i) = New System.Windows.Forms.Button
            'プロパティ設定
            Me.PictureBox1(i).Name = i.ToString()
            Me.PictureBox1(i).Text = i.ToString()
            Me.PictureBox1(i).Size = New Size(50, 50)
            Select Case i

                Case (i + 1) / 3 <= 1
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,0)
                Case (i + 1) / 3 <= 2
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,50)
                Case (i + 1) / 3 <= 3
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,100)

            End Select

        Next i

        'フォームにコントロールを追加
        Me.Controls.AddRange(Me.PictureBox1)
        Me.ResumeLayout(False)
    End Sub


Blue  2006-08-15 18:15:23  No: 96267

> エラーだらけでした。
まず、そのエラー内容を載せてください。

> Me.PictureBox1
の型は何でしょうか?

Private PictureBox1() As System.Windows.Forms.PictureBox1

というように、PictureBoxの「配列」型になっていますか?


愛新覚羅ふ儀  2006-08-15 18:24:39  No: 96268

プログラムがはじめから、9つ表示している状態にしたいのです。

ですからPrivate Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

にしたのですが…。

Me.PictureBox1 = New System.Windows.Forms.PictureBox1(9) {}

New System.Windows.Forms.PictureBox1(9) {}
に波線が入り、
その下の
Me.PictureBox1
に全部波線が入ってしまってます。


Blue  2006-08-15 18:28:14  No: 96269

再質問

> > Me.PictureBox1
> の型は何でしょうか?


KG  2006-08-15 18:29:20  No: 96270

どこでなんのエラーが出てるか提示されていませんので全部はわかりませんけど

>Me.PictureBox1(i) = New System.Windows.Forms.Button

まずここが問題のように見えますが。。。


KG  2006-08-15 18:30:09  No: 96271

おおう、ちょっと見てる間にレスが。。。orz


愛新覚羅ふ儀  2006-08-15 18:34:19  No: 96272

[VB.NET]
'ボタンコントロール配列のフィールドを作成
Private testButtons() As System.Windows.Forms.Button

'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    'ボタンコントロール配列の作成(ここでは5つ作成)
    Me.testButtons = New System.Windows.Forms.Button(4) {}

    'ボタンコントロールのインスタンス作成し、プロパティを設定する
    Me.SuspendLayout()
    Dim i As Integer
    For i = 0 To Me.testButtons.Length - 1
        'インスタンス作成
        Me.testButtons(i) = New System.Windows.Forms.Button
        'プロパティ設定
        Me.testButtons(i).Name = i.ToString()
        Me.testButtons(i).Text = i.ToString()
        Me.testButtons(i).Size = New Size(30, 30)
        Me.testButtons(i).Location = New Point(i * 30, 10)
        'イベントハンドラに関連付け
        AddHandler Me.testButtons(i).Click, _
            AddressOf Me.testButtons_Click
    Next i

    'フォームにコントロールを追加
    Me.Controls.AddRange(Me.testButtons)
    Me.ResumeLayout(False)
End Sub

'Buttonのクリックイベントハンドラ
Private Sub testButtons_Click(ByVal sender As Object, _
        ByVal e As EventArgs)
    'クリックされたボタンのNameを表示する
    MessageBox.Show(CType(sender, System.Windows.Forms.Button).Name)
End Sub

のMe.testButtonsを少し替えただけです。


Blue  2006-08-15 18:44:16  No: 96273

ですから、
> のMe.testButtonsを少し替えただけです。

> 'ボタンコントロール配列のフィールドを作成
> Private testButtons() As System.Windows.Forms.Button
の部分は

Private PictureBox1() As System.Windows.Forms.PictureBox1

となっているんですか?
デザイナではPictureBoxは追加していませんよね?


Blue  2006-08-15 18:44:42  No: 96274

訂正
>Private PictureBox1() As System.Windows.Forms.PictureBox1
Private PictureBox1() As System.Windows.Forms.PictureBox


愛新覚羅ふ儀  2006-08-15 19:06:41  No: 96275

Private PictureBox1() As System.Windows.Forms.PictureBox

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

の上部にカキコしたら、下記のように横線が入り、PictureBox1() にも波線が入りました。

   Private PictureBox1() As System.Windows.Forms.PictureBox
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Button1.Text = "スタート"

        'ピクチャーボックスのコントロール配列の作成(ここでは9つ作成)
        Me.PictureBox1 = New System.Windows.Forms.PictureBox1(9) {}

        'ピクチャーボックスのコントロールのインスタンス作成し、プロパティを設定する
        Me.SuspendLayout()
        Dim i As Integer
        For i = 0 To Me.PictureBox1.Length - 1
            'インスタンス作成
            Me.PictureBox1(i) = New System.Windows.Forms.PictureBox
            'プロパティ設定
            Me.PictureBox1(i).Name = i.ToString()
            Me.PictureBox1(i).Text = i.ToString()
            Me.PictureBox1(i).Size = New Size(50, 50)
            Select Case i

                Case (i + 1) / 3 <= 1
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,0)
                Case (i + 1) / 3 <= 2
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,50)
                Case (i + 1) / 3 <= 3
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,100)

            End Select

        Next i

        'フォームにコントロールを追加
        Me.Controls.AddRange(Me.PictureBox1)
        Me.ResumeLayout(False)

    End Sub


Blue  2006-08-15 19:16:02  No: 96276

> 下記のように横線が入り、PictureBox1() にも波線が入りました。
波線のところにマウスを持っていけば、何がまずいのかヒントがでたとおもうのですけど、、、
PictureBox1という変数が、別に宣言されているとかそういうことはないですよね?

再質問
>デザイナではPictureBoxは追加していませんよね?


愛新覚羅ふ儀  2006-08-15 19:55:00  No: 96277

エラーです。

  Private PictureBox1①() As System.Windows.Forms.PictureBox
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        'ピクチャーボックスのコントロール配列の作成(ここでは9つ作成)
        Me.PictureBox1 = New System.Windows.Forms.PictureBox1②(9) {}

        'ピクチャーボックスのコントロールのインスタンス作成し、プロパティを設定する
        Me.SuspendLayout()
        Dim i As Integer
        For i = 0 To Me.PictureBox1.Length ③- 1
            'インスタンス作成
            Me.PictureBox1④(i) = New System.Windows.Forms.PictureBox
            'プロパティ設定
            Me.PictureBox1④(i).Name = i.ToString()
            Me.PictureBox1④(i).Text = i.ToString()
            Me.PictureBox1④(i).Size = New Size(50, 50)
            Select Case i

                Case (i + 1) / 3 <= 1
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,0)⑤
                Case (i + 1) / 3 <= 2
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,50)⑤
                Case (i + 1) / 3 <= 3
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,100)⑤

            End Select

        Next i

        'フォームにコントロールを追加
        Me.Controls.AddRange(Me.PictureBox1⑥)
        Me.ResumeLayout(False)

    End Sub

①PictureBox1はこのclassで' As System.Windows.Forms.PictureBox'として既に宣言されています。

②型'System.Windows.Forms.PictureBox1'は定義されてません。

③'Length'は'System.Windows.Forms.PictureBox'のメンバではありません。

④クラス'System.Windows.Forms.PictureBox'には既定のプロパティが無いため、インデックス処理ができません。

⑤この引数の数を受け付ける'New'がないため、オーバーロードの解決に失敗しました。

⑥型'System.Windows.Forms.PictureBox'の値を'型'System.Windows.Forms.Controlの1次元配列'に変換できません。


愛新覚羅ふ儀  2006-08-15 19:55:52  No: 96278

デザイナ?


Blue  2006-08-15 20:00:29  No: 96279

>①PictureBox1はこのclassで' As System.Windows.Forms.PictureBox'として既に宣言されています。
>③'Length'は'System.Windows.Forms.PictureBox'のメンバではありません。
>④クラス'System.Windows.Forms.PictureBox'には既定のプロパティが無いため、インデックス処理ができません。
>⑤この引数の数を受け付ける'New'がないため、オーバーロードの解決に失敗しました。
>⑥型'System.Windows.Forms.PictureBox'の値を'型'System.Windows.Forms.Controlの1次元配列'に変換できません。
の原因はおそらく
> PictureBox1という変数が、別に宣言されているとかそういうことはないですよね?
です。

再々質問(いい加減回答してください。それとも意味がわからない?)
>デザイナではPictureBoxは追加していませんよね?
追加していなければ、PicutureBox1という変数がすでに宣言されているという状態にはならないと思うが。

>②型'System.Windows.Forms.PictureBox1'は定義されてません。
'System.Windows.Forms.PictureBox1'ではなく
'System.Windows.Forms.PictureBox'


Blue  2006-08-15 20:03:42  No: 96280

> デザイナ?
チャットではないので、こういう質問の仕方はやめてください。

デザイン画面というか、コントロールをフォーム上に追加していったり、
プロパティでいろいろ変更したりする画面です。

そこで、PictureBoxを配置していないか?という質問。
当然同じ名前の変数名があれば、おこられます。
(VBの入門中の入門。わからないようならば、入門書を買って下さい。)


愛新覚羅ふ儀  2006-08-15 20:21:28  No: 96281

フォーム上にPictureBox1がありましたので、削除しました。

  Private PictureBox1①() As System.Windows.Forms.PictureBox
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        'ピクチャーボックスのコントロール配列の作成(ここでは9つ作成)
        Me.PictureBox1 = New System.Windows.Forms.PictureBox(9) {}⑥

        'ピクチャーボックスのコントロールのインスタンス作成し、プロパティを設定する
        Me.SuspendLayout()
        Dim i As Integer
        For i = 0 To Me.PictureBox1.Length ③- 1
            'インスタンス作成
            Me.PictureBox1④(i) = New System.Windows.Forms.PictureBox
            'プロパティ設定
            Me.PictureBox1④(i).Name = i.ToString()
            Me.PictureBox1④(i).Text = i.ToString()
            Me.PictureBox1④(i).Size = New Size(50, 50)
            Select Case i

                Case (i + 1) / 3 <= 1
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,0)⑤
                Case (i + 1) / 3 <= 2
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,50)⑤
                Case (i + 1) / 3 <= 3
                    Me.PictureBox1(i).Location = New Point((i+1)%3* 50,100)⑤

            End Select

        Next i

        'フォームにコントロールを追加
        Me.Controls.AddRange(Me.PictureBox1⑥)
        Me.ResumeLayout(False)

    End Sub

①'PictureBox1'は、このclassで'Friend Dim WithEvents PictureBox1 As System.Windows.Forms.PictureBox'として既に宣言されてます。

③'Length'は'System.Windows.Forms.PictureBox'のメンバではありません。

④クラス'System.Windows.Forms.PictureBox'には既定のプロパティが無いため、インデックス処理ができません。

⑤この引数の数を受け付ける'New'がないため、オーバーロードの解決に失敗しました。

⑥型'System.Windows.Forms.PictureBox'の値を'型'System.Windows.Forms.Controlの1次元配列'に変換できません。


Blue  2006-08-15 20:27:04  No: 96282

>フォーム上にPictureBox1がありましたので、削除しました。
これに付随するイベントは消しましたか?(というか自動で消えるんだっけ?)

>①'PictureBox1'は、このclassで'Friend Dim WithEvents PictureBox1 As System.Windows.Forms.PictureBox'として既に宣言されてます。
より、どこかに PictureBox1 という変数が宣言されているという状態です。

とりあえず、
> Private testButtons() As System.Windows.Forms.Button
に対応する名前を PictureBox1 から変更してみては? PicutureBoxs とか。

それか、もう最初から作り直したほうがよいかも。


愛新覚羅ふ儀  2006-08-15 20:34:18  No: 96283

⑤が残りました。

    Private PictureBoxs() As System.Windows.Forms.PictureBox
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        'ピクチャーボックスのコントロール配列の作成(ここでは9つ作成)
        Me.PictureBoxs = New System.Windows.Forms.PictureBox(9) {}

        'ピクチャーボックスのコントロールのインスタンス作成し、プロパティを設定する
        Me.SuspendLayout()
        Dim i As Integer
        For i = 0 To Me.PictureBoxs.Length - 1
            'インスタンス作成
            Me.PictureBoxs(i) = New System.Windows.Forms.PictureBox
            'プロパティ設定
            Me.PictureBoxs(i).Name = i.ToString()
            Me.PictureBoxs(i).Text = i.ToString()
            Me.PictureBoxs(i).Size = New Size(50, 50)
            Select Case i

                Case (i + 1) / 3 <= 1
                    Me.PictureBoxs(i).Location = New Point((i+1)%3* 50,0)⑤
                Case (i + 1) / 3 <= 2
                    Me.PictureBoxs(i).Location = New Point((i+1)%3* 50,50)⑤
                Case (i + 1) / 3 <= 3
                    Me.PictureBoxs(i).Location = New Point((i+1)%3* 50,100)⑤

            End Select

        Next i

        'フォームにコントロールを追加
        Me.Controls.AddRange(Me.PictureBoxs)
        Me.ResumeLayout(False)

    End Sub

⑤この引数の数を受け付ける'New'がないため、オーバーロードの解決に失敗しました。


Blue  2006-08-15 20:46:35  No: 96284

VB に % 演算子ってありましったっけ?


愛新覚羅ふ儀  2006-08-15 20:47:55  No: 96285

余りを求める演算子て何でしたでしょうか?


Blue  2006-08-15 20:50:47  No: 96286

>余りを求める演算子て何でしたでしょうか?
鸚鵡返しに聞かないで、Googleとかで検索してみてください。
「VB 余り 演算子」をキーワードにすればすぐ見つかります。


愛新覚羅ふ儀  2006-08-15 20:54:34  No: 96287

modでしたね。ではまた明日、実行して問題があれば連絡します。ありがとうございます。すみませんでした。


愛新覚羅ふ儀  2006-08-16 18:48:33  No: 96288

通りましたが、下記にエラーがでました。

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click

        Timer3.Stop()

        Button4.Enabled = False
        Button5.Enabled = False
        Button6.Enabled = False

        If PictureBoxs(0).Image = PictureBoxs(3).Image① And PictureBoxs(3).Image = PictureBoxs(6).Image① Then

            coin = coin + 10

        End If

        If PictureBoxs(1).Image = PictureBoxs(4).Image① And PictureBoxs(4).Image = PictureBoxs(7).Image① Then

            coin = coin + 10

        End If

        If PictureBoxs(2).Image = PictureBoxs(5).Image① And PictureBoxs(5).Image = PictureBoxs(8).Image① Then

            coin = coin + 10

        End If

        If PictureBoxs(0).Image = PictureBoxs(4).Image① And PictureBoxs(4).Image = PictureBoxs(8).Image① Then

            coin = coin + 10

        End If

        If PictureBoxs(2).Image = PictureBoxs(4).Image① And PictureBoxs(4).Image = PictureBoxs(6).Image① Then

            coin = coin + 10

        End If

        Text1.Text = coin

        If coin >= 3 Then

            Button1.Enabled = True

        End If

    End Sub

①演算子'='は、型'System.Drawing.Image'及び'System.Drawing.Image'に対して定義されてません。


Blue  2006-08-16 19:30:27  No: 96289

> ①演算子'='は、型'System.Drawing.Image'及び'System.Drawing.Image'に対して定義されてません。
そのままだと思いますが。
> PictureBoxs(1).Image = PictureBoxs(4).Image
のように、= という比較は出来ないということです。
( = の定義がされていない。どうやって比較するか定義されていないということ。)
どうすればよいかは、調べてみないと知らない。
というか、何をしたいのかはっきりと記述したほうがよいです。

ちゅうか、もうコントロール配列と関係ないですよね?
ここは解決して、別スレッドを立ててください。

※丸付き数字を乱用しているようですが、「機種依存文字」と呼ばれる文字で、
不特定多数の機種で閲覧される可能性があるWeb上の掲示板では、文字化けして見えない人には見えないので、
多くの人の意見をもらうのであれば使わないほうがよいです。


愛新覚羅ふ儀  2006-08-16 19:38:32  No: 96290

解りました。


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

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






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