【C#】アプリケーションの設定を保存しておく方法【サンプルコード】

ファイル名: -

このページのまとめ

プロパティバインディングは使わず、ダイアログ開いた時にまとめてプロパティからダイアログに設定する方針がおすすめ。(完)

詳細(ユースケースとサンプルコード)は、次をどうぞ

 

保存方法

  • iniファイル
  • レジストリ
  • XMLファイル
  • 独自ファイル
  • プロパティファイル

このページでは、プロパティファイルに保存する方法をまとめます。プロパティを処理(呼出、保存)する方法が、.NETでは用意されているためある程度簡単に処理できます。またAWTの各値とバインディングすることも可能です。

プロパティ: このページの対象のプロジェクトのプロパティ(Properties.Setting.Default)を指します。
Textbox,Checkbox,ComoboxなどのTextやCheckedなどのプロパティは "AWTのプロパティ"と表現します。

プロパティとは

アプリケーションで利用するユーザごとの設定をファイルに保存できます。key=valueのようなものに、 string / int など型の情報をセットにしたものです。グルーピングまではできません。保存の型は、intなどのプリミティブ型の他に、Color や Location など任意のクラスも設定できます(恐らく元に戻すので、データの順序性を制御するため、Serialize設定は必要)。

XML形式です。後述するユーザ設定とアプリケーション設定のパッとした見た目、ファイルの中の設定のところは同じようです。

ユーザ設定とアプリケーション設定

今回はプロパティのタイプとして、ユーザ設定を使います。
アプリケーション設定は、外部から設定できる点は変わりませんが、保存ができないため、設定の変更ができません。また「アプリケーション」の設定であるためアプリケーション直下におけますし、ビルド時にだけあれば配布の必要はなくなります。もちろんユーザ共通の設定でもあります。

※プロジェクトのプロパティから、ユーザかアプリケーションかを、各プロパティ値ごとに設定できます。

またプロパティには、 internal と publicがあります。あまり良くわかっていませんが、DLLなど外部アプリケーションなど柄使う場合はpublicにしておく必要があるようです。

ユーザ設定での想定されている利用シーン

気をつけておきたいのは、.NETのプロパティの設計思想です。恐らく、以下の様な流れの利用シーンが想定されています。

  1. メインのウィンドウ(フォーム)から、設定ダイアログが呼びだされた時に、プロパティ設定値がロードされる。
  2. 設定ダイアログでユーザが設定を変える。
  3. ダイアログを閉じるときに、プロパティを保存する。
  4. ものとアプリケーションの処理に戻る。

2でユーザが設定を変えたあとでも、3の前にリロードすると元に戻せます。
デフォルト値をアプリケーションで設定でき、初期化するとデフォルト値に戻せます。



そのため、設定ダイアログが常時表示されるようなケースや、メインダイアログが設定ダイアログになっていたりするケースでは、コントロールが難しくなります。また、バインディングされたデータでリアルタイムに処理するのも、内部的にはバインディングは反映動きが一歩遅くなります。

コーディング上の利用サイクル icon-lightbulb-o 

  1. バインディングしないで起動。
  2. 必要な物はダイアログ起動時にプロパティからAWTの各パーツへ反映
  3. ダイアログ(AWT)上で修正した時に随時、または終了時にプロパティに反映
  4. ダイアログを終了するときに、プロパティからファイルに保存

それを踏まえて、注意点やおすすめ点

一時的にダイアログを表示してユーザに設定させる場合は、パインでィングして使うのはコーディングも楽でありです。しかし、リアルタイムに値を利用したり、常時ダイアログを出すようなケースでは、コントロールが難しいので、避けたほうが良いです。

なぜなら、バインディングのコントロールは以下の様な動作をしているので難しいです。

バインディングされていると起動時に、初めて呼ばれた時に設定されているようです。そして修正した時に、ワンテンポ遅れて、プロパティ値が反映されます。ダイアログの設定直後にはバインディングされていても、値が反映しきれていないこともあるため、プロパティ値も利用できません。かといってAWTの方を利用しようとしても、バインディング前の時には、殻になっていたりデフォルト値担っていたりしていて、それもまた使えないので、八方塞がりになります。反映・同期するタイミングが不透明ですので、上記のようなテンポラリ的に、作るダイアログを利用するケース以外では、バインディングしないほうが良いと思います。バイン

サイクル

フロー バインディング時 非バインディング時
起動前 プロパティ:設定値
ダイアログ:プロパティのデフォルト値
プロパティ:設定値
ダイアログ:ダイアログの初期値
起動直後 プロパティ:設定値(読み込む前の値は不明)
ダイアログ:プロパティ値
プロパティ:設定値
ダイアログ:ダイアログの初期値
ダイアログ操作:他のAWTプロパティ プロパティ:影響なし
ダイアログ:空になったり、値が落ちたりする。
プロパティ:影響なし。
ダイアログ:影響なし。
ダイアログ操作:当該のAWTプロパティ プロパティ:ダイアログの値と同期、または一歩遅れて反映
ダイアログ:変更
プロパティ:影響なし。
ダイアログ:変更。
保存時 プロパティ内容が保存? プロパティの内容が保存。
ダイアログ終了時 影響なし。 影響なし。

バインディングしているときは、ダイアログを閉じてから使う。プロパティ値に反映しないなどの注意が必要です。

一方、バインディングしない方は、反映している/してないがはっきりしているため、アプリケーションでルールを決めれば、問題ないと思います。(上記利用サイクル)。アプリケーション動作時はプロパティやローカル変数を軸にすることを明確にする(つまりAWT側を更新したら軸となるプロパティに必ず反映する。起動時は、AWTからプロパティではなく、必ずプロパティから各値に展開するなど)。

上記の場合では、ダイアログ開始直前にプロパティ値をAWTのプロパティに反映し、AWTが変わったらプロパティ値に戻すだけで個々のプロパティは設定できます。あとは全体のプロパティに関わるファイルへの保存を行えば良いことになります。

バインディングの動作を確認するサンプルプログラム

プロパティ利用方法


流れ
  1. 利用登録
    • またはAWTからの利用登録
  2. 起動時にプロパティ値から処理(プロパティから、内部変数に設定/AWTに設定など)
  3. アプリケーション処理中は、プロパティやAWTを軸に扱う。
  4. ユーザに設定させたいときは、ダイアログなど起動時・表示にプロパティから反映
  5. 反映完了後、またはダイアログ終了時にプロパティに戻す
  6. アプリケーション終了時などに、ファイルに保存(永続化)

1.利用登録

プロジェクトの「ソリューションエクスプローラ」のプロジェクト名直下に icon-wrench Properties があるのでそこで、増やせます。プロジェクトのプロパティから開いて、「設定」からも同じ画面にたどれます。

ちなみに、バインディングしたいときは、AWT(TextBoxなど)のプロパティの 最上部あたりにあるApplicationSettingsにProperty Bindingsがあります。そこからバインディングしたいAWTのプロパティ(例えばTextBoxの.Textにバインディング)を選び、バインディングする保存プロパティ値の値を選ぶか、そこで新規作成してバインディングできます。先ほどのプロパティは プロジェクトのプロパティにも設定されています。

バインディング時、デフォルト値は AWTもプロジェクトのプロパティ値も基本同じ値になります。

2.起動時の処理

特に読み込む操作は必要ありません。アプリケーションの使い方によってプロパティに値から設定を展開したいときは読み取って初期化等しておきます。

3.4.プロパティ値を読み取る

以下用なコードで設定できます。

読み取り

string value = Properties.Settings.Default.pppp;

string value = Properties.Settings.Default["pppp"];

右側の ppp が先ほど利用登録したプロパティ名です。 string , int などだけでなく、Color , Locationなど好きなクラスも設定できます。最初に読み込まれた時にロードされるようです。変数名で扱いたいときは下の例が使えるでしょう。

長い名前なので、例えば

Properties.Settings ps = Properties.Settings.Default:
としてFormなどのインスタンス名変数と設定しておくとps.ppppで操作できます。

5.プロパティに値を戻す

書き込み

Properties.Settings.Default.pppp = value;

また、ファイルに保存する前であれば元に戻したいときは
Properties.Settings.Default.Reload();
  参考:MSDN:ApplicationSettingsBase クラス (System.Configuration)


アプリケーション初期のデフォルト値にまで戻したいときは
Properties.Settings.Default.Reset();

6.終了時や永続化したい時にファイルに保存する。

プロパティをファイルに保存。この保存や初期化、リロードはプロパティ個々ではなく、全体の操作となります。

Properties.Settings.Default.Save();

例えば、フォームの Closing 時にイベントハンドラを設定しておきそこで保存処理を書いて対応します。まだプロパティへ未設定の場合は保存前に プロパティに5.のように設定しておきます(Closedでもそれほど変わらないと思いますが、やや気持ちClosingのほうが処理の流れからみて良いと思いますし、MSDNでもそちらを推奨されています)

おまけ

ユーザ設定ファイルの場所

ユーザ設定ファイルの場所がとてもとてもわかりにくいです。プロジェクトで会社名の設定等を変えるとMicrosoftの箇所など、多少変わるらしいです。 Localではなく、Roamingに置かれるアプリケーションもあります。アプリケーション設定アーキテクチャ

C#でのアプリケーション設定の取得・保存方法 - seraphyの日記
%LOCALAPPDATA%\会社名\プロダクトのexe名をベースにしたもの\バージョン番号\user.config
%APPDATA%\会社名\プロダクトのexe名をベースにしたもの\バージョン番号\user.config

 

C:\Users\NAME\AppData\Local\Microsoft\RelaxTime.exe_Url_dm3o8duadf09090cl3zxfdiw21q3o85exuu9t2lu\1.0.0.0

以下の様な処理をするボタンを作っておくと、すぐユーザの設定値に辿れて便利です。
アプリケーション設定ファイルのパスを見つける方法↓。

関連ページリンク

メソッド作成時に手を抜く方法(メソッドが引数、無名メソッド)【C#】 

デバッグや通知に便利なメッセージ通知方法の使い分け【C#】

座標操作のメソッドの使い分け【C#】

クリップボード操作方法の原則【C#】

アイコンイメージ3つの取得方法サンプルプログラム【C#】

キーエミュレート送信のまとめ【C#】【覚書メモ】

Delicious にシェア
Digg にシェア
reddit にシェア
LinkedIn にシェア
LINEで送る
email this
Pocket




コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です