複数のPictureBoxに画像を表示できるプログラムを作りたいんですがどうもうまくいきません。
具体的には、PictureBoxを3つ用意して、特定の条件下でボタンを押すと画像が表示されます(それぞれ違う画像が表示されます)。このとき、2つの条件を同時に満たす時、条件を満たした2つのボタンを順に押すと、両方のPictureBoxに画像が表示されるようにしたいです。しかし、1つのPictureBoxに画像が表示された後、条件を満たしたもう1つのボタンを表示してももう1つのPictureBoxに何も表示されません。
ボタンを押して画像を表示させるコードとしては、
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If CountLabel.Text Mod 3 = 0 Then
PictureBox1.Image = Image.FromFile("表示する画像")
End If
End Sub
といった感じです。どうすればいいでしょうか・・・。
スロットマシーンのようなものですか?
結局ボタンが何個あるのか、"条件"とは具体的に何なのかわかりません。
提示されているコードのどの部分が条件になるのでしょうか?
うまくいかないのは、画像表示なのか条件判断なのか?
>特定の条件下で
>2つの条件を
>条件を満たした2つの
>条件を満たしたもう1つの
すべてが同じ条件なのか違う条件なのか判断のしようがない。
>PictureBoxを3つ
>両方のPictureBox
>1つのPictureBox・・・中略・・・もう1つのPictureBox
PictureBoxが3つなのか2つなのかどっちなんだ。
>If CountLabel.Text Mod 3 = 0 Then
どうでもいいが CountLabel.Text は文字列なのでおもむろに計算に巻き込むのではなくて、数値型にキャストしてからのほうがいいぞ。
おっとっと、いろいろ抜けてた感がありましたので詳細を。
ガッさん・・・スロットマシーンではありません。もっと別なゲームを作っています。条件の詳細を記載してませんでした・・・条件は、CountLabelの数値が特定の数(たとえば、3の倍数と3のつく数字とか、5の倍数、8の倍数)になった時です。条件が示されているコードは
If CountLabel.Text Mod 3 = 0
です。ボタンは画像を表示させるのとカウントさせる機能を持つもので3つあります。
通るぜさん・・・条件については前述のとおりです。あと、すべてが同じ条件ではなくて、1つの条件の時のあるし、2つの条件が組み合わさるときがあります。問題は画像表示です。PictureBoxは3つあって、条件に応じて1つか2つのPictureBoxに画像を表示したいが2つ同時に画像を表示できないということです。
2人ともすいませんでした。改めてアトバイスをお願いします。
> 問題は画像表示です。
> 2つ同時に画像を表示できないということです。
PictureBox1.Image = Image.FromFile("表示する画像1")
PictureBox2.Image = Image.FromFile("表示する画像2")
何がしたいのか全然伝わらないけど、
また、FuzzBuzz問題ができないとか言ってそうな気がするw
特攻隊長まるるうさん・・・そのように画像を表示できるなら苦労しないです。言葉が抜けていてすいませんでした。TimerでCountLabelをカウントしながら、まず1つ目の条件を満たした1個目のボタンを押してPictureBoxに画像を表示させ、その画像を残したまま2つ目の条件を満たした2つ目のボタンを押して別のPictureBoxに画像を表示させます。つまり、TimerのInterval1回内に2つのボタンを押して2つの画像を同時に表示するプログラムにしたいわけです。
例えば、条件1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If Val(CountLabel.Text) Mod 5 = 0 Then
PictureBox2.Image = Image.FromFile("表示する画像1")
End If
End Sub
条件2
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If Val(CountLabel.Text) Mod 8 = 0 Then
PictureBox2.Image = Image.FromFile("表示する画像2")
End If
End Sub
Timer1.tickでCountLabelをカウントする
という感じです。
なかなか伝わりません・・・画面としては(Name名で記載)
CountLabel
PictureBox1 PictureBox2 PictureBox3
Button1 Button2 Button3
> 特攻隊長まるるうさん・・・そのように画像を表示できるなら苦労しないです。
> つまり、TimerのInterval1回内に2つのボタンを押して
> 2つの画像を同時に表示するプログラムにしたいわけです。
残念ながらそのように画像表示できるとしか思えません。
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Me.Button1.PerformClick()
Me.Button2.PerformClick()
End Sub
両方の条件が成り立つのは
CountLabel.Text = "40"
。。。毎回、文字列⇔数字の変換をしまくるより、
変数で数値型のカウンタを持ってて数字⇒文字の
変換だけする方がより良いプログラムだと思います。
っつか、すでにバグがあるね。
Button1 も Button2 も PictureBox2 を書き換えてるね。
なかなか伝わりませんね・・・
特攻隊長まるるうさん・・・そのようにコードを入力したところボタンを押す前に画像が表示された上、2つの画像が表示されずに最初に表示された画像しか残りませんでした。
CountLabel
PictureBox1 PictureBox2 PictureBox3
Button1 Button2 Button3
において、CountLabelをカウントさせる→Button1を押す条件を満たしたら押してPictureBox1に画像を表示→Button2を押す条件も満たしていた場合押して、PictureBox1に画像を残したままPictureBox2に画像を表示します。
(PictureBox1とPictureBox3、PictureBox2とPictureBox3でも同じようにできるようにします。また、押す順番は関係ありません。どちらからでもOKにします。)条件は前述どおりCountLabelの数値です。
どうやら「すぐ画像を表示させる」と思われているようですが、実際は「ボタンを押して画像を表示させる」という内容です。何か方法はないでしょうか・・・
っと、連レスになりますが・・・
特攻隊長まるるうさん(2008/12/16(火) 14:14:57のレス)・・・一方がPictureBox1です。すいませんでした。また、数値型のカウンタを持って、文字列に変換する方法はすでに記載しています。
Timer1.tick内
Dim i As Integer = 0 ←モジュール関数
i += 1
CountLabel.Text = i.ToString()
レスが入れ違いになったようですね・・・
> どうやら「すぐ画像を表示させる」と思われているようですが、
> 実際は「ボタンを押して画像を表示させる」という内容です。
> 何か方法はないでしょうか・・・
条件が整ったときに変更するのは変数(フラグ)の値にして、
ボタン押下時はそのフラグがたってるかどうかを見るだけだね。
> どうやら「すぐ画像を表示させる」と思われているようですが、
> 実際は「ボタンを押して画像を表示させる」という内容です。
伝わってないのではなく、どんどん言ってることが変わってるよね。
> つまり、TimerのInterval1回内に2つのボタンを押して
> 2つの画像を同時に表示するプログラムにしたいわけです。
タイマーイベント時にボタンを押すとはっきり書いておられますが???
こういう後出しじゃんけんは嫌われます。
特攻隊長まるるうさん・・・そうですか・・・。最初からちゃんと状況を説明するべきでした。すいません。
タイマーイベント時にボタンを押すと、と言われましたがそのイベントはCountLabelをカウントさせているに過ぎず、実際に画像を表示させるのはボタンイベントです。Timerは画像を表示させるのに直接関係してません。
CountLabel
PictureBox1 PictureBox2 PictureBox3
Button1 Button2 Button3
↑ ↑
のボタンを押すとPictureBox1、PictureBox2に画像が表示される。一方だけではない。ほかのボタンの組み合わせも同様。
解決策が浮かばないなら、僕の説明不足か、不可能と言うことかもしれませんね・・・。何とかならないだろうか・・・。
だから間に変数のフラグ挟めばいいじゃない?
編集 削除1.CountLabelはタイマー(Timer1)イベントにてカウントアップ
2.Timer1が一定時間経過するまでに
ユーザーはCountLabelを目視して条件が合致している
ボタン(1〜3)を押す。(最大2回?)
3.CountLabelが次に更新されるまでに、ボタンが押された回数(1〜2)・
押されたボタン1〜3によって、それぞれPictureBox1〜3のうち2つ
に適切な画像を表示する
4.1へ
>ボタンは画像を表示させるのとカウントさせる機能を持つもので3つあります。
はよく分からなかったのですっ飛ばしました。
みたいなゲームを想像してみました。(こんな感じでいいのかな)
で3番のところが分からない?
解決方法が浮かばないのは、誰も「何が問題なのか」が伝わらないから。
説明不足ではなくて、説明下手。
誰もキミのやりたいこと、困っていることが理解できてない。
PictureboxもButtonも3つずつあるのに、説明文の中では2つになったりする。
「どちらか」といえば2つのものについてだし、3つならば「どれか」でしょ。
例えば〜の中でPictureboxもButtonも123のどれかさっぱりわからないし。
Private mCount As Integer
Private Sub Timer1_tick(・・・省略
mCount += 1
If mCount = Int32.MaxValue Then mCount = 0
CountLabel.Text = mCount.ToString()
End Sub
Private Sub Button1_Click(・・・省略
If mCount Mod 5 = 0 Then
PictureBox1.Image = Image.FromFile("表示する画像1")
End If
End Sub
Private Sub Button2_Click(・・・省略
If mCount Mod 8 = 0 Then
PictureBox2.Image = Image.FromFile("表示する画像2")
End If
End Sub
Private Sub Button3_Click(・・・省略
If mCount Mod 13 = 0 Then
PictureBox3.Image = Image.FromFile("表示する画像3")
End If
End Sub
これで何か問題が?
私も質問するときに、たまに確認しますが
一応読んでみては?
技術系メーリングリストで質問するときのパターン・ランゲージ
http://www.hyuki.com/writing/techask.html
書き出し —— 最初に問題の要旨を書きましょう
実行手順 —— 手順は箇条書きで書きましょう
結果の予想 —— 期待した結果を書きましょう
実際の結果 —— 実際に起きたことを書きましょう
ステップ明記 —— どこからうまく行かなくなったかを書きましょう
この辺で指摘されている文章中がごちゃごちゃと混ざってしまって
うまく説明できていない気がします。
それから
>ボタンは画像を表示させるのとカウントさせる機能を持つもので3つあります。
は
ボタンは画像を表示させるのと、カウントさせる機能を持つもので
3つあります。
だと思いますが、この例だけでなく句読点や改行を適切な位置で
使用してみてください。
曖昧な書き方だと読み方で意味が変わってきてしまいます。
>この辺で指摘されている文章中がごちゃごちゃと混ざってしまって
この辺で指摘されている文章がごちゃごちゃと混ざってしまって
誤字には気をつけましょうを追加しておいてください・・・
主語も無いのかもしれない。。。
> つまり、TimerのInterval1回内に2つのボタンを押して
> 2つの画像を同時に表示するプログラムにしたいわけです。
ボタンクリックの処理は書いてあるし、Timer のイベントは
プログラムが判断することだから、プログラムからボタンを
押すように解釈したけど、ユーザーだった。
ただし、それならそれで話が合わなくなるのが
実行時の動き。
新規プロジェクトで PictureBox をデフォルト設定で貼り付け、
> PictureBox1.Image = Image.FromFile("表示する画像1")
を実行すると描画イメージは更新されます。仮に
PictureBox1.Image = Image.FromFile("次に表示したい画像")
すると画像は変更されます。
> 2つの画像が表示されずに最初に表示された画像しか残りませんでした。
これは再現できません。
それが起こるなら、If の条件が成り立ってないだけでしょう。
最初に
> PictureBox1.Image = Image.FromFile("表示する画像1")
> PictureBox2.Image = Image.FromFile("表示する画像2")
書いたら馬鹿にされたけど、これが一番重要な内容です。
カウントするのもやめて、ボタンで特定の条件のみ If の制限も
やめて、ボタン押下で確実に2つの画像を変更できることを
確かめます。
それが確認できたら、ボタンに If の条件を追加し、カウントは
Button3 クリックのみでカウントアップし、Button1、Button2
で画像更新できることを確認します。
あとは Button3 のカウントアップをタイマーに任せればいいのだから、
> 何とかならないだろうか・・・。
とかいう話じゃないと思う。
> 誤字には気をつけましょうを追加しておいてください・・・
> 改めてアトバイスをお願いします。
→アドバイス
> Dim i As Integer = 0 ←モジュール関数
→モジュール変数
まったくするなっていうのは当然無理な話だけど、
多い人は、単純なバグをたくさん作ってます。
例えば、
> 一方がPictureBox1です。すいませんでした。
で済ませちゃったけど、実際に書いてるコードをコピペして
あれだったなら、画像が更新できなかった原因が PictureBox2
しか更新してなかったから…という事さえ有り得ます。
> 文字列に変換する方法はすでに記載しています。
すでにってなんだろう。。。
掲示板で書いた内容は
> If Val(CountLabel.Text) Mod 5 = 0 Then
ラベルの文字列をわざわざ数値変換してるから、
> Dim i As Integer = 0 ←モジュール関数
使えば良いじゃない。
掲示板に書いてないことまでは知らないです。
掲示板に書かずに勝手に変更したプログラムの内容まで
責任もてません。
通るぜ さんのサンプル通りだね。
ほんとに申し訳ございませんでした・・・
通るぜさん・・・いくら状況を説明しても解決策をもらえない理由がようやくわかりました。説明が足りなかったようですね・・・そのようにコードを記載していましたが1つしか画像が表示されません。最初に載せればよかったかもしれません。
のさん・・・ゲームの機能を持つボタンは、ボタンを押すと画像を表示させるもので3つと、カウントを始動させるボタンがあります。確かに質問がめちゃくちゃでした。その質問で通用するのとばかり思っていつの間にやら説明をどんどん足して・・・
3人へ・・・関係ないと思って言ってませんでしたが、条件の3つは
1.3の倍数と3のつく数字
2.5の倍数
3.8の倍数
です。
書き出し —— 最初に問題の要旨を書きましょう
実行手順 —— 手順は箇条書きで書きましょう
結果の予想 —— 期待した結果を書きましょう
実際の結果 —— 実際に起きたことを書きましょう
ステップ明記 —— どこからうまく行かなくなったかを書きましょう
と、誤字をなくす、覚えておきます。
特攻隊長まるるうさんのいったとおりにしたところうまくいきました。
startbotton,timer1.tickは省略
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AhoButton.Click
If i Mod 3 = 0 Then
PictureBox1.Image = Image.FromFile("表示画像1")
End If
(長くなるので一部省略)
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AhoButton.Click
If i Mod 5 = 0 Then
PictureBox2.Image = Image.FromFile("表示画像2")
End If
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AhoButton.Click
If i Mod 8 = 0 Then
PictureBox3.Image = Image.FromFile("表示画像3")
End If
モジュール変数を使うのは書かれてから気づきました・・・通るぜさん、確認もせず先入観で回答してすいませんでした・・・
ようやく解決しました。ありがとうございます。