[Windows] タイトルバーに変更有無を表示する

今回はテキストボックスの内容に変更があった場合に、タイトルバーに「(変更あり)」と表示する実装をします。
広 告
目次
前提条件
- 「上書き保存」機能を実装する」が実施済であること
動作確認環境
- Windows10 64bit
- Visual Studio Express 2015 for Windows Desktop
1. 共通処理をメソッドにまとめる
現状Form1
クラスのソースコードを確認すると、LoadFile()
メソッドとSaveFile()
メソッドに、タイトルバーの表示名を設定するための処理と上書き保存機能を無効にする処理が記述されています。今回も同じ処理を、それぞれのメソッドに追加することになるため、ここでは1つのメソッドに処理をまとめます。
1つのメソッドに処理をまとめる
// アプリの状態を更新する private void UpdateStatus(string Name) { // ファイル名を保持する this.FileName = Name; // タイトルバー表示名 string title = ApplicationName; if (FileName != "") { // タイトルバーにファイル名を表示する title += " - " + Name; } // タイトルバー表示名を設定する this.Text = title; if (FileName == "") { // ファイル名が未設定 // 「上書き保存」を無効 MenuItemFileSave.Enabled = false; } else { // 「上書き保存」を有効 MenuItemFileSave.Enabled = true; } }
UpdateStatus()
メソッドで実装している処理は以下のとおりです。
- ファイル名をFileName変数に保持する
- タイトルバー表示名を設定する
- 上書き保存機能の有効・無効を切り替える
第一引数のName
にはフルパスファイル名が設定されます。このメソッドをForm1_Load()
、LoadFile()
、SaveFile()
で呼び出します。
UpdateStatusメソッドの呼び出し元
private void Form1_Load(object sender, EventArgs e) { this.Text = ApplicationName; // 複数行入力を有効化 textBox.Multiline = true; // 垂直方向スクロールバー表示を有効化 textBox.ScrollBars = ScrollBars.Vertical; // フォーム全体にテキストボックスを表示 textBox.Dock = DockStyle.Fill; // 「名前を付けて保存」ダイアログで「ファイル種類」を選択させる SaveFileDialog.Filter = "テキスト文章|*.txt|すべてのファイル|*.*"; UpdateStatus(""); } private void LoadFile(string value) { textBox.Text = System.IO.File.ReadAllText( value, Encoding.GetEncoding("Shift_JIS")); UpdateStatus(value); } private void SaveFile(string value) { System.IO.File.WriteAllText(value, textBox.Text, Encoding.GetEncoding("Shift_JIS")); UpdateStatus(value); }
2. 変更があるかをタイトルバーに表示する
UpdateStatue()
メソッド内に、テキストボックスの内容に変更があった場合、タイトルバーの末尾に「(変更あり)」を表示する処理を追加します。
テキストボックス内容の変更を考慮したUpdateStatusメソッド
// アプリの状態を更新する private void UpdateStatus(string Name, bool Edited) { // ファイル名を保持する this.FileName = Name; // タイトルバー表示名 string title = ApplicationName; if (FileName != "") { // タイトルバーにファイル名を表示する title += " - " + Name; } if (Edited) { // 編集中があれば「(変更あり)」をタイトル名に付ける title += "(変更あり)"; } // タイトルバー表示名を設定する this.Text = title; if (FileName == "") { // ファイル名が未設定 or 編集前 // 「上書き保存」を無効 MenuItemFileSave.Enabled = false; } else { // 「上書き保存」を有効 MenuItemFileSave.Enabled = true; } }
引数を1つ追加しています。Edited
は、テキストボックスの内容に変更があるかどうかをtrue
、false
で設定されます。変更がある(true
)場合は、タイトルバーの末尾に「(変更あり)」を付けます。
既存のUpdateStatu()
メソッドを呼び出すコードは以下のように変更します。
UpdateStatusメソッドの呼び出し元
private void Form1_Load(object sender, EventArgs e) { this.Text = ApplicationName; // 複数行入力を有効化 textBox.Multiline = true; // 垂直方向スクロールバー表示を有効化 textBox.ScrollBars = ScrollBars.Vertical; // フォーム全体にテキストボックスを表示 textBox.Dock = DockStyle.Fill; // 「名前を付けて保存」ダイアログで「ファイル種類」を選択させる SaveFileDialog.Filter = "テキスト文章|*.txt|すべてのファイル|*.*"; UpdateStatus("", false); } private void LoadFile(string value) { textBox.Text = System.IO.File.ReadAllText( value, Encoding.GetEncoding("Shift_JIS")); UpdateStatus(value, false); } private void SaveFile(string value) { System.IO.File.WriteAllText(value, textBox.Text, Encoding.GetEncoding("Shift_JIS")); UpdateStatus(value, false); }
アプリケーションが起動した時、ファイルが新たに読み込まれた時、ファイルが保存された時は、ファイル編集前状態という扱いになり、テキストボックス内容が変更されていないという意味でfalse
を設定します。

デザインウィンドウを表示し、テキストボックスをダブルクリックします。するとtextBox_TextChanged()
メソッドが作成されます。このメソッドは、テキストボックスの内容に変更があったときに呼び出されます。
このメソッドでは以下の実装をします。
テキストボックス内容に変更があった場合の処理
private void textBox_TextChanged(object sender, EventArgs e) { UpdateStatus(FileName, true); }
UpdateStatue()
メソッドの第二引数にtrue
を設定し、変更ありを設定しています。
タイトルバーに変更があるかの状態を表示する実装は以上です。
3. プログラムを実行して結果を確認する
これまでの手順の実行結果は以下の通りです。

テキストボックスに任意の文字を入力すると、タイトルバーの末尾に「(変更あり)」が表示されたことが確認できます。

「ファイル」メニューから「開く」を選択し任意のテキストファイルを開くと、タイトルバーの末尾の「(変更あり)」が消えたことが確認できます。

テキストを入力すると再度「(変更あり)」が表示されますが、

ファイルを保存すると、また「(変更あり)」が消えることが確認できます。
次は「保存機能の有効・無効を切り替える」です。