2009年6月28日日曜日

[VC++2008] VC++ 2008 ExpressではApplicationSettingsは使えないらしい

VC++ 2008 ExpressnのIDEのフォームデザイナを使ってフォームを作成するとき、コンポーネントのプロパティにあるデータというカテゴリに「(ApplicationSettings)」という項目がある。ApplicationSettingsの詳細についてはドキュメントに譲るが、これを使うとフォームの位置などの情報を簡単に保存して、起動したときに前回の状態と同じように表示させることができる仕組みである。

まず、おもむろにこの「(ApplicationSettings)」にある「(Property Binding)」という項目をクリックすると、設定画面が表示できるボタンが現れる。このボタンを押すと、アプリケーション設定というダイアログが表示されるのだが、この中にはバインド可能なプロパティの一覧が表示されている。
そのプロパティのコンボボックスをドロップダウンさせると、アプリケーション設定を定義することができる。ここで「新規を」クリックするとアプリケーション設定が作成できるのだが、項目を埋めて「OK」ボタンを押すと「設定ファイルがプロジェクトに見つかりません。設定ファイルを追加して、再試行してください。」と表示されて追加することが出来ない。

ここで見つからないといわれているファイルは、「app.settings」である。このファイルもxmlで記述されていて、マイクロソフトでスキーマが定義されている。このファイルの空の状態は、おそらく以下の通り。

<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="" GeneratedClassName="app">
</SettingsFile>

このapp.settingsファイルをプロジェクトに追加すれば、(Property Binding)にアプリケーション設定を定義することができる。また、このapp.settingsファイルを開くとアプリケーション設定用のビューが開き、そこで項目の追加や変更もできる。

ただし、この状態でビルドをすると「stdafx.h」に「app.h」がありませんというコンパイルエラーが発生する。どうやら、app.settingsから値をやりとりするためのクラスをapp.hに定義してあるものとしてビルドしているように思える。
実際にはアプリケーション設定を定義したフォームのコードをみると「::app::Default」という参照をしている。結局のところ、このクラスを定義しないとアプリケーション設定は利用できないということになる。

ここからは、試してないのでなんともいえないが、このapp.hを手で作成してみようとするのであれば、ドキュメントにある「アプリケーション設定アーキテクチャ 」というページをヒントにすれば、うまくいくと思われる。
おそらく、appというクラスを「ApplicationSettingsBase」から派生させて、その中には先ほどのアプリケーション設定のビューで定義した名前と型をプロパティを作成する。スコープがユーザーなら「UserScopedSetting()」アトリビュートで、アプリケーションなら「ApplicationScopedSetting()」アトリビュートとなる。デフォルト値は、「DefaultSettingValue()」のアトリビュートで設定すればよいだろう。
プロパティのget()とset()は、ApplicationSettingsBaseのインデクサの参照、代入となる。

あとは、フォームを閉じるときにファイルに保存する(ApplicationSettingsBase::Save()を呼ぶ)ようにすれば、状態が保存されるはず。
app.hの作成のところは、試してないので動作保障はいたしません。もし、試してうまくいったという人がいらしたら、お知らせしていただければうれしいですw。