Visual Basic テクニック |
VB2005を対象にアプリケーション独自の設定を読み書きする方法を説明します。VB.NET2003以前のバージョンではここで説明する内容は当てはまりませんので注意して下さい。
概要 ・My.Settingsを使用すると簡単にアプリケーションの設定を読み書きできます。
・設定の既定値はアプリケーション構成ファイルに保存される。アプリケーション構成ファイルは開発時はapp.config、実行時は(アプリケーション名).exe.configという名前のファイル。 ・設定にはユーザーごとの設定である「ユーザースコープ」と、アプリケーションで共通である「アプリケーションスコープ」の2種類がある。 ・ユーザースコープの設定を変更した場合は、ユーザーのアプリケーション設定フォルダにuser.configと言う名前のファイルが作成され、そこに値が保存される。 ・ユーザースコープの設定は読み書きできるが、アプリケーションスコープの設定は読み取りだけができる。 ・PropertyGridとMy.Settingsクラスを組み合わせることで簡単でしかもちゃんとした設定画面を作成することができる。 |
多少でも複雑なアプリケーションであれば独自の設定を保存する必要に駆られることが少なくありません。アプリケーションが動作している間はさまざまな設定を変数に格納しておけば十分かもしれませんが、この方法では一旦アプリケーションを終了して、次回起動したときには設定は初期化されてしまいます。
アプリケーションの設定を永続化するためには何らかの方法で設定を記録する必要があります。幸いVB2005には設定を簡単に保存したり読み込んだりする機能があり、今回はこの機能を中心に解説します。
この機能の具体的な話は少し後回しにするとして、一般的にはアプリケーションの設定を永続化するためにどのような手段があるか少し考えて見ましょう。
すぐに思いつくのは設定を外部のファイルに保存することです。VBではファイルの読み書きも簡単に行えますからこの方法でもあながち効率が悪いとはいえません。
さらに一昔前によく利用され、現在でもまだまだ使われているのがiniファイルです。iniファイルとは決まって形式を持っているテキストファイルのことでたとえば、次のように設定が保存されます。
[SYSTEM] UserLevel = 1 LastFile = C:\Test\Dummy.txt [CONFIG] |
■図1:iniファイルの例
適当に設定例を書きましたが、設定の項目名や内容などはまったく自由で構いません。ただしテキストファイルベースなので必然的に文字列で表現できるものに限られます。みなさんのパソコンの中にも拡張子がiniであるファイルがたくさん入っていると思いますので試しに開いてみれば上記のような形式になっているのが確認できます。
ただ、昔も今もVBにはiniファイルを直接読み書きする機能がありません。Windows APIを使用すれば簡単にできるのですがVBの機能としては直接サポートされていません。VB6時代は設定をレジストリに保存することが推奨されていましたし、現在ではXML形式で保存することが推奨されているからです。
そうは言ってもiniファイルはわかりやすさや、設定の変更・移行の容易さに優れているため公式にiniファイルをサポートして欲しいものです。
iniファイルのほかにはレジストリに設定を保存して読み書きする方法があります。しかし、パワーユーザーはレジストリに勝手に書き込まれることを嫌う傾向があり、この方法は受けがよくありません。
また設定を手動で編集したり他の環境に移行するのがやや面倒です。
とは言え、この方法はVBで公式にサポートされておりiniファイルや外部のファイルに設定を保存するのに比べてプログラムは非常に簡単になります。
今回紹介する方法はiniファイルともレジストリとも異なりますが公式にサポートされている上になかなか扱いやすく、私個人としては気に入っています。節を改めて詳しく説明します。
まず、外部に保存した設定を簡単に読み込む方法を紹介します。とりあえず適当に設定を作りましょう。設定の編集自体がVBでサポートされています。
設定を編集するにはソリューションエクスプローラで「My Project」をダブルクリックして設定画面を開いてください。
■画像1:My Project
設定画面で、文字通り「設定」ページでアプリケーション設定を編集することができます。初期状態では当然ですが何の設定もありません。
■画像2:設定画面
ここにとりあえずテストのために以下のように設定を作成して下さい。各項目の意味は後で説明します。
名前 | 型 | スコープ | 値 |
Test1 | String | ユーザー | こんにちは |
Test2 | String | ユーザー | 銀座アスター |
■表1:設定の内容
■画像3:設定を2つ作成したところ
これで設定はできました。完了したら一旦プログラムを保存して下さい。ここまでの手順で設定を編集するのが驚くほど簡単であると言うことがわかっていただけたと思います。
プログラムでこの設定を読み込むのも非常に簡単です。
以下の例は上記の設定を読み込んで表示します。試しに実行してみて下さい。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles Button1.Click Dim Test1 As String Dim Test2 As String Test1 = My.Settings.Test1 Test2 = My.Settings.Test2 MsgBox(Test1 & ", " & Test2) End Sub |
■リスト1:アプリケーション設定の読み込み
このようにMy.Settingsを使用するとクラスのメンバに組み込まれた形で設定にアクセスすることができます。VBの設定画面で編集した内容が自動的にプログラム化されているのです。
ところで、この設定はどこに保存されているのでしょうか?
実は設定を作成したタイミングでapp.configというファイルが自動的に生成されておりここに書き込まれています。
このファイルはソリューションエクスプローラにも追加されます。
■画像4:app.config
ファイルを開いてい見るとXML形式でたしかに設定が保存されているのが確認できます。
<userSettings> <SettingTest.My.MySettings> <setting name="Test1" serializeAs="String"> <value>こんにちは</value> </setting> <setting name="Test2" serializeAs="String"> <value>銀座アスター</value> </setting> </SettingTest.My.MySettings> </userSettings> |
■図2:app.confg(部分)
このファイルを直接編集して設定をいじることもできますが、My.Settingによる簡単なアクセス方法を利用するのにラグが発生する場合がありますので、普通に先ほど紹介した方法で設定を編集する方がよいでしょう。
参考 - app.configとアプリケーション構成ファイル app.configはアプリケーションの設定を保存するのに使用されるファイルです。このファイルは今回紹介しているようにアプリケーション後の固有の設定を保存するのにも使われますし、.NET Frameworkが自動的にアクセスする情報を保存するのにも使われます。 実行時にはアプリケーション名に拡張子configをつけたファイル名となって、アプリケーションと同じフォルダに配置されます。たとえば、アプリケーションがMyApp.exeであれば、MyApp.exe.configと言うファイルがこれです。 このファイルは「アプリケーション構成ファイル」と呼ばれます。デザイン時と実行時とで名前が違うので混乱しないように注意して下さい。 また、その形式にも決まりがあるので無関係な部分を適当に変更してしまわないように気をつけてください。 |
さて、今度はプログラムからアプリケーション設定の値を変更してみましょう。
次のようになります。
Private
Sub Button2_Click(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles Button2.Click Dim Test1 As String = "こんばんは" Dim Test2 As String = "西園寺公望" My.Settings.Test1 = Test1 My.Settings.Test2 = Test2 End Sub |
■リスト2:アプリケーション設定の書き込み
これも想像通り単純なコードだと思います。実行してからさきほどのリスト1のコードを使って値を表示させれば、ちゃんと設定が変わっているのがわかります。もちろんアプリケーションを一旦終了させてもこの設定は保存されていますので、次回からはいきなりリスト1のコードで設定を読み込んでも「こんばんは、西園寺公望」と表示されます。
プログラムのしやすさの観点からはこんなに直感的でわかりやすく、おまけにシンプルな方法でアプリケーション設定を読み書きできるとは本当に便利なものです。
ところが、ここでちょっと先ほどの設定編集画面を開いてみて下さい。設定が「こんばんは」、「西園寺公望」に書き変わっているのかと思われるのかも知れませんが、実は設定は「こんにちは」、「銀座アスター」のままです。
■画像5:設定値は変更されていない
念のためにapp.configファイルを開いてみてもやはり設定値は最初のままです。新しい設定は一体どこに保存されているのでしょうか?
実は最初の設定は設定の既定値としてずっと保存され、新しい設定はこれとは別に外部に記録されるようになっています。
というのもアプリケーションを使うユーザーごとに設定が異なるケースを考慮しているからです。具体的には次の場所にあります。
C:\Documents and Settings\(ユーザー名)\Local Settings\Application Data\(会社名)\SettingTest.vshost.exe_Url_w1nydysf1iimfumwe5qg2jkrjc5fpfhm\1.0.0.0\user.config
上記は私のパソコンでの例ですのでみなさんのパソコンでは当然違います。また会社名やアプリケーションの名前によっても異なります。
このフォルダ名はほんの一例に過ぎませんが、この例をみればどういうことになっているか理解いただけるでしょう。要するに各ユーザーのフォルダのアプリケーション設定フォルダにアプリケーション名が完全に限定される形で格納されているのです。
なお、ここでいうユーザー名とはWindowsにログオンしているユーザーの名前で、会社名とはVBでアセンブリ情報のところで設定する会社名のことです。
■画像6:アセンブリ情報
念のために書いておきますが、このアセンブリ情報画面は設定画面で「アプリケーション」ページを開いて、「アセンブリ情報」というボタンを押すと表示されます。
このようなわけですから会社名を変更するとuser.configの保存場所も変更されます。
user.configに値が書き込まれるのは通常はアプリケーションを終了したときです。ただしSaveメソッドを使用すればその時点で書き込みを行うこともできます。
Private
Sub Button2_Click(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles Button2.Click Dim Test1 As String = "こんばんは" Dim Test2 As String = "西園寺公望" My.Settings.Test1 = Test1 My.Settings.Test2 = Test2 My.Settings.Save() End Sub |
■リスト3:Saveメソッドを使うとアプリケーション設定の変更を直ちにuser.configに書き込む。
設定が即座にファイルに書き込まれなくても、設定を変更してからuser.configファイルに書き込まれるまでの間でもアプリケーション内では新しい設定の方が有効になっているので特に困ることはありません。
user.configファイルを直接開いて編集すれば当然アプリケーションの設定は変わります。このことは覚えておくと便利でしょう。
それから、app.configに記載されている値は設定の既定値として有効です。つまり、何かの原因でuser.configが削除されたり、新しい環境にプログラムを導入したときには設定値はあくまでもapp.configに記載されている値と言うことになります。
さて、設定の適用範囲には「ユーザースコープ」と「アプリケーションスコープ」の2種類があります。上記で紹介したのはユーザースコープの方で、この設定はユーザーごとに違った設定を保存することが可能なため、既に説明したように各ユーザーのフォルダにuser.configというファイルを作成してそこに設定が保存されるようになっています。
これに対してアプリケーションスコープの設定はアプリケーションで共通の設定です。ですから保存場所も異なります。
設定編集画面でアプリケーションスコープの設定を作成して試してみましょう。スコープは画面の「スコープ」欄で簡単に変更できます。
次の設定を追加して下さい。
名前 | 型 | スコープ | 値 |
App1 | String | アプリケーション | Visual Basic |
App2 | String | アプリケーション | 中学校 |
■表2:アプリケーションスコープの設定の内容
■画像7:アプリケーションスコープの設定を追加したところ
スコープが違っても読み込み方法はまったく同じです。
Private
Sub Button3_Click(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles Button3.Click Dim App1 As String Dim App2 As String App1 = My.Settings.App1 App2 = My.Settings.App2 MsgBox(App1 & " " & App2) End Sub |
■リスト4:アプリケーションスコープでの読み込み方はまったく同じ
しかし、書き込み方はちょっと事情が異なります。実はアプリケーションスコープの設定はプログラムから値を変更することができません。これは複数のユーザーが使っているアプリケーションの共通の設定を1人のユーザーが勝手に変更してしまっては困ると言う発想からです。
アプリケーションスコープの値はプログラム外で設定編集画面を使用して変更する必要があります。
実行環境ではアプリケーション構成ファイルを直接編集することで設定を変更します。
設定値に文字列以外の型を指定することもできます。設定編集画面で「型」のところで型を選べば生成されるプロパティもそれに応じた型のものとなります。
■画像8:Integer型の設定値
最後にアプリケーション側で設定を簡単に参照・変更できる便利な設定画面の作成方法を紹介しましょう。
My.Settingsクラスはすばらしいことにプロパティとして設定を実装しているのでプロパティグリッドコントロールを使うことにより、とても簡単に設定画面を作成することができます。
設定画面用のフォームにプロパティグリッドを配置して次のようにプログラムするだけです。もちろんOKボタンとキャンセルボタンも配置してそれらしい画面にしましょう。フォームのサイズ変更を不可にするか、Dockプロパティなどをうまく調節してサイズ変更に対応した画面にすれば言うことありません。
Public Class
frmSetting Private Sub frmSetting_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load PropertyGrid1.SelectedObject = My.Settings End Sub |
Private Sub
btnOK_Click(ByVal sender
As System.Object,
ByVal e As System.EventArgs)
Handles btnOK.Click My.Settings.Save() Me.Close() End Sub |
Private Sub btnCancel_Click(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles btnCancel.Click My.Settings.Reload() Me.Close() End Sub End Class |
■リスト5:設定画面
これで次のような画面になります。
■画像9:設定画面
これだけでもう立派な設定画面と言えるでしょう。
こって作ればカテゴリーや説明に好きな文字列を表示することもできますが、アプリケーション設定に対してこの方法は公式にはサポートされていないみたいです。設定画面で設定を編集すると折角のカテゴリーや説明も削除されてしまいます。
■画像10:さらにカスタマイズした設定画面
このような文字列を指定するにはSettings.Designer.vbを直接編集します。今回の例では次のようにしました。
いろいろと書いてありますが自分で追加したのは上の2行だけで、あとは自動生成されたコードです。
<System.ComponentModel.Category("私の好きなもの")>
_ <System.ComponentModel.Description("好きなレストランを指定します。")> _ <Global.System.Configuration.UserScopedSettingAttribute(), _ Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ Global.System.Configuration.DefaultSettingValueAttribute("銀座アスター")> _ Public Property Test2() As String Get Return CType(Me("Test2"), String) End Get Set(ByVal value As String) Me("Test2") = value End Set End Property |
■リスト6:アプリケーション設定へのカテゴリと説明用の文字列の追加
Settings.Designer.vbファイルは標準設定では隠されているのでソリューションエクスプローラですべてのファイルを表示するようにしないと見えません。
■画像11:Settings.Designer.vb