Palm Programmer's Laboratory

トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Palm OS Programmer's Companion Volume I/6-2

← 1 節に戻る ↑6 章トップへ 3 節に進む →


6-2 リソースマネージャ

 
アプリケーションはデータマネージャに似た、チャンクの取得と保存に便利なリソースマネージャを利用することができます。リソースマネージャは一意なリソースタイプとリソースIDで各データチャンクをタグ付けする機能を持っています。これらのタグ付けされたチャンクはリソースと呼ばれ、リソースデータベースに保存されます。リソースデータベースは通常のデータベースとほぼ同じ構造ですが、リソースレコードあたり2バイトのわずかなストレージオーバーヘッドがあります。実際、リソースマネージャは概念的な理由のみから抽出されたデータマネージャ関数のサブセット以上のものではありません。

リソースは通常、画像やフォント、ダイアログレイアウトなど、アプリケーションのユーザーインターフェース要素を格納するために使用されます。アプリケーションの構築にはこれらのリソースを作成して実際の実行コードにマージする作業が含まれます。Palm OS の環境では、アプリケーションは実際にはシンプルなリソースデータベースであり、1つ以上のコードリソースとして保存された実行コードと、その他のリソースタイプで同じデータベースに保存された画像などのデータが含まれています。

アプリケーションはプリファレンスやウィンドウ位置、状態情報などの取得や保存にもリソースマネージャが便利であることに気付くかもしれません。これらのプリファレンスは別のリソースデータベースに保存することができます。

このセクションではリソースマネージャの使い方を説明します。以下のトピックがあります。

  • リソースデータベースヘッダの構造
  • リソースマネージャの使用
  • リソースマネージャ関数
訳注:上記のように3つのトピックが列挙されていますが、
   原著では3つ目の「リソースマネージャ関数」は
   [[4 節|Palm OS Programmer's Companion Volume I/6-3]]にリンクされています。

 

リソースデータベースヘッダの構造

リソースデータベースヘッダは、いくつかの一般的なデータベース情報とデータベース内のリソースのリストで構成されています。ヘッダの最初の部分は通常のデータベースヘッダと同じ構造になっています。リソースデータベースヘッダは attributes フィールドの dmHdrAttrResDB ビットの状態によって通常のデータベースヘッダと区別されます。

IMPORTANT
リソースデータベースヘッダの構造は将来変更される可能性があります。リソースデータベースを使用する場合は API を使用して下さい。
  • name フィールドはリソースデータベースの名前を保持しています。
  • attributes フィールドはデータベースのフラグを保持しており、dmHdrAttrResDB ビットは常にセットされています。
  • データベース内のリソースが削除、追加、あるいは変更されるたびにインクリメントされる modificationNumber フィールド。これにより、アプリケーションは共有リソースデータベースが他のプロセスによって変更されたことを素早く検出できます。
  • appInfoID と sortInfoID フィールドは通常リソースデータベースでは必要ありませんが、普通のデータベースと構造を同じにするために含まれています。アプリケーションは必要に応じて自由な目的にこれらのフィールドを使用できます。
  • type と crerator フィールドは、そのデータベースを作成したアプリケーションが定義した 4 バイトのデータベースタイプとクリエータ情報を保持します。
  • numResources フィールドはヘッダに保存されているリソース情報エントリの数を保持します。ほとんどの場合、これはリソースの数を表します。ただし、全リソース情報エントリがヘッダに収まらない場合、次のリソース情報エントリのセットを格納する resourceList のチャンクIDが nextResourceList に格納されます。

ヘッダ内の 10 バイトのリソース情報エントリは、それぞれがリソースタイプ、リソース ID、およびリソースデータを含むメモリマネージャチャンクのローカル ID を保持しています。

 

リソースマネージャの使用

通常のレコードベースのデータベースを作成するのに使用した関数を使って、リソースデータベースの作成、削除、オープン、クローズを行うことができます(“データマネージャの使用”を参照)。これにはデータマネージャの全てのデータベースレベル(レコードレベルではありません)の関数が含まれます。例えば DmCreateDatabase、DmDeleteDatabase、DmDatabaseInfo などです。

DmCreateDatabase を使って新しいデータベースを作成する際、作成されたデータベースの種類( レコードかリソースか )は resDB パラメータの値に依存します。このパラメータがセットされている場合、リソースデータベースが作成され、データベースヘッダの attributes フィールドに dmHdrAttrResDB ビットがセットされます。データベースヘッダ ID を使って DmDatabaseInfo をコールし、返される attributes フィールドの値の dmHdrAttrResDB ビットを検査することでそのデータベースの種類を確認することができます。

リソースデータベースがオープンされると、アプリケーションはリソースマネージャのリソースベースのアクセス関数を使用してデータベースのリソースを取得あるいは操作できます。一般に、アプリケーションは DmGetResource 関数と DmReleaseResource 関数を使用します。

DmGetResource は、指定されたタイプと ID に合致するリソースのハンドルを返します。この関数は全てのオープンされているリソースデータベースから指定されたタイプと ID を持つリソースを検索し、そのハンドルを返します。検索は最後にオープンされたデータベースから開始されます。全てのオープンされているデータベースではなく最後にオープンされたデータベースだけを検索するには、DmGet1Resource 関数をコールします。

アプリケーションがリソースデータの読み書きを終了したら、すぐに DmReleaseResource をコールします。リソースをリサイズするには、DmResizeResource をコールします。この関数はリソースのハンドルを受け取り、それを必要なら同一カード内の別のヒープに再アロケートします。この関数はリソースのハンドルを返しますが、リサイズのために別のヒープに移動する必要があった場合、ハンドルが変更されている場合があります。

その他のリソースマネージャ関数は、通常ほとんどのアプリケーションでは必要ありません。これには、リソースの属性を取得・設定する関数、リソースを別のデータベースに移動する関数、リソースをインデックス指定で取得する関数、および新しいリソースを作成する関数などが含まれます。これらの関数のほとんどはパフォーマンスの最適化のためにリソースをインデックスで指定します。リソースをインデックスで指定する場合、リソースが所属しているリソースデータベースの DmOpenRef 値を併せて指定する必要があります。タイプと ID、またはポインタを指定して全てのオープンされているリソースデータベースからリソースを検索するには DmSearchResource 関数をコールします。

オープンされているリソースデータベースの最上位の DmOpenRef を取得するには、パラメータの DmOpenRef 値に NULL を指定して DmNextOpenResDatabase をコールします。後続するそれぞれのデータベースの DmOpenRef 値を取得するには、直前の DmOpenRef 値を指定して繰り返し DmNextOpenResDatabase 関数をコールします。

特定のリソースデータベースのアクセスポインタを指定することにより、DmFindResource を使って指定されたタイプと ID を持つリソースのインデックスを取得できます。DmFindResourceType を使えば、与えられたタイプを持つ全てのリソースのインデックスを取得できます。インデックスからリソースハンドルを取得するには、DmGetResourceIndex をコールします。

データベースにどれだけのリソースが含まれているかを取得するには、DmNumResources をコールします。タイプと ID を含むリソースの属性を取得・設定するには、DmResourceInfo と DmSetResourceInfo をコールします。既存のデータチャンクを新しいリソースとしてリソースデータベースに追加するには DmAttachResource をコールします。データベースからリソースを取り外すには DmDetachResource をコールします。

新しいリソースを作成するには、DmNewResource をコールして希望のサイズ、タイプ、ID を渡します。リソースを削除するには DmRemoveResource をコールします。リソースの削除により、そのデータチャンクは破棄され、データベースヘッダからはエントリが削除されます。

 


← 1 節に戻る ↑6 章トップへ 3 節に進む →