したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

ユーザ定義関数の不具合

1おんだん:2011/01/25(火) 11:16:48
2年ほど前にもユーザ定義関数(コントロール配列)のプログラムを
ご教示していただいた者です。
再度、同じような壁に当たりましたので、ご教示していただけないでしょうか。
よろしくお願いします。

①のコードは、4枚の画像を交互に表示して動画風に見せているプログラムです。
これはエラーもなく正常に動作しています。
4枚の画像のnameはPicBox0、PicBox1、PicBox2、PicBox3の4つです。
なお、以前ご教示していただいた関数を利用したものです。その節には大変丁寧に対応していただき感謝申し上げます。

ところが、②のプログラムはエラーが表示され終了してしまいます。
3枚の画像はグー、チョキ、パーの画像であり、nameはPicBox0、PicBox1、PicBox2の3つです。
②のコードは関数を利用した①と同じようなプログラムですが、→の部分で「System.NullReferenceExceptionの初回例外が
発生した」ということでデバッグが終了します。
①と同じように関数を利用しているのですが、どのように修正すれば、正常に動くプログラムになるか不明です。
さまざまなことを試行的に実施しましたが、私の能力では無理ですので、再度ご教示願えませんでしょうか。


Public Class Form1
Dim i As Short

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

i = Int(Rnd() * 3)
PicBoxcp.Image = te(i).Image
PicBoxmy.Image = te(x).Image

ご教示をよろしくお願いします。

2igoten:2011/01/25(火) 12:56:52
変ですね、特におかしい所は有りませんし、そのコードを
貼り付けて私の環境で実行してみましたが、正常に
動作しました。

3おんだん:2011/01/25(火) 14:19:27
早速返事をいただきありがとうございました。
そこで、再度2003で一から作りなおして実行したところ
次のようなエラーが生じました。どのように直せばよいでしょうか。

今度は、Return DirectCast(Me.Controls("PicBox" & index.ToString), PictureBox)の行で
エラーが発生しました。

○表示内容
System.InvalidCastException' のハンドルされていない例外が
microsoft.visualbasic.dll で発生しました。

追加情報 : 文字列 "PicBox2" から型 'Integer' へのキャストが
有効ではありません。

4おんだん:2011/01/25(火) 14:47:03
Visual Studio.Net 2003のvbで実行していたためのエラーに気がつきました。
そこで、別のコンピュータにインストールされているVisual Studio 2008で
実行したところ、やはり11:16に掲載しましたことと同じ問題が発生し
ました。修正方法を教えてください。

5igoten:2011/01/25(火) 15:16:45
何度やっても私の環境ではエラーは出ません。

このプログラムは要約すると次のようになります。
先ず新しいフォームにPictureBoxを2つと
Buttonを一つ置きます。

そしてコードに
Public Class Form1

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

と書き実行します。
これでエラーが出なければ、コードは正しいと言うことです。

6igoten:2011/01/25(火) 17:54:54
おんだんさん メールの返事遅れて申し訳有りませんでした。
トラブルを解決すると理解が一歩進みますので、頑張って
やってみましょう。

7おんだん:2011/01/26(水) 21:16:28
今日、プロジェクトファイルを圧縮して、指定されたアドレスに
送信しましたので、ご教示のほどよろしくお願いします。

8igoten:2011/01/27(木) 09:36:34
おんだんさんこんにちは、ファイル有難うございました。
早速実行してみました、そして見事にエラーが出ました。
しかしどう見てもコードに不具合は有りません。

そこでおんだんさんのコードから色々な物を取り除きコードを
シンプルな物にしました。
最終的にはフォームの上に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から出すと正常に
動作すると思います。)
続く..

9igoten:2011/01/27(木) 09:37:12
続き
そしてこの現象はPictureBoxdだけでなくLabelなどでも同じです。
もちろんコンテナに載せるだけでコードが変わるはずはありませんので
これはVB.NETのバグだと思われます。
その原因はILと呼ばれる中間コードを読んでみなければわかりませんが、
私は読めません。

実は私はMicroSoftのサポートに2回アクセスする権利を持っていますが、
この件でこの権利を行使したくありません。
そこでどこかILが読める人の掲示板で聞いてみたいと思います。
(たぶんコンテナに載せた時に配列として処理しているのだと思われますが。)
何か分かりましたら書き込みます。

10igoten:2011/01/27(木) 10:19:19
早速他の掲示板に回答が書かれました。
『Control.Controls プロパティは、自分の直接の子供となるコントロールしか格納していません。』
と言うことだそうです。そこで
Private Function PicBox(ByVal index As Integer) As PictureBox
Return DirectCast(Me.GroupBox1.Controls("PicBox" & index.ToString), PictureBox)
End Function
とコードを書き換えたら正常に動作しました。
私もまだ未熟です。

11おんだん:2011/01/28(金) 11:29:28
いろいろと面倒をおかけして、申し訳ありませんでした。
今、勤務先ですので帰宅してから、ご教示していただいた部分を
修正し、実行したいと思います。
プログラムというものは、本当に奥が深く、繊細なものだという
ことを改めて感じました。
本当にありがとうございました。これからもご教示していただけ
れば幸いです。

12おんだん:2011/01/29(土) 14:18:22
帰宅してから自宅のPCで実行しました。そうすると正常に稼働しました。
本当にびっくりしました。
Visual Basicの奥深さと難しさに改めて感じました。
これで新たな気持ちでプログラミングができるようになりました。
大変ご面倒をおかけしたり、時間を割いて頂き、調べて頂き、本当に
ありがとうございました。改めて感謝申し上げます。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板