気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
C#でWindowsのアプリケーションを開発する際、ユーザが行ったアプリケーションの設定をどのように保存するのか
ということについて頭を悩ませることがあると思います。

本日はアクセス解析ソフト「Crete」を開発した際に使用したアプリケーション設定を保存する方法を紹介します。

「Crete」で使用したアプリケーション設定保存のテクニックは、アプリケーションの設定情報を管理するクラスのオブジェクトを
XMLにシリアライズし、ファイルに保存するといったものです。

それでは少しずつコードを見ていきます。アプリケーション設定を保存するクラスはSingletonパターンで作成します。
こうすることでアプリケーションの様々な箇所から同一の設定クラスのインスタンスに簡単にアクセスすることが
出来るようになります。

[AppSettings.cs]
  public class AppSettings
  {
      private static AppSettings _appSettings = null;
      private List<String> _urls = null;

      //クラス内からしかインスタンス化できないようにする
      private AppSettings(){}

      public static AppSettings GetInstance()
      {
          if (_appSettings == null)
          {
              _appSettings = new AppSettings();
              _appSettings.Urls = new List();
          }

          return _appSettings;
      }

      //解析対象のページのURLのリストを管理するプロパティ
      public List<String> Urls
      {
          get { return _urls; }
          set { _urls = value; }
      }
  }

これだけでは、設定を保存したり、読み込んだりすることが出来ないので、それを行うためのメソッドをAppSettingsクラスに
追加します。

[AppSettings.cs]
  public class AppSettings
  {
      //設定をロードする
      public static void Load()
      {
          //ユーザ毎のアプリケーションデータディレクトリに保存する
          String appPath = String.Format("{0}\\{1}", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                                                        "\\Crete\\settings.xml");

          if(File.Exists(appPath))
          {
              XmlSerializer serializer = new XmlSerializer(typeof(AppSettings));

              using (FileStream stream = new FileStream(appPath, FileMode.Open))
              {
                  _appSettings = serializer.Deserialize(stream) as AppSettings;
              }
          }
      }

      //設定を保存する
      public static void Save()
      {
          String appPath = String.Format("{0}\\{1}", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                                                        "\\Crete\\settings.xml");

          XmlSerializer serializer = new XmlSerializer(typeof(AppSettings));

          using (FileStream stream = new FileStream(appPath,FileMode.Create))
          {
              serializer.Serialize(stream, _appSettings);
          }
      }
  }

クラスのインスタンスの保存、復元は「XmlSerializer」クラスを利用することで簡単に行うことが出来ます。
「XmlSerializer」はpublicなプロパティとフィールドが保存、復元の対象となります。詳しく解説しませんが、
独自に定義したクラスを型とするフィールドを保存することも可能です。

この設定クラスをアプリケーションから利用する際は以下のようにします。

まず、フォームのLoadイベントのハンドラで設定をロードします。

    public partial class MainForm : Form
    {
        protected override void OnLoad(EventArgs e)
        {
            ・・・・・・・・・・・・・

            //設定をロードする
            AppSettings.Load();
        }
    }

そして、設定を利用する箇所で、以下のようにして設定クラスのプロパティにアクセスします。


  String<String> urls = AppSettings.GetInstance().Urls;

  foreach (String url in urls)
  {
      _address.Items.Add(url);
  }

設定の保存は、フォームのClosingイベントで行っています。

    public partial class MainForm : Form
    {
        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            try
            {
                //設定を保存する
                AppSettings.Save();
            }
            catch { }
        }
    }

この方法はWindowsアプリケーションを開発する際には私が頻繁に使用する方法なのですが、最大の利点は、
様々な種類のアプリケーション設定項目を設定クラスにそれに対応するプロパティを追加するだけで、
保存することが出来るという点です。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/66-1c0c078e

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。