C#でプログラムを始めてみる連載の12回目です。前回の記事はコチラです。
編集フラグの確認と処理の準備
前回は編集フラグ(変数fileChange)を設定してみました。
設定する場所を整理しておくと、プログラミングしやすくなります。今回は、設定した編集フラグを使って変更がある場合の問い合わせと保存処理を実現する準備をします。
処理をまとめる
ファイルを保存する処理ですが、今まではメニューのSaveに割り付けていました。でも、ここまで考えてきた中で色々なケースで保存処理が呼び出されることが解ってきました。具体的には・・・
- メニューのSaveが選択された時
- 編集中の状態からあたらしいファイルを開くとき
- 編集中の状態でテキストエディターを閉じるとき
そして、ファイル名があらかじめ指定されている場合はファイル名を聞かずに上書き保存処理、指定されていない場合はファイル名を指定してから処理、と処理を変える必要があります。また、ファイル名を変更して保存したい場合があるので、メニューにもSaveAs(名前を付けて保存)を追加する必要があります。
どうやら保存する処理は独立した方がいい様です。また、合わせてファイルを開く処理の方も独立させてしまいましょう。
ファイルを開く処理
まずは、ファイルを開く処理を独立させていきたいと思います。Form1.csのコード編集画面に移ってpublic partial class frmMainのブロックの一番最後に以下を追加します。
private void OpenFile(String openName = "") { if (openName == "") { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; if (ofd.ShowDialog() != DialogResult.OK) { return; } openName = ofd.FileName; } System.IO.StreamReader sr = new System.IO.StreamReader(openName); this.txtMain.Text = sr.ReadToEnd(); sr.Close(); fileName = openName; fileChange = false; }
関数openFileは、引数openNameで指定したファイル名のファイルを読込んでtxtMainに表示します。openNameが指定されていない場合はコモンダイアログを開いてファイル名を入力できます。ここでファイル名を指定しないと処理を抜けます。ファイルを開いた場合は、openNameの内容をfileNameに保存して、編集フラグfileChangeはfalseとなります。
ファイルを保存する処理
続いて、ファイルを保存する処理です。上記のコードの下に以下を追加してください。
private void SaveFile(String saveName = "") { if (saveName == "") { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; if (sfd.ShowDialog() != DialogResult.OK) { return; } saveName = sfd.FileName; } System.IO.StreamWriter wr = new System.IO.StreamWriter(saveName); wr.Write(this.txtMain.Text); wr.Close(); fileName = saveName; fileChange = false; }
関数SaveFileは、引数saveNameで指定したファイル名でtxtMainに保存してある内容をテキストファイルに保存します。saveNameが指定されていない場合はコモンダイアログを開いてファイル名を入力できます。ここでファイル名を指定しないと処理を抜けます。ファイルを保存した場合は、saveNameの内容をfileNameに保存して、編集フラグfileChangeはfalseとなります。両方も大体同じ処理になりました。
使ってみる
それでは簡単なところから使ってみましょう。メニューのOpenを選択し場合は以下の様になりました。
private void mnuOpen_Click(object sender, EventArgs e) { OpenFile(); }
メニューのSaveを選択した場合は、以下のようなコードになりました。
private void mnuSave_Click(object sender, EventArgs e) { SaveFile(fileName); }
凄くシンプルになりました。
次回は本格的に適用
いかがでしょうか?処理の単位で上手くまとめることができるとプログラミングが楽になります。次回は今回まとめた内容を使って色々な処理を実現していこうと思います。お楽しみに!!