VisualBasic(脳トレ的アプリ008:結果画面の追加_変数のスコープ)

■結果表示の画面を追加する。
今回は、結果の表示用として新しいフォームを追加する。
新しいフォームの追加自体は、下の図のように、プロジェクト部分を右クリックした後、「追加」- 「フォーム(Windows フォーム)」で簡単にできた。今まで作ってきた問題を回答するフォームが1つのクラスとなっており、今回追加したフォームは別のクラスという扱いになる。

やりたいこととしては、問題回答のフォームで得た情報を結果画面のフォームに受け渡して表示させること。
最終的には、下の図のように「問題の正解数 / 問題の数」、「終了までにかかった時間」、「間違えた問題の情報」を問題作成の部分で集め、結果画面に表示させた。

まず、それぞれの情報を問題回答のクラス(Class QuizAppli)で集めるために宣言(correctAnswer_num_, problem_count_, errorList_, durationtime_)。それから、別のクラスで使用するためにget_xxxを作成。宣言時にPublicで宣言しておけば、get_xxxなど使用せずとも別のクラスからアクセス可能になるけど、オブジェクト指向的に良くないらしい。

Public Class QuizAppli

    Dim MAX_NUM = 9
    Dim MAX_FONTSIZE = 25
    Dim MIN_FONTSIZE = 18
    Dim ANSWER_MAX_NUM = 99
    Dim CODE_ARRAY = New String() {"*", "+", "-"}
    Dim CHARFONT_ARRAY = New String() {"Arial", "Times New Roman", "Century"}
    Dim CHARCOLOR_ARRAY = New String() {"Black", "Red", "Green", "Blue"}

    Private candidateList_ As List(Of Integer)
    Private answer_num_ = 0

    ' 
    Private correctAnswer_num_ = 0
    Private problem_count_ = 0
    Private errorList_ As New List(Of String)()
    Private starttime_ As Date
    Private durationtime_ As TimeSpan

...(略)

    Function get_correctAnswer_num()
        Return correctAnswer_num_
    End Function

    Function get_problem_count()
        Return problem_count_
    End Function

    Function get_time_count()
        Return durationtime_
    End Function

    Function get_errorList()
        Return errorList_
    End Function

End Class

結果画面のクラスを下のように記述した。すべてget_xxxでデータ取得する。取得したデータはLabelのコンポーネントに追加。

Public Class ResultClass

    Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        Label1.Text = "Result: " + QuizAppli.get_correctAnswer_num().ToString + " / " + QuizAppli.get_problem_count().ToString
        Dim durationTime As TimeSpan = QuizAppli.get_time_count()
        Label2.Text = "Time  : " + durationTime.ToString("s\.ff") + " s"

        Dim errorList As List(Of String) = QuizAppli.get_errorList()
        Dim labelStr As String = vbCrLf
        For Each str As String In errorList
            labelStr = labelStr + str + vbCrLf
        Next
        Label3.Text = "Error : " + labelStr

    End Sub
End Class

結果画面の表示については、問題回答のコードの表示させたい所で次の一文を入れればいいだけだった。
新しいクラスの呼び出しとなるので、Dim rc As ResultClassなどの宣言が必要になるかと思ったけど、そうでもないらしい。

        ResultClass.Show()

結果がうまく表示されることから、showを呼び出した時点でSub New()が起動しているよう。問題回答のフォームの表示が先とかも、どこかで制御していると思うけど、そのあたりの細かいところはよく分からない。とりあえずモノはできた。


次はプロジェクトの発行とか見て、脳トレ的アプリは終了しようかな。