- 締切済み
バグがとけません・・・
現在私はVB2005で4択のクイズ形式のプログラムを作成しています。 データセットに問題、解答群などを格納しています。 それをフォームで表示してラジオボタンで4択のなかから正解と思うものを1つ選びボタンをクリックして次の問題へ移行する・・・というような流れのプログラムです。 今ためにしに問題を十問出題し最後の問題を終えたら10問中何問正解したかを表示するプログラムを作成しています。 データセットの内容はそれぞれ下記のとおりです。 Answer1~4・・・選択肢1~4 SelectAnswer・・・選択した選択肢を格納する CorrectAnswer・・・予めデータセットに格納してある正解 Loadで最初の一問目だけを読み込んで後はボタンを押すごとに問題が進んでいきますが全問正解するようにしても結果表示が正しく表示されません。 どこがバグかわかる方、もしくはさらに効率のいいコードがわかる方がいましたら助けてください。どうかよろしくお願いしますm(_ _)m Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If IO.File.Exists(filePath) Then DataSet1.ReadXml(filePath) End If Question.Text = DataSet1.DataTable1(i).Question Answer1.Text = DataSet1.DataTable1(i).Answer1 Answer2.Text = DataSet1.DataTable1(i).Answer2 Answer3.Text = DataSet1.DataTable1(i).Answer3 Answer4.Text = DataSet1.DataTable1(i).Answer4 '正誤確認 If Answer1.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ア" ElseIf Answer2.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "イ" ElseIf Answer3.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ウ" ElseIf Answer4.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "エ" End If If DataSet1.DataTable1(i).SelectAnswer = DataSet1.DataTable1(i).CorrectAnswer Then total = total + 1 End If i = i + 1 End Sub Private Sub NextQuestion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextQuestion.Click 'Static i As Integer = 0 'UStatic total As Integer = 0 'MsgBox(i)デバッグ '問題の読み込み Question.Text = DataSet1.DataTable1(i).Question Answer1.Text = DataSet1.DataTable1(i).Answer1 Answer2.Text = DataSet1.DataTable1(i).Answer2 Answer3.Text = DataSet1.DataTable1(i).Answer3 Answer4.Text = DataSet1.DataTable1(i).Answer4 '正誤確認 If Answer1.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ア" ElseIf Answer2.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "イ" ElseIf Answer3.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ウ" ElseIf Answer4.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "エ" End If If DataSet1.DataTable1(i).SelectAnswer = DataSet1.DataTable1(i).CorrectAnswer Then total = total + 1 End If '終了 If i = 10 Then MsgBox("あなたの正解数はは10門中" & total & "問です!") Me.Close() End If i = i + 1 Answer1.Checked = True End Sub
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
Formクラスの変数として DataTable型とCurrencyManagerを宣言しておきます Dim tbl as DatTable dim cm as CurrencyManager Form_Loadイベントで If IO.File.Exists(filePath) Then DataSet1.ReadXml(filePath) tbl = DataSet1.Tables(0) ' または DataSet1.Tables("テーブル名") cm = Ctype(Me.BindingContext( tbl), CurrencyManager ) Question.DataBinding( "Text", tbl, "Question" ) Answer1.DataBinding( "Text", tbl, "Answer1" ) Answer2.DataBinding( "Text", tbl, "Answer2" ) Answer3.DataBinding( "Text", tbl, "Answer3" ) Answer4.DataBinding( "Text", tbl, "Answer4" ) End If といった準備をします 回答して 次の問題へ移るためのボタンを用意し これのクリックイベントで dim ss as String if Anser1.checked then ss = Anser1.Text if Anser2.checked then ss = Anser2.Text if Anser3.checked then ss = Anser3.Text if Anser4.checked then ss = Anser4.Text tbl( cm.Position )("SelectAnser") = ss if cm.position = cm.List.Count -1 then dim rows() as DataRow rows = tbl.Select( "SelectAnser = CorrectAnswer" ) MsgBox( あなたの正解数は10問中" & rows.Length & "です") ' 最初からやり直すなら ' cm.Position = 0 exit sub end if cm.Position += 1 といった具合でしょう XMLが <myDS> <QA Question="問題1" Anser1="A1" Anser2="A2" Anser3="A3" Anser4="A4" SelectAnser="" CorrectAnser="A2" /> <QA Question="問題2" Anser1="B1" Anser2="B2" Anser3="B3" Anser4="B4" SelectAnser="" CorrectAnser="B3" /> </myDS> といった具合か <myDS> <QA> <Question>問題1</Question> <Anser1>A1</Anser1> <Anser2>A2</Anser2> <Anser3>A3</Anser3> <Anser4>A4</Anser4> <SelectAnser></SelectAnser> <CorrectAnser>A2</CorrectAnser> </QA> <QA> <Question>問題2</Question> <Anser1>B1</Anser1> <Anser2>B2</Anser2> <Anser3>B3</Anser3> <Anser4>B4</Anser4> <SelectAnser></SelectAnser> <CorrectAnser>B2</CorrectAnser> </QA> </myDS> といった具合を想定しています
- Yune-Kichi
- ベストアンサー率74% (465/626)
問題読み込んですぐに正誤確認していますが,これはおかしいですよね。 1. 問題を読み込む 2. 制御をWindowsに戻す (イベントハンドラから脱出) 3. ユーザーが回答する 4. ユーザーが次へボタンを押す 5. 正誤確認を行う 6. 問題が残っていれば1に戻る こうでないと,ユーザーが回答する時間がありませんよ。
補足
解答をいただきありがとうございます。 示していただいたコードを記述したのですがエラーがでてしまいました。 下記の部分なのですが当方初心者でうまく解決できそうもないので今一度アドバイスよろしくお願いします。 最初の宣言の部分です↓ Dim tbl as DatTable Form_Loadの部分です↓ Question.DataBinding( "Text", tbl, "Question" ) Answer1.DataBinding( "Text", tbl, "Answer1" ) Answer2.DataBinding( "Text", tbl, "Answer2" ) Answer3.DataBinding( "Text", tbl, "Answer3" ) Answer4.DataBinding( "Text", tbl, "Answer4" ) ボタンの部分です↓ if Anser1.checked then ss = Anser1.Text if Anser2.checked then ss = Anser2.Text if Anser3.checked then ss = Anser3.Text if Anser4.checked then ss = Anser4.Text 一応私のXMLの一部を示しておきます。 <DataSet1 xmlns="http://tempuri.org/DataSet1.xsd"> <DataTable1> <Question>コンプライアンス経営を説明したものはどれか。</Question> <Answer1>株主に対して企業活動の正当性を保持するために,経営管理が適切に行われているかどうかを監視し,点検する。 </Answer1> <Answer2>株主やそのほかの利害関係者に対して,経営活動の内容,実績に関する説明責任を負う。 </Answer2> <Answer3>企業倫理に基づき,ルール,マニュアル,チェックシステムなどを整備し,法令や社会規範を遵守した企業活動を行う。 </Answer3> <Answer4>投資家やアナリストに対して,投資判断に必要な正確な経営情報を適時に,かつ継続して提供する。 </Answer4> <CorrectAnswer>ウ</CorrectAnswer> <SelectAnswer>ア</SelectAnswer> <Explanation>コンプライアンスとは、法令遵守という意味である。法律や法令に加えて、社会におけるルールや企業倫理を守ることである。これを確実に実施するためにルールやマニュアル、チェックシステムを整備する。</Explanation> </DataTable1> </DataSet1> <Explanation>は解答の解説を格納していますが今作成しようとしているプログラム上では使用しません。 よろしくおねがいしますm(_ _)m