どうか、宜しくお願いします。
VB2005ではButton1(0)、Button1(1)、Button1(2)…みたいなコントロール配列が無いそうですが、どのようにしたらコントロール配列の代わりになるでしょうか?教えて下さい。
|■ タイトル
| ・「〜するには?」のような質問形式にしてください。
| ・「〜について」の形式は好ましくありません。
コントロールの配列を作成する
http://dobon.net/vb/dotnet/control/buttonarray.html
Visual Basic .NET と Visual C# .NET におけるコントロール配列の作成
http://www.microsoft.com/japan/msdn/vs/general/vbtchCreatingControlArraysInVisualBasicNETVisualCNET.aspx
とか。
一辺が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
> エラーだらけでした。
まず、そのエラー内容を載せてください。
> Me.PictureBox1
の型は何でしょうか?
Private PictureBox1() As System.Windows.Forms.PictureBox1
というように、PictureBoxの「配列」型になっていますか?
プログラムがはじめから、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
に全部波線が入ってしまってます。
再質問
> > Me.PictureBox1
> の型は何でしょうか?
どこでなんのエラーが出てるか提示されていませんので全部はわかりませんけど
>Me.PictureBox1(i) = New System.Windows.Forms.Button
まずここが問題のように見えますが。。。
おおう、ちょっと見てる間にレスが。。。orz
[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を少し替えただけです。
ですから、
> のMe.testButtonsを少し替えただけです。
の
> 'ボタンコントロール配列のフィールドを作成
> Private testButtons() As System.Windows.Forms.Button
の部分は
Private PictureBox1() As System.Windows.Forms.PictureBox1
となっているんですか?
デザイナではPictureBoxは追加していませんよね?
訂正
>Private PictureBox1() As System.Windows.Forms.PictureBox1
Private PictureBox1() As System.Windows.Forms.PictureBox
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
> 下記のように横線が入り、PictureBox1() にも波線が入りました。
波線のところにマウスを持っていけば、何がまずいのかヒントがでたとおもうのですけど、、、
PictureBox1という変数が、別に宣言されているとかそういうことはないですよね?
再質問
>デザイナではPictureBoxは追加していませんよね?
エラーです。
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次元配列'に変換できません。
デザイナ?
>①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'
> デザイナ?
チャットではないので、こういう質問の仕方はやめてください。
デザイン画面というか、コントロールをフォーム上に追加していったり、
プロパティでいろいろ変更したりする画面です。
そこで、PictureBoxを配置していないか?という質問。
当然同じ名前の変数名があれば、おこられます。
(VBの入門中の入門。わからないようならば、入門書を買って下さい。)
フォーム上に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次元配列'に変換できません。
>フォーム上にPictureBox1がありましたので、削除しました。
これに付随するイベントは消しましたか?(というか自動で消えるんだっけ?)
>①'PictureBox1'は、このclassで'Friend Dim WithEvents PictureBox1 As System.Windows.Forms.PictureBox'として既に宣言されてます。
より、どこかに PictureBox1 という変数が宣言されているという状態です。
とりあえず、
> Private testButtons() As System.Windows.Forms.Button
に対応する名前を PictureBox1 から変更してみては? PicutureBoxs とか。
それか、もう最初から作り直したほうがよいかも。
⑤が残りました。
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'がないため、オーバーロードの解決に失敗しました。
VB に % 演算子ってありましったっけ?
余りを求める演算子て何でしたでしょうか?
>余りを求める演算子て何でしたでしょうか?
鸚鵡返しに聞かないで、Googleとかで検索してみてください。
「VB 余り 演算子」をキーワードにすればすぐ見つかります。
modでしたね。ではまた明日、実行して問題があれば連絡します。ありがとうございます。すみませんでした。
通りましたが、下記にエラーがでました。
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'に対して定義されてません。
> ①演算子'='は、型'System.Drawing.Image'及び'System.Drawing.Image'に対して定義されてません。
そのままだと思いますが。
> PictureBoxs(1).Image = PictureBoxs(4).Image
のように、= という比較は出来ないということです。
( = の定義がされていない。どうやって比較するか定義されていないということ。)
どうすればよいかは、調べてみないと知らない。
というか、何をしたいのかはっきりと記述したほうがよいです。
ちゅうか、もうコントロール配列と関係ないですよね?
ここは解決して、別スレッドを立ててください。
※丸付き数字を乱用しているようですが、「機種依存文字」と呼ばれる文字で、
不特定多数の機種で閲覧される可能性があるWeb上の掲示板では、文字化けして見えない人には見えないので、
多くの人の意見をもらうのであれば使わないほうがよいです。
解りました。
ツイート | ![]() |