ものえおさむ

C#で作る、あなただけのメモ帳 ~[ファイル]メニューの実装~

2008-11-13 19:55:00

はじめに
このブログでは、"Windows アプリケーションってどう作るのかよくわからない" といったプログラマ向けに Visual C# 2008 Express Edition (無償) を使用した Windows アプリケーションに作り方について説明しています。
Visual C# 2008 Express Edition (無償)(※) の入手方法については
この記事 を、プロジェクトのコンパイル方法については この記事を参照してください。 

(※)大学生、専門学校生の方は DreamSpark で、商用の Visual Studio を無償で入手することもできます。 

今回も、IT 業界の最新の話題とはまったく無関係に、前回の記事に引き続き Visual C# 2008 Express Edition を使用したテキストエディタの作成についてひっそりと書きます。

今回は、前回の記事でテキストエディタの外観だけ作成したプロジェクトの [ファイル(&F)] メニュー以下、各メニューアイテムのイベントハンドラにコードを記述して、実際の機能を実装してみましょう。

実装の前に、作成したプロジェクトを Visual C# で開き、前回の記事で説明した内容に以下の追加設定を行ってください。

フォームのタイトルの変更
-----------------------
デザイン ビューでフォームを選択し、画面右の [プロパティ] ウィンドウで、[Text] プロパティを "Form1" から "無題" に変更してください。

[上書き保存(&S)] をDisable (淡色表示) に
--------------------------------------
既定の状態で [上書き保存(&S)] メニューを選択できないようにします。

デザイン ビュー で、フォーム上のメニュー [ファイル(&F)] - [上書き保存(&S)] を選択状態にし、 [プロパティ] ウィンドウで、[Enabled] プロパティを False に設定してください。メニューアイテムが淡色表示され、選択できなくなります。

その他、メニューアイテム [読み取り専用で開く(&R)] は使用しませんので削除してください。(※)

削除の方法は、[読み取り専用で開く(&R)] を選択し、キーボードの [Delete] キーを押下することで削除できます。

※今回のサンプルを作成したところ、とくに必要でないことに気がつきました。先回のプログで作業していただいた方、どうもすみません。。

メニューへの機能実装
==================
ここからはメニューに実際の機能を追加していきます。

以下の手順に沿ってコントロールを配置し、コードを記述してください。

コントロールの配置
----------------------
各メニューアイテムのイベントハンドラにコードを記述する前に、ファイルのオープンと、保存処理で使用するコントロールを配置します。

画面左のツールボックス内 [すべての Windows フォーム] から [OpenFileDialog] コントロールと、[SaveFileDialog] をドラッグして、フォームデザイナ上にドロップしてください。

いずれのコントロールも、フォームデザイナの下部の灰色の帯のところに配置されます。

次に各ファイルダイアログ コントロールのプロパティを設定します。

コントロールのプロパティは、コードからも設定できますが、プロパティの設定をいちいちコードに書くと煩雑になりますので、変更する予定のないプロパティや初期値については [プロパティ] ダイアログであらかじめ設定しておくのが良いでしょう。

もちろん [プロパティ] ウィンドウの UI では設定がしづらいという場合は、コードで記述しても結構です。

先ほど追加した OpenFileDialogSaveFileDialog コントロールの各プロパティを以下のように設定します。

(OpenFileDialog のプロパティ設定)

プロパティ
(Name) openFileDlg
FileName (空白)
Filter テキストファイル (*.txt)|*.txt|C# ソース(*.cs)|*.cs|全てのファイル (*.*)|*.*
ShowReadOnly True
Title ファイルを開く

(SaveFileDialog のプロパティ設定)

プロパティ
(Name) saveFileDlg
Filter テキストファイル (*.txt)|*.txt|C# ソース(*.cs)|*.cs|全てのファイル (*.*)|*.*
Title 名前を付けて保存

OpenFileDialogSaveFileDialog コントロールの Filter プロパティは、ファイル選択ダイアログで、選択可能なファイルの種類を設定しています。

メニューアイテムへのイベント ハンドラの設定
---------------------------------------
コントロールへのイベントハンドラの設定は、コードを記述して定義しなくても、 VisualStudio IDE を使用することで簡単に行えます。
以下の手順で、[ファイル(&F)] メニュー内 [新規作成(&N)] アイテムのイベントハンドラを作成してみてください。

手順
----
1. フォームデザイナ上のフォームの [ファイル(&F)] メニューをクリックして展開
2. メニューアイテム [新規作成(&N)] をダブルクリック

上記の手順で "menuNew_Click" のイベントハンドラが定義されます。

うまくいかない場合は、以下の手順で行ってください。

手順
----
1. フォームデザイナ上のフォームの [ファイル] メニューをクリックして展開
2. メニューアイテム [新規作成(&N)] を選択
3. [プロパティ] ウィンドウ内のツールバーより [イベント] ボタン(※稲妻のマークのボタン) をクリック
4. 設定可能なイベント一覧が項目となって表示されるので、項目 [Click] 右横の空欄をダブルクリック上記の手順で "メニューアイテム名_Click" のイベントハンドラが定義されます。

上記 2 つの方法のいずれかを使用して、[ファイル(&F)] メニュー下のすべてのメニューアイテムに対しイベントハンドラの設定を行ってください。

[新規作成(&N)] メニューアイテムの機能実装
---------------------------------------
[新規作成(&N)] メニューの機能を実装します。

基本的にはテキストボックスの内容をクリアし、タイトルバーに "無題" あるいは "新規作成" と表示すれば、それで新規作成ということになりますが、使い勝手を上げるには、編集中の文書がある場合の警告の表示や、[上書き(&S)] メニューアイテムを無効にするなどの処理もを行ったほうが良いでしょう。

なお、この [上書き(&S)] メニューアイテムを "無効にする/有効にする" 処理は、テキストに変更された際にも行う必要があるので、"テキストに変更された" ことを記すフラグ "ダーティーフラグ" の設定処理とともに関数として定義しておきます。

このダーティフラグは、クラス内の他の関数からも参照されるので、スコープをクラス内で有効となるように定義します。ついでに上書き保存に使用する、編集中のファイルのパスを格納する変数と、ファイルが読み取り専用で開かれているか否かを保持するフラグも同時に定義しておきましょう。

(ダーティーフラグと、その他、複数メソッドから参照される変数の宣言)

public partial class Form1 : Form
{
     private bool dirtyFlag = false;        //ダーティーフラグ
     private bool readOnlyFlag = false;  //読み取り専用フラグ
     private string editFilePath = "";      //編集中のファイルのパス
                        ・
                        ・

(ダーティーフラグと [上書き(&S)] メニューアイテム有効/無効の処理)

private void setDirty(bool flag)
{
     dirtyFlag = flag;
    
     //読み取り専用でファイルがオープンされている場合、
     //[上書き(&S)] メニューアイテムは常に無効
     menuSave.Enabled = (readOnlyFlag)?false:flag;
}

せっかくなので、保存していない編集中のテキストがある場合に警告メッセージを表示する処理も定義しておきましょう。

(保存していない編集中のテキストがある場合に確認するための関数)

private bool confirmDestructionText(string msgboxTitle)
{
     const string MSG_BOX_STRING = "ファイルは保存されていません。\n\n編集中のテキストは破棄されます。\n\nよろしいですか?";
     if (!dirtyFlag) return true;
     return (MessageBox.Show(MSG_BOX_STRING, msgboxTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes);
}

[新規作成(&N)] メニューアイテムのイベントハンドラのコードは以下の通りです。
ソースコードから menuNew_Click イベントハンドラの定義を見つけ、以下のようにタイプするか、コードをコピーしてください。

([新規作成(&N)]のイベントハンドラ)

private void menuNew_Click(object sender, EventArgs e)
{
 
    const string MSG_BOX_TITLE="ファイルの新規作成";     //編集中のテキストがないか確認
    if (confirmDestructionText(MSG_BOX_TITLE)) 
   {
        this.Text = "新規ファイル";
//アプリケーションのタイトルを変更
        textBox1.Clear();      //テキストボックスの内容をクリア
        editFilePath = "";           //編集中ファイルのパスをクリア
        setDirty(false);               //ダーティーフラグと[上書き..]メニューを設定
   }
}

[開く(&O)] メニューアイテムの機能実装
----------------------------------------------
配置した OpenFileDialog コントロールを使用します。

"ファイルを開く" という機能を実装しますが、[開く(&O)] メニューアイテムのイベントハンドラに記述するのは  OpenFileDialog コントロール を表示するまでです。

実際のファイルの読み込み処理は、OpenFileDialog コントロールの [OK] ボタンのイベントハンドラに記述します。

[開く(&O)] メニューアイテムのイベントハンドラに記述する OpenFileDialog コントロールを表示するためのコードは以下の通りです。

([開く(&O)] メニューアイテムのイベントハンドラ)

private void menuOpen_Click(object sender, EventArgs e)
{

   openFileDlg.ShowDialog(this);
} 

次に、以下の手順で OpenFileDialog コントロールで [OK] ボタンがクリックされた際のイベントハンドラ FileOK を設定します。

手順
----
1. フォームデザイナ上に配置された  OpenFileDialog コントロールを選択
2. [プロパティ] ウィンドウ内のツールバーより [イベント] ボタン(※稲妻のマークのボタン) をクリック
3. イベント一覧が項目となって表示されるので、項目 [FileOK] 右横の空欄をダブルクリック

イベントハンドラが設定されるので、以下のようにコードを記述します。
なお、このコード中では File オブジェクトを使用しているので、namespace 宣言の前に using 句を使用して System.IO を宣言しておいてください。

using System.IO;

OpenFileDialogFileOK イベントに記述するコードは以下の通りです。

(OpenFileDialog の FileOK イベントハンドラ)

private void openFileDlg_FileOk(object sender, CancelEventArgs e)
{

     const string TITLE_EXTN_ReadOnly = " (読み取り専用)";
     const string MSGBOX_TITLE = "ファイル オープン";

     //選択されたファイルのパスを取得
     editFilePath = openFileDlg.FileName;

     //ファイルダイアログで読み取り専用が選択されたかどうかの値を取得
     readOnlyFlag = openFileDlg.ReadOnlyChecked;

     //読み取り専用で開いた場合にタイトル(ファイル名)に "読み取り専用" の文字をつける
     this.Text = (readOnlyFlag)
          ? openFileDlg.SafeFileName + TITLE_EXTN_ReadOnly : openFileDlg.SafeFileName;

     //ダーティーフラグのリセット
     setDirty(false);

     try
     {
          //テキストファイルの内容をテキストボックスにロード
          textBox1.Text = File.ReadAllText(editFilePath, Encoding.Default);
     }
     catch (Exception ex)
     {

        //ファイルの読み込みでエラーが発生した場合に Exception の内容を表示
        MessageBox.Show(this, ex.Message, MSGBOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
     }

}
 

以上で、[開く(&O)] メニューアイテムの機能実装は完了です。

[F5] キーを押下してプロジェクトを実行し、メニュー [ファイル(&F)] - [開く(&O)] を実行し、選択したテキストファイルの内容がテキストボックスに表示されるか確認してください。

[上書き保存(&S)] メニューアイテムの機能実装
------------------------------------------------------
ファイルの上書き保存処理を実装します。

記述する処理は、変数に格納してある編集中のファイルパスを使用してテキストボックスの内容を書き込む処理と、エラー処理くらいで良いでしょう。

今回は保存した日時をステータスバーに表示させたいと思いますので、先にそのための関数を以下のように定義しておきます。

(ステータスバーに保存日時を表示する関数)

private void ShowSaveDateTime()
{
     const string STATUS_STRING = "に保存しました";

           
     //ステータスバー上のラベルに表示
     toolStripStatusLabel1.Text = System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + STATUS_STRING;
}

[上書き保存(&S)] メニューアイテムのイベントハンドラの内容を以下のように記述します。

([上書き保存(&S)] メニューアイテムのイベントハンドラ)

private void menuSave_Click(object sender, EventArgs e)
{

    const string MSGBOX_TITLE = "ファイルの上書き保存";

    //保存先のファイルが存在するかチェック
    if (File.Exists(editFilePath))
    {
         try{

              //テキストボックスの内容をファイルに書き込み
              File.WriteAllText(editFilePath, textBox1.Text, Encoding.Default);

              //ダーティーフラグをリセット
              setDirty(false);

              //ステータスバーに保存日時を表示
              ShowSaveDateTime();
         }
         catch (Exception ex){

              //ファイルの書き込みでエラーが発生した場合に Exception の内容を表示
              MessageBox.Show(this, ex.Message, MSGBOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
     }
     else
     {
          string MSG_BOX_STRING = "ファイル\"" + editFilePath
               + "\" のパスは正しくありません。\n\nディレクトリが存在するか確認してください。";
          MessageBox.Show(MSG_BOX_STRING, MSGBOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);  
     }

} 

テキストボックス上の文書が変更された場合に、[上書き保存(&S)] メニューアイテムを使用可能にするために、テキストボックスが更新された際に発生するイベント TextChanged のイベントハンドラに、ダーティーフラグの設定を行うコードを記述します。

private void textBox1_TextChanged(object sender, EventArgs e)
{

   //ダーティーフラグを設定
    setDirty(true);
} 

[F5] キーを押下してプロジェクトを実行し、[上書き保存(&S)] メニューが正しく動作するか確認してください。

[名前を付けて保存(&A)] メニューアイテムの機能実装
-----------------------------------------------
[名前を付けて保存(&A)] メニューアイテムの機能実装方法は、同じくファイルダイアログを使用する [開く(&O)] メニューアイテムの実装方法と良く似ています。

メニューアイテムのイベントハンドラではファイルダイアログを表示するだけコードを記述し、ファイルへの書き込み処理はファイルダイアログの FileOk イベントハンドラに記述します。

[名前を付けて保存(&A)] メニューアイテムのイベントハンドラに記述するコードは以下の通りです。

([名前を付けて保存(&A)]メニューアイテムのイベントハンドラ)

private void menuSaveAdd_Click(object sender, EventArgs e)
{

     //ファイルが新規作成だった場合の名前
     const string NEW_FILE_NAME = "新規テキストファイル.txt";

     //編集中のファイルのフルパスからファイル名だけを取得
     string fileNameString = GetFileNameString(editFilePath, '\\');

     //ファイル名が空白であった場合は "新規テキストファイル.txt" をセット
     saveFileDlg.FileName = (fileNameString == "") 
          ? NEW_FILE_NAME : fileNameString;
     saveFileDlg.ShowDialog(this);
}

コード中の GetFileNameString 関数は、フルパスの文字列からファイル名だけを取り出す関数です。

SaveFileDialog オブジェクトには、選択されたファイル名だけを返す SafeFileName プロパティがないために独自に関数を作成しています。

実際のコードは以下の通りです。

(GetFileNameString関数)

private string GetFileNameString(string filePath,char separateChar)
{
     try{
          string[] strArray = filePath.Split(separateChar);
          return strArray[strArray.Length - 1];
      }
      catch
      { return ""; }

ファイルへの書き込み処理は、SaveFileDialog コントロールで [OK] ボタンをクリックした際のイベントハンドラ FileOK 内に記述します。

FileOK イベントハンドラの設定手順は以下の通りです。

手順
----
1. フォームデザイナ上に配置された  SaveFileDialog コントロールを選択
2. [プロパティ] ウィンドウ内のツールバーより [イベント] ボタン(※稲妻のマークのボタン) をクリック
3. イベント一覧が項目となって表示されるので、項目 [FileOK] 右横の空欄をダブルクリック

イベントハンドラが設定されるので、以下のコードを記述します。

(SaveFileDialog の FileOK イベントハンドラ)

private void saveFileDlg_FileOk(object sender, CancelEventArgs e)
{

     const string MSGBOX_TITLE = "名前を付けて保存";

     //ファイルダイアログで指定された保存先パスを取得
     editFilePath = saveFileDlg.FileName;
     try{

          //ファイルの書き込み
          File.WriteAllText(editFilePath, textBox1.Text, Encoding.Default);

     //ファイル名をウィンドウのタイトルに設定
          this.Text = GetFileNameString(editFilePath,'\\');

          //ダーティーフラグのリセット
          setDirty(false);

          //ステータスバーに保存日時を表示
          ShowSaveDateTime();
     }
     catch (Exception ex){

          //エラー発生の際に Exception の内容を表示
          MessageBox.Show(this, ex.Message, MSGBOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
     }

} 

[F5] キーを押下してプロジェクトを実行し、[名前を付けて保存(&A)] メニューが正しく動作するか確認してください。

[終了(&X)] メニューアイテムの機能実装
-----------------------------------
アプリケーションの終了処理は以下の通りです。アプリケーションを終了させる際に、編集中のテキストを誤って破棄しないように、確認メッセージを表示させるようにしてみました。

([終了(&X)] メニューアイテムのイベントハンドラ)

private void menuEnd_Click(object sender, EventArgs e)
{

     const string MSGBOX_TITLE = "アプリケーションの終了";
     if (confirmDestructionText(MSGBOX_TITLE))
     {
           this.Close();
           this.Dispose();
      }

} 

[F5] キーを押下してプロジェクトを実行し、[エディタの終了(&X)] メニューアイテムを選択してアプリケーションが正しく終了するか確認してください。

 

以上で [ファイル(&F)] メニューの各アイテムの機能実装は完了です。

ここで紹介した処理の完全なコードは以下の通りです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private bool dirtyFlag = false;   //ダーティーフラグ
        private bool readOnlyFlag = false; //読み取り専用フラグ
        private string editFilePath = "";  //編集中のファイルのパス

        public Form1()
        {
            InitializeComponent();
        }

        //ダーティーフラグの設定
        private void setDirty(bool flag)
        {
            dirtyFlag = flag;
            //読み取り専用でファイルがオープンされている場合、新規作成の場合
            //[上書き(&S)] メニューアイテムは常に無効
            menuSave.Enabled = (readOnlyFlag || editFilePath=="") ? false : flag;
        }

        //保存していない編集中のテキストがある場合に確認するための関数
        private bool confirmDestructionText(string msgboxTitle)
        {
            const string MSG_BOX_STRING = "ファイルは保存されていません。\n\n編集中のテキストは破棄されます。\n\nよろしいですか?";
            if (!dirtyFlag) return true;
            return (MessageBox.Show(MSG_BOX_STRING, msgboxTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes);
        }

        //テキストボックスの内容が変更された際に発生するイベント
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            setDirty(true);
        }

        //[新規作成]メニューの処理
        private void menuNew_Click(object sender, EventArgs e)
        {
            const string MSG_BOX_TITLE = "ファイルの新規作成";
            if (confirmDestructionText(MSG_BOX_TITLE)) //編集中のテキストがないか確認
            {
                this.Text = "無題";     //アプリケーションのタイトルを変更
                textBox1.Clear();       //テキストボックスの内容をクリア
                editFilePath = "";      //編集中ファイルのパスをクリア
                setDirty(false);        //ダーティーフラグと[上書き..]メニューを設定
            }
        }

        //ステータスバーに保存日時を表示
        private void ShowSaveDateTime()
        {
            const string STATUS_STRING = "に保存しました";
            //ステータスバー上のラベルに表示
            toolStripStatusLabel1.Text = System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + STATUS_STRING;
        }

        //[上書き保存] メニューの処理
        private void menuSave_Click(object sender, EventArgs e)
        {
            const string MSGBOX_TITLE = "ファイルの上書き保存";

            //保存先のファイルが存在するかチェック
            if (File.Exists(editFilePath))
            {
                try
                {
                    //テキストボックスの内容をファイルに書き込み
                    File.WriteAllText(editFilePath, textBox1.Text,Encoding.Default);
                    setDirty(false);

                    //ステータスバーに保存日時を表示
                    ShowSaveDateTime();
                }
                catch (Exception ex)
                {
                    //ファイルの書き込みでエラーが発生した場合に Exception の内容を表示
                    MessageBox.Show(this, ex.Message, MSGBOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                string MSG_BOX_STRING = "ファイル\"" + editFilePath
                     + "\" のパスは正しくありません。\n\nディレクトリが存在するか確認してください。";
                MessageBox.Show(MSG_BOX_STRING, MSGBOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        //[名前をつけて保存]メニューの処理
        private void menuSaveAdd_Click(object sender, EventArgs e)
        {

            //ファイルが新規作成だった場合の名前
            const string NEW_FILE_NAME = "新規テキストファイル.txt";

            //編集中のファイルのフルパスからファイル名だけを取得
            string fileNameString = GetFileNameString(editFilePath, '\\');

            //ファイル名が空白であった場合は "新規テキストファイル.txt" をセット
            saveFileDlg.FileName = (fileNameString == "") ? NEW_FILE_NAME : fileNameString;
            saveFileDlg.ShowDialog(this);
        }

        //フルパスからファイル名のみを取り出す関数
        private string GetFileNameString(string filePath, char separateChar)
        {
            try
            {
                string[] strArray = filePath.Split(separateChar);
                return strArray[strArray.Length - 1];
            }
            catch
            { return ""; }
        }

        //[終了] メニューの処理
        private void menuEnd_Click(object sender, EventArgs e)
        {
            this.Close();
            this.Dispose();
        }

        private void menuOpen_Click(object sender, EventArgs e)
        {
            openFileDlg.ShowDialog(this);
        }

        //ファイルを開く処理
        private void openFileDlg_FileOk(object sender, CancelEventArgs e)
        {
            const string TITLE_EXTN_ReadOnly = " (読み取り専用)";
            const string MSGBOX_TITLE = "ファイル オープン";

            //選択されたファイルのパスを取得
            editFilePath = openFileDlg.FileName;

            //ファイルダイアログで読み取り専用が選択されたかどうかの値を取得
            readOnlyFlag = openFileDlg.ReadOnlyChecked;

            //読み取り専用で開いた場合にタイトル(ファイル名)に "読み取り専用" の文字をつける
            this.Text = (readOnlyFlag)
                 ? openFileDlg.SafeFileName + TITLE_EXTN_ReadOnly : openFileDlg.SafeFileName;

            //ダーティーフラグのリセット
            setDirty(false);

            try
            {
                //テキストファイルの内容をテキストボックスにロード
                textBox1.Text = File.ReadAllText(editFilePath, Encoding.Default);
            }
            catch (Exception ex)
            {
                //ファイルの読み込みでエラーが発生した場合に Exception の内容を表示
                MessageBox.Show(this, ex.Message, MSGBOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        //ファイルを保存する処理
        private void saveFileDlg_FileOk(object sender, CancelEventArgs e)
        {
            const string MSGBOX_TITLE = "名前を付けて保存";

            //ファイルダイアログで指定された保存先パスを取得
            editFilePath = saveFileDlg.FileName;
            try
            {
                //ファイルの書き込み
                File.WriteAllText(editFilePath, textBox1.Text, Encoding.Default);

                //ファイル名をウィンドウのタイトルに設定
                this.Text = GetFileNameString(editFilePath, '\\');

                //ダーティーフラグのリセット
                setDirty(false);

                //ステータスバーに保存日時を表示
                ShowSaveDateTime();
            }
            catch (Exception ex)
            {
                //エラー発生の際に Exception の内容を表示
                MessageBox.Show(this, ex.Message, MSGBOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
 

 うまくいかない人、作業するのが面倒な人は、ここまでの内容のサンプルプロジェクトを SkyDrive にアップしましたので、ここからダウンロードしてお試しください。

 

次回は [編集(&E)] メニュー中のコピー、貼り付けなどのクリップボード関連の機能実装について書きたいと思います。

今回は長い記事になってしまったので、次回は短く書きますね。(疲れました。。)

ではまた。

※マイクロソフト社員のコミュニティ参加について

※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 1件のコメント
#1   2009-03-19 15:39:43
説明のコードと完全コードで終了時の反応が異なって書いてありますね。
これは完全なコードの方の修正をしないと何これ?という事になりそうですよ。

ちなみに私ならmenuEnd_Clickはthis.Close();だけにして、Form1_FormClosingに
終了時の確認を入れる方が×の閉じるなどで終了した場合の事も考慮出来ると
思います。<code>//[終了] メニューの処理
private void menuEnd_Click(object sender, EventArgs e)
{
this.Dispose();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
const string MSGBOX_TITLE = "アプリケーションの終了";

if(confirmDestructionText(MSGBOX_TITLE)){
// Form1の破棄
this.Dispose();
}
else{
// ウィンドウを閉じるのをやめる
e.Cancel = true;
}
}</code>
  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]