オブジェクトのプロパティ値を取得/設定するにはイベントプロシージャにおいて、 オブジェクトのプロパティに対してアクセスすることができます。 次のAPIを利用します。
プロパティ値の取得オブジェクトのプロパティを取得するには、WSCbase クラスのメンバ関数である getProperty() APIを利用します。
void event_procedure(WSCbase* object){
//WSNx (X座標)プロパティの値の文字列による取得
WSCstring x = object->getProperty(WSNx);
printf("x=%s\n",(char*)x);
//WSNy (Y座標)プロパティの値の取得
short y = object->getProperty(WSNy);
}
WSNx の例では、文字列で値を取得しています。文字列クラス WSCstring は、
内部で文字列領域の管理を時動的に行うので、
プログラマによる管理の心配はいりません。WSNy の例では、数値型で受け取っています。関数 getProperty() は、 WSCvariant 型で値を返しますが、WSCvariant 型は、それぞれの型に自動的に キャストされます。したがって、型変換をWSCvariant 型が行うので、 プログラマが気にするころはありません。 次の例は、整数型を、文字列型に変換するものを示します。
void cbop(WSCbase* object){
//WSNx (X座標)プロパティの値の文字列による取得
WSCstring x = object->getProperty(WSNx);
printf("x=%s\n",(char*)x);
//WSNy (Y座標)プロパティの値の取得
short y = object->getProperty(WSNy);
//整数型を文字列に変換
WSCvariant stry = y;
printf("y=%s\n",(char*)stry);
//VARIANT 型を浮動小数点型に変換
printf("y=%fl\n",(double)stry);
}
プロパティ値を、文字列で取得する場合における注意点ですが、
char* で直接取得する行為はやってはいけません。char* 文字列を取得したい場合は、下記の例のように一旦、 WSCstring で取得してから、 char* 文字列を取得してください。一旦、WSCstring で受け取ることで、 char* 文字列領域が WSCstring 内に確保され、参照可能となります。 悪い例のように、直接、char* で取得すると、getProperty が 返した WSCvariant が保持されること無く、開放されるため、 取得した、char* がすぐに無効となってしまいます。 この無効領域となってしまった char* にアクセスすると、メモリフォルトを 引き起こします。
void event_procedure(WSCbase* object){
//WSNlabelString 表示文字列プロパティの文字列による取得
//やってはいけない例
char* string = object->getProperty(WSNlabelString);
//WSNlabelString 表示文字列プロパティの文字列による取得
//良い例
WSCstring string1
string1 = object->getProperty(WSNlabelString);
char* str = (char*)string1;
}
プロパティ値の設定オブジェクトのプロパティを設定するには、WSCbase クラスのメンバ関数である setProperty() を利用します。次の例は、
void event_procedure(WSCbase* object){
//WSNx (X座標)プロパティの文字列による設定
char* x="100";
object->setProperty(WSNx,x);
//WSNy (Y座標)プロパティの設定
short y=100;
object->setProperty(WSNy,y);
}
WSNx の例では、文字列で値を設定しています。
WSNy の例では、整数型で値を設定しています。
関数 setProperty() は、WSCvariant 型を引数にします。したがって、
いろいろな型を自動的にキャストして、受け付けることができます。
プログラマは、型を気にせずアクセスできます。プロパティ値の描画への反映通常、イベントプロシージャの実行直後に反映されますが、変更後、 プロパティの値を直ちに反映させたい場合、update()、draw()、redraw() を呼び出します。ウィンドウシステムによっては、(例えば、X11 システムの場合など) 描画を行った際、すぐにウィンドウシステムに反映されない場合が あります。 そのような場合は、WSDappDev クラスの update() を呼び出してください。
#include "WSDappDev.h"
void event_procedure(WSCbase* object){
obj1->getProperty(WSNlabelString,"テキスト");
obj1->update(); //直ちにオブジェクトを更新。
WSGIappDev()->update(); //ウィンドウシステムへの描画要求を反映させます。
obj2->getProperty(WSNlabelString,"テキスト");
obj2->update(); //直ちに描画される
WSGIappDev()->update(); //ウィンドウシステムへの描画要求を反映させます。
Document Release 2.0 For Use with Wide Studio Release 2.0, Spring 2002
|