2011年08月25日

アプリケーションの設定情報の扱いについて考えてみる(6)

   このエントリーをはてなブックマークに追加 Clip to Evernote
このシリーズの最後として、構成ファイルに何らかのコレクションを保持させる方法について考えてみたいと思います。
第5回で扱った、ConfigurationSection を使います。
そのほか使うクラスは、

System.Configuration.ConfigurationElementCollection
System.Configuration.ConfigurationElement

の2つのクラスです。
ConfigurationElementCollection クラスは、構成ファイル内の要素のコレクションを表します。
この時のコレクションの要素が、ConfigurationElement クラスとなります。
実際には、これらのクラスから独自のクラスを派生させることになります。

今回は、アプリケーションのどの機能が何時呼び出されたかを構成ファイルに記録するという例を考えます。

まず、コレクションの要素である FunctionInfoクラスから定義します。
このクラスは、ConfigurationElementから派生させます。


Keyには、機能番号を、Valueには、日付時刻を格納することとします。
ConfigurationElement がコレクションの要素の場合には、
要素を一意に特定するキーを示すプロパティには、IsKey=true を指定するようにします。
ここでは、Key, Value という名前を使いましたが、この名前にこだわる必要はありません。
また、ここでは2つのプロパティとしましたが、3つ以上のプロパティでも問題ありません。

つぎに、このFunctionInfo要素を持つ、コレクションクラスを定義します。
このコレクションクラスは、ConfigurationElementCollectionから派生させます。

派生するには、最低限、CreateNewElement、GetElementKey の2つのメソッドをoverrideします。

ただ、これだけだと、コレクションからの要素の取得、追加、削除、列挙などができないので、
必要なメソッドを要求に合わせて作り込みます。


そして、最後に、このコレクションを持つ、ConfigurationSection クラスを実装します。
ここでは、functions という名前のXMLタグの中に、コレクションを保持するようにしました。
前回同様、GetSectionというstaticメソッドと、Saveメソッドを用意しました。

これで、必要なクラスを定義できました。
configファイルは、初期状態として、以下のようなものを用意します。


これで準備完了です。

以下は、使い方の簡単なサンプルです。


実行後のconfigファイルの例です。


  

Posted by gushwell at 22:08Comments(0)TrackBack(0)

2011年08月22日

パズル:コイン150

   このエントリーをはてなブックマークに追加 Clip to Evernote
久しぶりに、Gushwell's C# Programming Pageのプログラム小品集のページに、「コイン150」 というプログラムを追加しました。
Silverlightアプリとして作成しています。

問題は以下の通り。
縦6×横6の升目の中に、100円玉6個、50円玉6個を入れてください。
そのとき、縦 6列、横6列、対角線2列の合計14列の、どこも合計が150円になるようにしてく ださい。

解は一つではなく、たくさんあります。その中のいくつかを求めるだけならば、
プログラムを使わなくても、手動で解けるので、興味ある方は自力で解いてみてください。

「コイン150」という名前は、僕が勝手につけたものです。
  
Posted by gushwell at 21:08Comments(0)TrackBack(0)

2011年08月15日

アプリケーションの設定情報の扱いについて考えてみる(5)

   このエントリーをはてなブックマークに追加 Clip to Evernote
前回説明したように、ApplicationSettingsBase では、
「ユーザ単位ではなく、アプリケーションで一つの設定情報を扱い、かつ、読み書きを可能にしたい」
という要求には独自のプロバイダーを記述する必要があります。
これ結構面倒です。

それならば、ConfigurationSection クラスという別のクラスを利用したほうが
簡単に要求に答えられそうです。

ということで、ConfigurationSection クラスを使い、ウィンドウの位置とサイズを扱うサンプルを
書いてみました。以下にそのコードを示します。


※ System.Configuration を参照に追加します。

クラス WindowInfoは、ConfigurationSection クラスから派生させています。
ApplicationSettingsBase から派生させたクラスと良く似ていますね。
大きく異なる点は、Load staticメソッドがある点です。
このメソッドは、設定ファイルを読み込むメソッドですが、標準の App.configではなく、
別ファイルとして、configファイルを扱えるようにようにしてます。
ここでは、"windowInfo.app.config" としています。

Saveメソッドは、インスタンスメソッドです。configファイルへの保存は、Configurationクラスの
Saveメソッドを呼び出すだけです。自分で保存ロジックを記述する必要はありません。

"windowInfo.app.config"の中身は、以下のようになります。
属性として値が保持されるので、ApplicationSettingsBase よりは、読みやすいですね。

なお、"windowInfo.app.config" は事前に用意しておく必要があります。
windowInfo要素は無くてもかまいません。存在しない場合は、DefaultValueで指定した
値が、セットされます。

最後に、利用する側のコード例を示します。



なお、ApplicationSettingsBaseとは異なり、バージョン管理を行いたいという場合には、 自分ですべて実装する必要があるようです。 一長一短がありますので、要求によって使い分ける必要がありますね。   
Posted by gushwell at 23:00Comments(0)TrackBack(0)