この特集のトップページへ
Chapter 7:プレゼンテーション層の構築

head2.gif 7.9.2 ユーザーの設定をレジストリに記録する
 一般的なアプリケーションでは,ユーザーが設定した情報をレジストリに登録しておき,次回アプリケーションを起動したときにも,前回の設定を利用できるようにしたほうが利便性は高くなる。今回のアプリケーションであれば,ユーザーが設定したデータグリッドコントロールや階層フレキシブルグリッドコントロールの列幅,表示項目,絞り込みの設定などが,引き継ぎたい情報として挙げられるだろう。

 Visual Basicにおいてレジストリを操作するには,GetAllSettings関数,GetSetting関数,SaveSetting文,DeleteSetting文を用いる(Table 7-45)。

Table 7-45 Visual Basicにおけるレジストリ設定関数
関数名(ステートメント名)用途
GetAllSetting(アプリケーション名,セクション名)指定されたアプリケーション名セクション名の配下のレジストリキーの一覧を取得する
GetSetting(アプリムーション名,セクション名,キー名,デフォルト値)指定されたアプリケーション名セクション名キー名に記載された値を取得する。指定されたキーがレジストリに見つからないときには,デフォルト値で指定した値が戻る。デフォルト値は省略することもできる。省略した場合には,長さ0の文字列("")とみなされる
SaveSetting アプリケーション名,セクション名,キー名,書き込む値指定されたアプリケーション名セクション名キー名に値を書き込む。キーがなければ作成する
DeleteSetting アプリケーション名,セクション名, キー名指定されたアプリケーション名セクション名キー名のレジストリ情報を削除する。セクション名キー名は省略することもできる。省略した場合には,指定したアプリケーション名以下のすべてのキー,あるいは指定したセクション名以下のすべてのキーが削除される

 Table 7-45に示した関数では,レジストリのHKEY_CURRENT_USER\Software\VB and VBA Program Settingsの配下を操作することになる。

 たとえば,次のようなSaveSetting文を実行したとき,レジストリの状態はFig.7-113のようになる。

SaveSetting _
  "myAppName", _
  "mySection", _
  "myKey", _
  "myValue"
Fig.7-113 書き込まれたレジストリ
fig7_113

 書き込んだレジストリ情報は,GetSetting関数で取得できる。たとえばFig.7-113のように,レジストリに書き込まれた状態でGetSetting関数を次のように呼び出すと,myKeyキーの文字列値である“myValue”を取得できる。

MsgBox GetSetting( _
  "myAppName", _
  "mySection", _
  "myKey", _
  "myValue")

 書き込んだレジストリ情報を削除するには,DeleteSetting文を使う。たとえば,次のようにするとHKEY_CURRENT_USER\Software\VB and VBA Program Settings\myAppName\mySectionにあるmyKeyキーが削除される。

DeleteSetting _
  "myAppName", _
  "mySection", _
  "myKey"

 DeleteSetting文では,アプリケーション名セクション名キー名のうち「アプリケーション名だけ」もしくは「アプリケーション名セクション名だけ」といった指定をすることもできる。その場合,指定されたレジストリツリーの配下がすべて削除される。たとえば,次のようにすると,HKEY_CURRENT_USER\Software\VB and VBA Program Setting\myAppName以下(myAppName自身も含む)の情報がすべて削除される。

DeleteSetting _
  "myAppName"

 アプリケーション側では,以上で示したようなレジストリ操作関数を使って,ユーザーが設定した情報を記録したり,次回起動したときにその値を読み込んだりという処理を実装すればよい。具体的には,フォームがアンロードされるときに発生するUnLoadイベントでSaveSetting文を利用してレジストリ情報を書き込み,フォームがロードされるときに発生するLoadイベントでGetSetting関数を利用して書き込まれているレジストリ情報を読み込み,そのレジストリ情報に則ってアプリケーションの設定を初期化すればよい。

 たとえば,ユーザーがFormBillフォーム(Fig.7-105)のDGrid_Billデータグリッドに設定した列幅をレジストリに記録するには,FormBillフォームのUnLoadイベントの処理をList 7-209のように実装し,Loadイベントの処理を実装ずみのList 7-184からList 7-210へと変更すればよい。

 ただし,レジストリを使うときには,次の2点に注意しなければならない。

レジストリに書き込まれていないかもしれない
 レジストリはまれに壊れることがあるため,常にそのレジストリ項目があることを仮定してはならない。ユーザーがアプリケーションで設定した値をレジストリに書き込み,次回アプリケーションが起動したときにその設定値を読み込むという処理を実現する場合には,「常にレジストリ項目がある」ということを仮定せず,レジストリ項目がなかったときにはアプリケーションの初期値を代理的に使うなどの処理を実装しておく必要がある。GetSetting関数を呼び出したとき,もしレジストリ項目が見つからなければ,長さ0の文字列("")が戻るという仕様になっているから,その戻り値を判定してレジストリ項目が存在するかどうかをチェックすればよい。
 
画面の解像度が変わることがある
 ウィンドウの位置など画面の情報をレジストリに保存する際には,画面の解像度が変化することがあるという点について考慮しなければならない。たとえば,ある時点で1024×768ドットのディスプレイを使っていたユーザーが,次回アプリケーションを起動するときには,640×480ドットの画面モードを利用しているかもしれない。その場合,X座標が640を超えているウィンドウやY座標が480ドットを超えているウィンドウは,ユーザーに表示されることはなくなる。そのため,前回のウィンドウの表示位置をレジストリに記録しておき,次回起動時も同じ位置に表示する機能を実現するような場合には,十分な注意が必要となる。
 この問題は,プリンタの設定などについても同様である。プリンタの設定をレジストリに保存しておく場合,ユーザーが次回起動するときにも同じプリンタを利用するとは限らない。特にプリンタ特有の設定(たとえば両面印刷やホチキス止め機能などの設定)をレジストリに保存していた場合,次回起動時に使うプリンタがそれらの機能をサポートしていないと,レジストリを読み込んでプリンタに設定しようとしたところで実行時エラーが発生するおそれがある。

 なお,アプリケーションのインストーラ(セットアッププログラム)を提供する場合には,アプリケーションがアンインストールされるときに,アプリケーションが使用したレジストリ項目を削除する機能も追加すべきである。具体的には,アプリケーションがアンインストールされたときに,Fig.7-113で示したHKEY_CURRENT_USER\Software\VB and VBA Program Setting\アプリケーション名以下を削除すればよいだろう。具体的なインストーラの設定は,インストーラを作成するアプリケーション(たとえばVisual Basicに付属のディストリビューションウィザードを使うのか,InstallShieldなどのインストーラ作成用アプリケーションを使うのか,もしくはVisual Studio InstallerによるWindows Installerを使うのか)によって異なる。

Prev 132/134 Next