RiCGEN_BY_X() には、CGEN_BY_X() と同じ効果があります。いずれのステートメントも、グローバル関数内からイベントを送信する場合に役立ちます。
RiCGEN_BY_X() は、特定のオブジェクトをイベントの送信側を識別するので、RiCReactive_genBySender() フレームワーク・ルーチンを使用してイベントを送ります。
例えば、イベントの送信側を Room[2] として fault() イベントを Furnace[1] インスタンスに送るには、以下を使用します。
RiCGEN_BY_X(Furnace[1], fault(), Room[2], Room);
最後の引数 (この場合は Room) は、送信側のタイプを識別します。
GEN_BY_X は、メッセージを送信している AOMAnimationItem がわかっている特殊な場合にのみ使用します。IBM® Rational® Rhapsody® は支援なしで理由を判別できないからです。例えば、ある種の GUI クラス (GUI1 および GUI2) と物事を実行するある種のクラス (Huey および Louey) を持つアプリケーションを作成できます。 アニメーションで 4 つすべてのインスタンスが表示されるように、すべてのクラスを Rational Rhapsody で作成します。
一部の GUI をクラス GUI1 および GUI2 に関連付けます。 MFC ウィザードを使用するほうが Rational Rhapsody を使用するよりも GUI の作成が簡単であるので、このウィザードを使用します。GUI1 のコンストラクターは、いくつかのボタンがある形式無指定ダイアログを構成します。
それぞれのボタンを、イベントを生成するように構成します。 例:
void myDialog::OnButtonXPushed() {
myHuey->GEN(E);
}
この構成は機能しますが、アニメーションではイベントの送信側はわかりません。代わりに、GEN_BY_GUI を以下のように使用します。
void myDialog::OnButtonXPushed() {
myHuey->GEN_BY_GUI
アニメーション出力ウィンドウに以下のメッセージが表示されます。
event E generated by GUI
クラス myDialog に所属先の GUI1 のインスタンスを示すメソッド GUI1 *myOwner があった場合、以下のようにコーディングできます。
void myDialog::OnButtonXPushed() {
myHuey->GEN_BY_X(E,myOwner);
}
この場合、アニメーション (出力ウィンドウ、イベント・キュー、およびシーケンス図) には、正しい GUI1 オブジェクトからのものであるとして E が表示されます。この方法は、特に GUI およびそのダイアログが、まだ作成されていない一部の実際のクラスを作成するテスト・ハーネスである場合に役立ちます。
#define RiCGEN_BY_X(INSTANCE,EVENT,SENDER,theClass) ¥
{ \
if ((INSTANCE) != NULL) { ¥
RiCReactive * reactive = &((INSTANCE)->ric_reactive);¥
RiCEvent * event = &(RiC_Create_##EVENT->ric_event); ¥
RiCReactive_genBySender(reactive, event, ¥
aomX2Item(SENDER,aomc##theClass)); ¥
} \
}