【C#】算数ドリルを作ってみる <改善編 その3>

スポンサーリンク

前回までの改善で、かなりユーザー目線でのアプリケーションになってきましたね。

今回も更に改善を加えたいと思います。

改善テーマは【記録を残す】です。2点の内容を実施しましょう。

①解いた問題の結果表示
②解いた問題をファイル保存

簡単に説明すると

【①解いた問題の結果表示】は、

テキストボックスを配置して、問題と結果を追記しましょう。

【②解いた問題をファイル保存】は、

ファイルを作成し、日時と問題と結果をファイルとして保存しましょう。

■解いた問題の結果表示

まずはGUIの設計からです。

今回は記録を残すという事で、テキストボックスを配置することにしました。

理由としては、テキストボックスはスクロールバーの設定があるからです。

「スクロールバー??」って人の為に説明すると、

ウィンドウ枠からはみ出ている時に出てくるバーの事です。

ウィンドウが小さい為、スクロールバーが必須だと思い、選択しています。

いつもの事ながら最初に、GUIを設計です。

テキストボックスを設置します。

テキストボックスをクリックし、右上の三角をクリックすると、

【TextBoxタスク-MultiLine】にチェックを入れてください。(左のGUI)

そうする事で《複数行表示》できるようになります。

TextBoxの大きさを広げてください(右のGUI)

テキストボックスのプロパティは、

  1. Name[TextBox1 → txtHistory]
  2. ScrollBars [None → Vertical]
  3. ReadOnly [False → True]

では、コードを書いていきましょう。

その前に1回実行してみてください。すると、ヒント有無でウィンドウサイズが変化してしまうため、前回行ったヒント有無でウィンドサイズを変更したタイミングで、記録用のテキストボックスの大きさも追従しないといけない事がわかりました。

そこで、ウィンドウサイズの変更を関数化しましょう。

関数を作る際に初めて引数を使いました。

引数とは、《関数に渡す値》の事で、関数の処理を柔軟にする為のモノになります。

次に真新しいのは、【三項条件演算子】です。

(変数) = ( 条件 ) ? ( 条件一致[True] ) : (条件不一致[False])

実は結構便利です。変数に条件次第で代入する事ができます。

関数化できたので、次は呼び出しましょう!!

ヒントを押された時、引数を[True]。新たに問題を出した時、引数[False]。

実行して、確認してみましょう。ウィンドウの大きさに追従して記録用のテキストも大きさを変化してくれる事が確認できました。

  

次は本題の記録を残していきましょう。

タイミングは、【回答】ボタンを押した時で、正解/不正解の判定が終わった後に処理を入れましょう。

フロー表を書くと今回追加する部分がわかりましたね。

では、コードを書きたいと思います。

正解したかどうかのフラグを定義し、成功した時だけフラグを立てましょう。

最新が一番上に来るようにします。

では実行してみましょう。

3点不具合がありました。気にする事はないという人もいるかもしれませんが、

大切なのは気遣いです。

①記録のテキストの最後に改行がある

②【ヒント】ボタンを押すと、記録用のテキストボックスが全選択

③【ヒント】ボタンを押すと、回答欄にアクティブがない。

では、実際に問題を解決しましょう。

【①最後に改行】は、

余分な文字を取り除くTrimというString型の中にある関数を使いましょう。

(文字).Trim()

これを使うことで、最初と最後にある余計な文字を削除できます。

【②テキストボックス全選択/③回答欄にアクティブがない】

回答欄にアクティブがいくようにすれば、解決されます。

指定したコントロール(今回はテキストボックス)にカーソルをもっていく関数を使用します。

(コントロール).Focus()

この関数を使って、問題を解決していきましょう。

実際に動かしてみましょう。問題なく動作していることがわかりますね。

■解いた問題をファイル保存

ファイル保存は、オススメの機能になります。

記録(ログ)を残す事は、後々見返す事ができるようになるからです。

今回はGUIの設計は必要ない為、フローチャートだけになります。

ファイル書き込み(保存)用の関数を作ります。

フローができたので、コードを書きましょう。

フォルダの保存先をまず先に決めましょう!!

(今回は実行ファイルがあるフォルダに”History”というフォルダを作ります。

実行ファイルのパスをゲットする。
パスからディレクトリ(フォルダ)のパスをゲットする。
確実にあるフォルダまでのパスを取得する事が可能になる。

ここでのこだわっていることは、実行ファイルのパスを基準にする事です。

実行ファイルが置かれるまでのパスは実在しており、適当なパスは、パソコン環境に応じてない可能性があるので気を付けてください。(気遣い)

取得したディレクトリ(フォルダ)パスに"History"というフォルダがあるか確認。
無ければ、作成する。(初期動作用動作しない)

記録用のフォルダを無ければ、作りましょう。初回のみの内容ですが、人に作ってもらう仕様であると作り忘れた時に例外になります。(気遣い)

ファイル名は、どの単位で残したいかで決まります。
1つのファイルに残したい。時間ごとに残したい。日ごとに残したい。月ごとに残したい。
今回は日ごとに残したいので、ファイル名を日にします。
そうする事で、何日にこのアプリケーションで遊んだかファイル名で分かります。

ファイルの中身は、日付、時間、問題、判定の4つの内容を記入するようにします。

その為、日付と時間を先に取得しておきます。

ファイル書き込みの仕方は、

using (System.IO.StreamWriter w = new System.IO.StreamWriter([ファイルパス], [追記か新規か], [エンコーダ]))
{
   w.WriteLine([文字]);
}

魔法の言葉だらけですね。。。

1つずつ内容を説明していきます。

using(クラス定義)
{
   [処理]
}

『using{ }の中だけこのクラスを使いますよ~』って意味になります。

細かい話ですが、定義したものは、開放しないとメモリが溜まり、パソコンがパンクします。

そこで using{ } を使うことで、中の処理が終われば、勝手に開放してくれます。

例えるなら
ジュースを歩きながら飲むのではなく、
ごみ箱前で飲んで、捨ててから歩く。ってイメージです。

一時的に機能を使えるようにするってことになります。

ファイル書き込みには《System.IO.StreamWriter》を使います。

名前は【w】として使います。(適当です。)

w.WriteLine(文字)で一行分書き込みます。※最後に改行コードをいれて書き込む

では、このコードを実行してみましょう。

おぉ!!フォルダが出来ましたっっ!!

ファイルの中身も確認しましょう。

時間の間に”:”を入れたり、日付に”/”を入れたいですが、まぁいいでしょう。

本当は気遣いとして入れたい!!

(“yyyyMMdd”→”yyyy/MM/dd”に変更) (“HHmmss”→”HH:mm:ss”に変更)

ぜひ変更したい方はやってみてください。

記録が残るようになりました。

■まとめ

①TextBoxのMultiLineをTrueにする事で、複数行対応できるようになる。
②表示行数が足りないと感じたら、ScrollBarsを利用する。
③三項条件演算子を利用して、コードをスマートに
④余計な空白にはTrim関数を使う
⑤アセンブリ情報から実行パスを取得できる
⑥using{ }で一時的に機能を使う
⑦System.IO.StreamWriterクラスを使ってファイル書き込み

2個の改善でしたが、ボリュームは多かったと思います。

ましてや無くてもいい機能ですwww

結局、改善は気遣いの話です。

1回で覚える必要はありません。何回も使うようになれば、勝手に覚えます。

(ふむふむ)と思いながら、やってみてください。

コメント

タイトルとURLをコピーしました