Formの位置を記録する(アプリケーション設定 その1)

Formの位置をユーザーごとに記録しておいて、次回起動時に同じ位置に表示する、みたいなことが.NET2.0から簡単にできるようになった。位置の記録と読み出し程度なら、ちょちょっとマウス操作して数行のお決まりのコードを貼り付けるだけでできてしまう。VisualStudioってすんごいねぇ。
利用する機能は、アプリケーション設定の中の「ユーザー設定」というもの。名前通り、ユーザーごとに設定を保存してくれる。アプリケーション設定はアプリごとに一つあるけど、ユーザー設定はユーザーごとに別のファイルになるのでウィンドウ位置やオプション設定なんかのユーザーお好みの設定を記録しておくのに使える。記録するにはSave()、旧バージョンからの設定引継ぎはUpgrade()なんて書くだけ。楽だ。
以下、Visual C# 2005 Expressで実際にWindow位置を記録してみる手順。かかる時間は3〜5分程度(!?)なので、ユーザー設定って何?って人は実際に試してみてほしい。


1.「ファイル→新しいプロジェクト」で新規Windowsアプリケーションを作成。
2.Form1.csのデザイン画面で、Formのプロパティの「(ApplicationSettings)」を見つける。カテゴリ順ならデータの下にある。こいつが今回いじってみるアプリケーション設定君。この下にいろいろあるので、左の「+」をクリックして展開する。
3.すぐ下に出てきた「(PropertyBinding)」を選んで「...」をクリック。すると、「Form1のアプリケーション設定」というポップアップ画面が出てきて、簡単記録できる項目がずら〜っと並んでいる。
4.今回は位置の記録を試してみるので、「Location」を選び、右のコンボボックスを開き、下に出てきた「(新規...)」をクリック。
5.すると「新しいアプリケーション設定」画面が出てくる。Nameだけ空欄なので、適当に「FormLocation」とでもつける。DefaultValueはすでに(0,0)になってて、ScopeはUserになっている。このScopeがUserかApplicationかってところが、ユーザー設定かアプリケーション設定かっていう違い。
6.「OK」をクリックすると、先ほどの「Form1のアプリケーション設定」画面に「FormLocation」の名前が反映されるので、こちらも「OK」をクリック。
7.あとはFormを閉じたときにセーブする機能をつけるだけ。なぜかセーブだけ自動でやってくれない(VBはセーブも自動らしい)。ソリューションエクスプローラの参照設定に「System.Configuration」を追加。同じくソリューションエクスプローラからForm1.csのコードを開いて、先頭に「using System.Configuration;」を追加する。
8.最後にForm1クラスに以下のコードを追加する。

protected override void OnClosing( CancelEventArgs e )
{
	try
	{
		Properties.Settings.Default.Save();
	}
	catch ( ConfigurationErrorsException ce )
	{
		MessageBox.Show( ce.BareMessage, "Error!" );
	}
	finally
	{
		base.OnClosing( e );
	}
}

9.これで完成!コンパイル&実行すると左上(0,0)座標にFormが表示される。右下にでも移動してFormを閉じ、もう一回起動してみると、今度は右下に出てくる!


なんとも便利な機能だ。詳しい機能の解説はWindows フォームのアプリケーション設定あたり。VBでの解説も参考になる。この解説に「何らか理由で、Size プロパティはバインド可能なプロパティとして表示されません。 これはこのバージョンでの設計上の判断ですが、最終版ではすべてのプロパティがバインドできるようになります。」ってあるけど、結局Sizeは表示されていない。ClientSizeがあるけど...。
当然デザイナ画面だけからではなく、コードで書くこともできる。が、デザイナと手書きを混ぜるとものすごく使いづらい機能だったりもする。このへんはまた後ほど。
(追記)コンパイル通らなかったのを修正しました。すみません。