Prototype > C++ アプリケーションでプロトタイプを使用する > プロトタイプを使用した C++ アプリケーションのプログラミング
 
プロトタイプを使用した C++ アプリケーションのプログラミング
一般的には、Rogue Wave® Views Studio でプロトタイプを作成し、これらをアプリケーションで使用します。以下のセクションでは、アプリケーションにプロトタイプを追加するために使用する C++ API と、これらのプロトタイプの操作方法を説明します。
メモ: 一般的ではありませんが、プロトタイプを直接コーディングで作成することもできます。この場合の詳細については、コーディングによるプロトタイプの作成 を参照してください。
このセクションでは、次の項目を説明します。
*ヘッダー・ファイル
*プロトタイプ・インスタンスを含むパネルの読み込み
*プロトタイプの読み込み
*プロトタイプ・インスタンスの作成
*プロトタイプ・インスタンスの削除
*グループおよびプロトタイプ・インスタンスの取得
*アトリビュートの取得と設定
*ユーザー定義および定義済みのアトリビュート
ヘッダー・ファイル
アプリケーションが必要なライブラリー・パッケージにリンクされていることを確認するために、まずグラフィック・オブジェクト、アクセサー (IlvUserAccessor のサブクラス)、および読み込もうとするプロトタイプで使用されるインタラクターに対応するヘッダー・ファイルを含めなくてはなりません。
すべての定義済みアクセサー・クラスを含めるには、ヘッダー・ファイル <ILVHOME>/include/ilviews/protos/allaccs.h を使用します。
次は、あらゆるタイプのグラフィック・オブジェクトを含むプロトタイプを読み込むことのできるアプリケーションを構築するために含めるヘッダー・ファイルの典型的なセットです。
#include <ilviews/protos/protogr.h> // for IlvProtoGraphic.
#include <ilviews/protos/allaccs.h> // for all accessors.
#include <ilviews/graphics/all.h> // for all graphic objects.
#include <ilviews/gadgets/gadgets.h> // if you use gadgets in your prototypes.
#include <ilviews/graphics/inter.h> // for all object interactors.
以下のヘッダー・ファイルを追加することもできます。
#include <ilviews/protos/groupholder.h> // to get the groups attached
// to a given container or manager.
#include <ilviews/protos/proto.h> // to manipulate prototypes and
// their libraries.
#include <ilviews/protos/grouplin.h> // to attach prototypes to
// application objects.
使用するプロトタイプが前もってわかっている場合、allaccs.hgraphics.h、および gadgets.h の代わりに必要なヘッダー・ファイルのみを含めることで、アプリケーションのサイズを小さくすることができます。
プロトタイプ・パッケージを使用するアプリケーションをコンパイルするには、これらをライブラリー ilvproto でコンパイルする必要があります。このライブラリーも、以下のライブラリーを必要とします。ilvgrapherilvmgr、および使用プラットフォーム別の標準 Rogue Wave Views ライブラリー。ilvgdpro ライブラリーは、プロトタイプの古い機能を使用するアプリケーションで必要となる場合があります。
プロトタイプ・インスタンスを含むパネルの読み込み
プロトタイプ・インスタンスを含む.ilv ファイルを読み込むには、read、または IlvManager、あるいは IlvContainerreadFile メソッドを使用します。
Container->readFile("protoSample.ilv");
ファイルで使用されるすべてのファイルは、それらのプロトタイプ・ライブラリーから自動的に読み込まれます。プロトタイプ・ライブラリーは、表示パスを使用してファイル・システム内で検索されます。たとえば、パネルが /usr/home/yourdir/protolibs/mylib.ipl にある mylib と呼ばれるプロトタイプ・ライブラリーからのプロトタイプを含む場合、/usr/home/yourdir/protolibs/ILVPATH 環境変数に含める必要があります。
コンテナーあるいはマネージャー内でグループの処理を可能にするために、IlvGroupHolder クラスがすべての必要なインターフェースを提供します。IlvGroupHolder クラスのインスタンスは、自動的にコンテナーあるいはプロトタイプ・インスタンスを含むマネージャーに付加されます。このクラスは、グループ (その結果としてプロトタイプ・インスタンスも) の追加、削除、取得のメソッドを提供します。コンテナー、マネージャーあるいはグラフィック・ホルダーを、次の汎用メソッドで取得することができます。
*IlvGroupHolder* groupHolder = IlvGroupHolder::Get(manager);
*IlvGroupHolder* groupHolder2 = IlvGroupHolder::Get(manager
->getHolder());
*IlvGroupHolder* groupHolder3 = IlvGroupHolder::Get(container);
プロトタイプの読み込み
コーディングによってプロトタイプのインスタンスを作成する場合があります。プロトタイプのインスタンスを作成するには、まずこれらを読む込みます。プロトタイプ・ライブラリー全体を読む込んだ後、それが含む 1 つ以上のプロトタイプを読み込みます。これを行うには、IlvProtoLibrary クラスのインスタンスを作成し、その load メソッドを呼び出します。
IlvProtoLibrary* lib = new IlvProtoLibrary(display, "mylib");
if(!lib->load())
IlvFatalError("Could not load prototype library");
表示パスにないプロトタイプ・ライブラリーを読み込みたい場合は、コンストラクターを呼び出してライブラリーが位置するディレクトリーを指定することができます。
IlvProtoLibrary* lib = new IlvProtoLibrary(display, "mylib",
"/usr/somewhere/protos");
if(!lib->load())
IlvFatalError("Could not load prototype library");
プロトタイプ・ライブラリーを読み込むと、そのすべてのプロトタイプあるいは特殊プロトタイプを次のメソッドで取得することができます。
IlUInt count;
IlvPrototype** protos = lib->getPrototypes(count);
または
IlvPrototype* proto = lib->getPrototype("myproto");
getPrototypes メソッドで返された配列は、new[] 演算子で割り当て、必要がなくなったときは delete[] 演算子で削除します。
代わりに、各プロトタイプを個別にグローバル関数 IlvLoadPrototype で読み込むこともできます。
IlvPrototype* proto = IlvLoadPrototype("mylib.myproto", display);
最初の引数は、プロトタイプ・ライブラリーの名前およびプロトタイプの名前 (ピリオドで分けられている) を指定します。2 番目の引数は、アプリケーションが作成した IlvDisplay インスタンスです。プロトタイプ・ライブラリー・ファイルおよびプロトタイプ・ファイルは、表示パスを使用してファイル・システムの内で検索されます。
プロトタイプ・インスタンスの作成
プロトタイプのインスタンスを作成するには、メソッドclone を使用します。
IlvPrototypeInstance* instance = proto->clone("myinstance");
clone メソッドの引数は、新しいインスタンスの名前です。0 を渡すことができます。これで、名前が自動的に生成されます。
IlvGroupHolder クラスのインスタンスは、自動的にコンテナーあるいはプロトタイプ・インスタンスを含むマネージャーに付加されます。このクラスは、グループ (その結果としてプロトタイプ・インスタンスも) の追加、削除、取得のメソッドを提供します。
新しいプロトタイプ・インスタンスをマネージャーあるいはコンテナーに追加するには、マネージャー/コンテナー・クラスに付加されている IlvGroupHolderaddGroup メソッドを使用することができます。
IlvGroupHolder* groupHolder = IlvGroupHolder::Get(manager);
groupHolder->addGroup(instance);
代わりに IlvProtoGraphic オブジェクトを作成し、直接これをマネージャーに配置できます。
IlvPrototype* proto;
// Create an instance of the prototype proto and places it
IlvProtoGraphic* protoGraphic1 = new IlvProtoGraphic(proto);
// Create an instance of a prototype
IlvProtoInstance* protoInstance = proto->clone(?instance2?);
IlvProtoGraphic* protoGraphic2 = new IlvProtoGraphic(protoInstance);
manager->addObject(protoGraphic1);
manager->addObject(protoGraphic2);
プロトタイプ・インスタンスをマネージャーあるいはコンテナーに追加したときに、プロトタイプ・インスタンスの位置を設定することがよくあります。この場合は、次の手順に従います。
*IlvProtoGraphic を移動します。
manager->moveObject(protoGraphic1, 100, 100).
*プロトタイプ・インスタンスの x および y アトリビュートを設定します。1 回の呼び出しで複数の値を設定する方法については、アトリビュートの取得と設定を参照してください。
プロトタイプ・インスタンスの削除
プロトタイプ・インスタンスをそのコンテナーあるいはマネージャーから削除するには、IlvGroupHolder クラスの removeGroup メソッドを使用します。
groupHolder->removeGroup(instance);
埋め込まれた IlvProtoGraphic を、コンテナーあるいはマネージャーから削除することもできます。
manager->removeObject(protoGraphic);
プロトタイプ・インスタンスを完全に削除するには、delete 演算子を呼び出します。カプセル化する protoGraphic を削除することもできます。
グループおよびプロトタイプ・インスタンスの取得
マネージャーあるいはコンテナーに含まれるすべてのグループを取得するには、付加されているグループ・ホルダーの getGroups メソッドを使用します。
IlUInt count;
IlvGroup** instances = groupHolder->getGroups(count);
メモ: getGroups メソッドで返されたポインターの配列は、new[] 演算子で割り当て、必要がなくなったときは delete[] 演算子で削除する必要があります。
グループをその名前で取得するには、getGroup メソッドを使用します。
IlvProtoInstance* pump = (IlvProtoInstance*)groupHolder->getGroup("pump");
このメソッドは指定したグループが存在しない場合、0 を返します。
アトリビュートの取得と設定
プロトタイプ・インスタンスは、API に基づいて名付けられた同一のアトリビュート (プロパティーあるいはアクセサーとも呼ばれる) を通じて操作されます。この API は、クラス IlvGraphic から提供されるものと同じで、基本的に IlvGraphic::changeValue および IlvGraphic::queryValue メソッドから構成されています。
名前の付いているアトリビュートは、IlvValue クラスのインスタンスによって表示され、下記によって定義されています。
*アトリビュート名。たとえば、ボタンのラベルにアクセスする「label」。
*値、これは異なるタイプのものでも良い (たとえば、文字列、整数あるいはポインター)。
*データのタイプに対応するタイプ。
値のタイプは、IlvValue クラスによって自動的に設定されます。定義済みタイプの値を初期化するためにコンストラクターを使用します (IlIntconst char*IlvColor* など)。代入演算子 = を使用するか、定義済みタイプへ IlvValue をキャストさせて、値を変更することもできます。IlvValue クラスは、すべての変換を自動的に処理します。詳細は、IlvValue クラスを参照してください。
プロトタイプ・インスタンスに値を設定するには、IlvValue を作成し、IlvGraphic::changeValue メソッドを呼び出します。
IlvValue xval("x", (IlInt)100);
instance->changeValue(xval);
メモ: 100 をタイプ IlInt に明示的にキャストしなければならないのは、整数とブール型のタイプにあいまいさが存在するためです。キャストしないと、
(あるプラットフォーム上で) コンパイラーが、タイプ IlBooleanIlvValue を作成するコンストラクターを呼び出すことがあります。IlvValue の初期化に定数を使用するときは、常に明示的キャストを使用することをお勧めします。
値を変更するときに毎回新しい IlvValue を作成する必要はありません。既存の IlvValue を使用して、このデータを代入演算子で変更することができます。
xval = (IlInt)200;
instance->changeValue(xval);
1 回の呼び出しで複数の値を設定することができます。これを行うには、IlvValue オブジェクトの配列を作成して初期化し、changeValues メソッドを呼び出します。次の例は、1 回の呼び出しでオブジェクトの位置を設定する方法を表しています。
IlvValue vals[] = {
IlvValue("x", (IlInt)100),
IlvValue("y", (IlInt)200)
};
instance->changeValues(vals, 2);
値を取得するには、queryValue メソッドを使用します。
IlvValue xval("x");
IlInt x = instance->queryValue(xval);
queryValue メソッドは、パラメーターとして IlvValue リファレンスを取ります。IlvValue は取得する値の名前で初期化する必要があります。queryValue メソッドは取得した値をその引数に保存し、そのリファレンスを返します。例では、queryValue の結果を整数変数 x に代入することで、IlInt キャスト演算子への IlvValue を呼び出します。
1 回の呼び出しで複数の値を取得するには、IlvValue オブジェクトの配列を作成し、queryValues メソッドを呼び出します。
IlvValue vals[] = { "x", "y", "width", "height" };
instance->queryValues(vals, 4);
IlInt x = vals[0];
IlInt y = vals[1];
IlUInt width = vals[2];
IlUInt height = vals[3];
IlvValue クラスは、必要に応じて値を自動的に変換します。つまり、設定、あるいは取得する値のタイプを正確に知っている必要はありません。たとえば、オブジェクトの位置を、下記のように文字列値を使用して設定することができます。
IlvValue xval("x", "100");
instance->changeValue(xval);
逆に言えば、値を取得するとき、次のようにして必要なタイプに変換することができます。
IlvValue xval("x");
instance->queryValue(xval);
float x = xval;
ユーザー定義および定義済みのアトリビュート
プロトタイプおよびそのインスタンスには、3 種類のアトリビュート、ユーザー定義アトリビュート、定義済みアトリビュート、およびサブ・アトリビュートがあります。
ユーザー定義アトリビュート
ユーザー定義アトリビュートは、Rogue Wave Views Studio でデザインしたときにプロトタイプに付加したアクセサーによって定義されるアトリビュートです。これらはプロトタイプによって異なります。ユーザー定義アトリビュートの設定あるいは取得の効果は、これを構成するアクセサー・オブジェクトによって決定されます。
たとえば、温度計を表すプロトタイプを作成したとします。temperature アトリビュートを、温度を計器の value アトリビュートにマッピングするリファレンス・アクセサーを追加して定義します。プロトタイプのインスタンスによって表示されている温度を変更するには、次のようにchangeValue メソッドを使用します。
IlvValue tempVal("temperature");
tempVal = 22.5;
instance->changeValue(tempVal);
定義済みアトリビュート
グループの定義済みアトリビュートにより、すべてのプロパティーが持つ位置、サイズ、可視性などの共通プロパティーを変更したり取得することができます。
ほとんどの定義済みアトリビュートは、グループがマネージャーあるいはコンテナーに追加されたときにのみ有効になりますが、それよりも前に設定しておくことができます。これらはグラフィック・ノードに保存されますが、グループが追加されたときにのみ有効になります。
定義済みアトリビュートを、Table 4.2に一覧表示します。
プロトタイプおよびプロトタイプ・インスタンスの定義済みアトリビュート 
アトリビュート
タイプ
説明
layer
IlInt
グループのすべてのノードを任意のレイヤーに移動させるためにこのアトリビュートを設定します。このアトリビュートを取得すると、グループのノードが含まれるレイヤーを返します。すべてのノードが同じレイヤーにある場合、結果は定義されません。
visible
IlBoolean
このアトリビュートを設定し、グループの表示/非表示を行います。このアトリビュートの取得は、グループのすべてのグラフィック・ノードが表示されている場合、IlTrue を返し、すべてが非表示の場合は IlFalse を返します。一部のノードが表示され、その他のノードが非表示である場合、結果は定義されません。
x
IlInt
このアトリビュートはグループ・バウンディング・ボックスの左上隅 (マネージャー座標内) の水平座標で、どのようなビュー・トランスフォーマーも適用しません。
y
IlInt
このアトリビュートはグループ・バウンディング・ボックスの左上隅 (マネージャー座標内) の垂直座標で、いかなるビュー・トランスフォーマーも適用しません。
width
IlUInt
このアトリビュートはグループ・バウンディング・ボックス (マネージャー座標内) の幅で、いかなるビュー・トランスフォーマーも適用しません。
height
IlUInt
このアトリビュートはグループ・バウンディング・ボックス (マネージャー座標内) の高さで、いかなるビュー・トランスフォーマーも適用しません。
centerX
IlInt
このアトリビュートはグループ・バウンディング・ボックス (マネージャー座標内) の中心の水平座標で、いかなるビュー・トランスフォーマーも適用しません。
centerY
IlInt
このアトリビュートはグループ・バウンディング・ボックス (マネージャー座標内) の中心の垂直座標で、いかなるビュー・トランスフォーマーも適用しません。
interactor
const char*
インタラクターをグループのすべてのグラフィック・ノードに関連させるために、このアトリビュートを設定します。アトリビュートの値は、インタラクター名です (たとえば、OButtonO)。このアトリビュートを取得すると、グループのグラフィック・ノードに関連しているインタラクターの名前を返します。すべてのノードが同じインタラクターを持つ場合、結果は定義されていません。
サブ・アトリビュート
プロトタイプのサブ・アトリビュートにより、プロトタイプに含まれているオブジェクトのアトリビュートに直接アクセスできます。サブ・アトリビュートの名前は、オブジェクトのパスとアトリビュート名を連結して作成します。サブ・アトリビュート名のコンポーネントは、ピリオドで分けられています。たとえば、プロトタイプが title と名付けられた IlvLabel を含む場合、そのラベルをアトリビュート名 title.label で設定あるいは取得できます。
Table 4.2に一覧表示されている定義済みのプロパティーすべては、特殊グラフィック・ノード用にアクセスすることができます。

Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.