終了時の処理【C#を始めよう】

C#でプログラムを始めてみる連載の14回目です。前回の記事はコチラです。

hirocom777.hatenadiary.org

テキストエディターを閉じるときの処理

前回は、ファイルを開く前に編集中の内容を保存するか確認して保存する処理と、違う名前で保存する場合の処理を追加しました。

f:id:HiroCom777:20211110210458j:plain

今回はテキストエディターを閉じるときの処理に対応します。編集中の内容を保存するか確認して保存する処理です。

WindowsフォームデザイナーでfrmMainを選択した上で、F4キーを押してプロパティウィンドウを表示させます。次に、プロパティウィンドウ上部の稲妻の様なマークを選択(①)します。続いて下のリストからFormClosingをダブルクリック(②)しましょう。

f:id:HiroCom777:20211110205637j:plain

Form1.csのコード編集画面に移って以下のコードが表示されると思います。

 private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
 {

 }

これが、frmMainがクロースされる直前に呼び出される部分になります。この部分に以下のコードを記述します。

 private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
 {
     if (fileChange)
     {
         var result = MessageBox.Show("ファイルを保存しますか",
             "TextEditor", MessageBoxButtons.YesNoCancel);
         if (result == DialogResult.Yes)
         {
             SaveFile(fileName);
         }
         if (result == DialogResult.Cancel)
         {
             e.Cancel = true;
         }
     }
 }

前回ご紹介したメニューのOpenが選択された場合に記述された内容とほとんど一緒ですが、キャンセルボタンが押されたときの処理のみ異なります。

frmMain_FormClosingにはFormClosingEventArgs型のeという引数がありますが、この引数のCancelプロパティtrueを設定するとfrmMainのクローズが中止になります。実際に実行して動作を確認してみてください。

編集しているファイル名の表示

これでかなり形になりましが、もう少し工夫してみたいと思います。このテキストエディターでファイルを開いて編集していると、そのうち編集しているファイルの名前が判らなくなってしまうことがあります。そこで、編集しているファイルの名前を表示するように使用と思います。変数fileNameの内容を表示すればいいですね。表示する場所はfrmMainの左上、現在"TextEditor"と表示されている場所の右側としましょう。Textプロパティに設定します。また、フルパスだと助長になってしまうのでパスは省いてファイル名だけの表示とします。

ファイル名は、以下で取得可能です。

 System.IO.Path.GetFileName(フルパスのファイル名);

ちなみにファイルのパスだけを取得する場合には以下の様になります。

 System.IO.Path.GetDirectoryName(フルパスのファイル名);

また、ファイルの拡張子を取得したい場合は以下で可能です。

 System.IO.Path.GetExtention(フルパスのファイル名);

つまり、frmMainのTextプロパティにファイル名を表示するには以下の様にすればいいです。 (thisはfrmMainを指します)

 this.Text = "TextEditor " + System.IO.Path.GetFileName(fileName);

これを、fileNameが変更になった直後に記述すればいいいいです。つまり、OpenFileSaveFileに追加すればいいです。 それぞれ以下の様になりました。

 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;
     this.Text = "TextEditor " + System.IO.Path.GetFileName(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;
     this.Text = "TextEditor " + System.IO.Path.GetFileName(fileName);//処理を追加
     fileChange = false;
 }

F5キーを押して、実行してみましょう。ファイルを指定して開くとファイル名が表示されますね!!

f:id:HiroCom777:20211110210951j:plain

次回は名前空間

いかがでしょうか?かなり完成に近づいてきましたね。ところで今回とファイルアクセスの時に出てきたSystem.IOってありますよね。次回はこれを説明しようと思います。もお楽しみに!!

hirocom777.hatenadiary.org

C#で簡単なツールを作る連載記事はコチラからどうぞ