Private Function PicBox(ByVal index As Integer) As PictureBox
Return DirectCast(Me.Controls("PicBox" & index.ToString), PictureBox)
End Function
Private Sub Cmdstart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdstart.Click
Timer1.Enabled = True
i = 0
End Sub
Private Sub Cmdstop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdstop.Click
Timer1.Enabled = False
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
PicBoxMain.Image = PicBox(i).Image
i = (i + 1) Mod 4
End Sub
End Class
②
Public Class Form1
Dim i As Integer
Dim x As Integer
Private Function PicBox(ByVal index As Integer) As PictureBox
Return DirectCast(Me.Controls("PicBox" & index.ToString), PictureBox)
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'PicBoxcp.Image = PicBox(0).Image
'PicBoxmy.Image = PicBox(0).Image
PicBoxcp.Image = PicBox0.Image
PicBoxmy.Image = PicBox0.Image
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
i = Int(Rnd() * 3)
→ PicBoxcp.Image = PicBox(i).Image
PicBoxmy.Image = PicBox(x).Image
Select Case i - x
Case 0
TextBox1.Text = "あいこでした。"
Case 1, -2
TextBox1.Text = "あなたの勝ち!"
Case -1, 2
TextBox1.Text = "あなたの負け"
End Select
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
x = 0
End Sub
Sub RadioButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton1.Click
x = RadioButton1.TabIndex
End Sub
Private Sub RadioButton2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton2.Click
x = RadioButton2.TabIndex
End Sub
Private Sub RadioButton3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton3.Click
x = RadioButton3.TabIndex
End Sub
End Class
なお、別の考え方では正常に動作します。
Dim te(3) As PictureBoxと定義して、フォームをロードしたときに、次のように定義して各画像を表示する
プログラムは、正常に動いています。
te(0)=PicBox0
te(1)=PicBox1
te(2)=PicBox2
Private Function PictureBox(ByVal index As Integer) As PictureBox
Return DirectCast(Me.Controls("PictureBox" & index.ToString), PictureBox)
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
PictureBox1.Image = PictureBox(2).Image
End Sub
End Class
そこでおんだんさんのコードから色々な物を取り除きコードを
シンプルな物にしました。
最終的にはフォームの上に2つのImageBoxとButtonが有るだけの
プログラムになりコードは以下になりました。
Private Function PictureBox(ByVal index As Integer) As PictureBox
Return DirectCast(Me.Controls("PictureBox" & index.ToString), PictureBox)
End Function
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
PictureBox1.Image = PictureBox(0).Image
End Sub
もちろんこのコードはエラーにはなりません。
所が驚いたことに、フォームにGroupBoxを置いてその中にPictureBoxを置くと
おんだんさん指摘のエラーが出ます。
この現象はGroupBoxだけではなくPanelやTabControlのコンテナと呼ばれる物に
PictureBoxを載せると発生します。
(おんだんさんのコードもPictureBoxをGroupBoxから出すと正常に
動作すると思います。)
続く..
早速他の掲示板に回答が書かれました。
『Control.Controls プロパティは、自分の直接の子供となるコントロールしか格納していません。』
と言うことだそうです。そこで
Private Function PicBox(ByVal index As Integer) As PictureBox
Return DirectCast(Me.GroupBox1.Controls("PicBox" & index.ToString), PictureBox)
End Function
とコードを書き換えたら正常に動作しました。
私もまだ未熟です。