自分好みのガジェットを作る! Windowsサイドバーガジェット作り入門

第5回 ガジェットの設定周り,ドッキング,デバッグ

この記事を読むのに必要な時間:およそ 6 分

設定の保存と読み込み

設定の保存と読み込みのAPI

設定の保存と読み込みにはSystem.Gadget.Settingsオブジェクトのメソッドを利用します。このオブジェクトのメソッドを利用することで,開発者は設定ファイルのありかについて考えたりや読み書きにファイル操作等の手間を省くことができます。

なお,この仕組みを利用した場合の設定単位は「サイドバーに配置したガジェット」単位となります。つまり同じガジェットを複数登録しても設定は別々となりますし,設定の寿命は「ガジェットを追加して表示している間」となります。サイドバー自体を終了した場合などには残りますが,ユーザがガジェットをサイドバーから取り除いた場合には削除されます。

設定の保存と読み込みで利用するメソッドは,以下のものが用意されています。

System.Gadget.Settings.writeメソッド/
System.Gadget.Settings.writeStringメソッド

設定をガジェットの設定ファイル書き込みます。1つ目の引数に設定名を指定し,2つ目の引数に値を指定することで設定ファイルに値を書き込みます。

System.Gadget.Settings.readメソッド/
System.Gadget.Settings.readStringメソッド

write/writeStringメソッドで保存した値を読み出します。引数は1つだけ受け取り,1つ目の引数に設定名を指定します。読み出されると戻り値として値が返ってきます。

write, readメソッドにはともに対応するwriteString, readStringメソッドが用意されています。この2種類のメソッドの違いは値の型の扱いにあります。Stringつきメソッドは書き込みも読み込みもString型として扱います。それに対してStringなしメソッドの場合は型を推測して変換します。以下に簡単な例を示します。

System.Gadget.Settings.writeString("foo", "1000000000000000000000");
System.Gadget.Settings.read("foo"); // => 1e+21 (number)
System.Gadget.Settings.readString("foo"); // => "1000000000000000000000" (string)

なお,APIを利用して保存した設定は%USERPROFILE%\AppData\Local\Microsoft\Windows Sidebar\Settings.iniというファイルに保存されます。興味があれば一度覗いてみるとよいでしょう。

フォームに組み込む

以上で説明したことをまとめて,次のようなスクリプトを設定画面のHTMLに追加します。

<script type="text/javascript">
function onSettingsClosing (event) {
  if (event.closeAction == event.Action.commit) {
    // OK ボタンを押すと入力された文字列を設定項目InputTextに格納する
    System.Gadget.Settings.writeString("InputText", document.getElementById('inputText').value);
  }
}
function onLoad () {
  // 表示されたら設定項目InputTextから読み出してテキストボックスに入れる
  document.getElementById('InputText').value = System.Gadget.Settings.readString("InputText");
}

// 設定画面を閉じるときのイベント
System.Gadget.onSettingsClosing = onSettingsClosing;
// 設定画面が読み込まれたときのイベント(onShowSettingsイベントはガジェット側で使うもの)
window.onload = onLoad;
</script>

この状態で設定画面を開いて,何か入力して「OK」ボタンをクリックして再度開くと入力した内容が入っていることを確認できます。

ガジェット側に反映する

ガジェット側に反映するには,onSettingsClosedイベントを使って再読み込みするなどの方法があります。たとえば,以下のようなコードをガジェット側に書けばよいでしょう。

System.Gadget.onSettingsClosed = function (e) {
  document.getElementById('inputText').innerText = System.Gadget.Settings.readString("InputText");
};
楽をするためのヒント

ところで,設定の保存と読み込みは基本的に1つの項目に1つの値で保存されるのですが,そうすると読み込みなどが案外面倒になります。そこで前々回も説明した,JSONの利用をオススメします。

オブジェクトを文字列にシリアライズして保存し,読み込みはevalすればまとめて元のオブジェクトに戻すことができるため,扱いがとてもお手軽になります。

ドッキング

ガジェットはサイドバー上のみではなく,離してデスクトップ上に表示することもできます。サイドバーから離せるのであれば,サイドバーとくっついているときと離したときで,ガジェットの形を変えたいと思うこともあるでしょう。

たとえば,先ほども例として紹介した「天気」ガジェットですが,これはサイドバーから離すとサイズが変化し情報量が増えます。

図4 サイドバーから離した「天気」ガジェット

図4 サイドバーから離した「天気」ガジェット

このような動作をサポートするため,以下のイベントがSystem.Gadgetオブジェクトに用意されています。

System.Gadget.onDockイベント

サイドバーにガジェットがくっついた際に発生するイベントです。

System.Gadget.onUndockイベント

ガジェットがサイドバーから離れた際に発生するイベントです。これらのイベントを受け取ってガジェットに反映させるだけなので簡単です。

System.Gadget.onDock = function () { /* サイズを大きくする等 */ };
System.Gadget.onUndock = function () { /* サイズを小さくする等 */ };

著者プロフィール

沢渡真雪(さわたりまゆき)

普段はASP.NETやPerlでWebアプリケーションを書くのが主。興味の向きはWindows一般から.NET Framework,Perl(Plaggerとか)やMac OS Xなど。

URLhttp://www.misuzilla.org/