前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0

3.1. SFY アプレット

SFY アプレットとは、SFYApplication クラスを継承して SFY GUI フレームワークを使うアプレットのことです。

以下では、SophiaFramework AppWizard が自動生成した HelloWorld アプレットのコードを使って、 SFY アプレットの起動から終了までの処理の流れを解説します。

[Note] SFC アプレットの場合

GUI フレームワークを使わない SFC アプレットは直接 SFCApplication クラスを継承します。

3.1.1. SFY アプレットの起動

SFY アプレットは、ブートローダと呼ぶ SFCApplet::Boot 関数と Factory 関数を実装する必要があります。

SFCApplet::Boot 関数は、アプレットで最初に実行される関数です。 SFCApplet::Boot 関数ではライセンスコードを設定し、 ClassID が AEECLSID_HELLOWORLD の Factory 関数を返します。

SFCApplet::Boot 関数の次に実行されるのが Factory 関数です。 Factory 関数は、HelloWorld のインスタンスを生成するコンストラクタを呼び出します。

[Note] ClassID とライセンスコード

実機の場合、ClassID に対応した正規のライセンスコードを設定しなければ SFY アプレットは起動しません。

開発用実機に製品パッケージの Example ディレクトリ内のサンプル アプレットの ClassID とライセンスコードが利用可能です。

シミュレーターでは、ライセンスコードを設定しなくても SFY アプレットは起動します。

例 3.1. ブートローダとファクトリ関数

//
//  HelloWorld.cpp
//

#include "HelloWorld.hpp"

// ブートローダ
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
    *license = "heap://"
               "TIXDRQXNU5WHU8Y3Z9WOHWQR6Z3VPSDHDV5CR1S4XASPWLUHWAS7Z5Z2TGS3XMSAT3UPUQTLTARCYPSF"
               "UEJZ6ROSJWGUQSEYKR6V2U4VESMTQLHKZ6X7Y2VKXHWIX3XBU0Z7VHWHXIZBSGT5SPU3XLX0Z1Y4R3TC"
               "U6WGT9WHWIVNYHYCUCR9T3SMTEWPRNVAX1Y4VPW2YCY9YQV5R7Z9UIVHT6SDUPU2SIW6VCRCWBR2S4WQ"
               "UPYFWCYGT4VIT1WHXGYPTQSFYPWNV3ULRNWFW7RBRFVKUKS2YQSQYHW1TPUPXBZ6UEY2WOYKR7S3TAU4"
               "TQS6UHVFVEVLU3R5SDSKW7RPTNTPVQU2T4R8Z4VLUGEW3U98TLDR8/";

    return (id == AEECLSID_HELLOWORLD) ? (&HelloWorld::Factory) : (null);
}

// ファクトリ関数
SFCInvokerPtr HelloWorld::Factory(Void)
{
    return ::new HelloWorld;
}

3.1.2. アプリケーションクラスの定義

SFY GUI フレームワークを使うので、 SFY アプレットの HelloWorld クラスは SFYApplication クラスを継承します。

XANDLER_DECLARE_VOIDRENDER(OnRenderRequest) は描画ハンドラ、XANDLER_DECLARE_BOOLEVENT(OnKey) はキーハンドラを宣言しています。

[Note] ハンドラとは...

ハンドラとはイベントが発生したときに呼び出されて実行される関数です。

描画イベント [SFEVT_RESPONDER_RENDER]を処理する描画ハンドラ、キーイベントを処理するキーハンドラなどがあります。

関連情報 : ハンドラ | ハンドラ一覧 | イベント一覧

例 3.2. HelloWorld の定義

////  HelloWorld.hpp//

#define __HELLOWORLD_HPP

#include <SophiaFramework.hpp>
#include "HelloWorld.bid"

//
//  HelloWorld アプリケーションクラス
//
//  便利な型を生成するマクロ
SFMTYPEDEFCLASS(HelloWorld) 
class HelloWorld : public SFYApplication //  HelloWorld は SFYApplication を継承する
{
    //  インスタンスのコピーを禁止するマクロ
    SFMSEALCOPY(HelloWorld) 
public:
    static SFCInvokerPtr Factory(Void);
private:
    explicit HelloWorld(Void) static_throws;
    virtual ~HelloWorld(Void);
    XANDLER_DECLARE_VOIDRENDER(OnRenderRequest)  // 描画ハンドラの宣言
    XANDLER_DECLARE_BOOLEVENT(OnKey)             // キーハンドラの宣言
};

#endif // __HELLOWORLD_HPP //
[Caution] 大文字アルファベットを含むアプリケーション名(BREW 4.0のみ)

通常、HelloWorld などのアプリケーションクラスの名前はアプレット本体と同じ名前にします。

ただし、BREW 4.0 からアプレットの名前に大文字アルファベットが使えなくなりましたので、 HelloWorld や USRApplication などアプリケーションクラスの名前に大文字アルファベットを使う場合、 大文字アルファベットを小文字アルファベットに変換するなどして、 ビルド後のファイル名に大文字アルファベットが含まれないようにする必要があります。

[Note] アプリケーションクラス内でのハンドラ

アプリケーションクラス内で利用するハンドラは、 アプリケーションクラスがデフォルトで保持するルート(SFZRoot)のハンドラとみなされます。

HelloWorld アプレットの例では、簡略化のため直接アプリケーションクラス内でハンドラを定義して使っていますが、 一般にハンドラはルート以外のレスポンダ内で利用することが推奨されます。

[Tip] SFMTYPEDEFCLASS マクロ

SFMTYPEDEFCLASS は引数に指定したクラス関する便利なユーザー定義型を自動生成するマクロです。

関連情報 : SFMTYPEDEFCLASS マクロ

[Tip] SFMSEALCOPY マクロ

SFMSEALCOPY はインスタンスのコピーを禁止するマクロです。 SFYApplication を継承するクラスのインスタンスはコピーしてはいけません。

関連情報 : SFMSEALCOPY マクロ

[Tip] XANDLER_DECLARE_VOIDRENDER マクロ

XANDLER_DECLARE_VOIDRENDER は描画ハンドラを宣言するためのマクロです。 描画イベント [SFEVT_RESPONDER_RENDER] が発生すると、 ここで宣言したハンドラが呼び出されて実行されます。

関連情報 : 描画イベント専用ハンドラ [XANDLER_DECLARE_VOIDRENDER] | 描画イベント [SFEVT_RESPONDER_RENDER]

[Tip] XANDLER_DECLARE_BOOLEVENT マクロ

XANDLER_DECLARE_BOOLEVENT は Bool 型を返すハンドラを宣言するための汎用マクロです。 ここでは、BREW 環境から送信されるキーイベントのハンドラを宣言しています。 キーイベントが発生すると、ここで宣言したハンドラが呼び出されて実行されます。

関連情報 : 引数のある汎用ハンドラ [XANDLER_DECLARE_VOIDEVENT または XANDLER_DECLARE_BOOLEVENT] | キーイベント | Bool 型

3.1.3. コンストラクタの実装

HelloWorld のコンストラクタでは、SFYApplication::RegisterHandler 関数を使って 描画ハンドラとキーハンドラを登録します。

ハンドラの登録では、SFXEventRange 関数を使ってハンドラが処理すべきイベントの範囲、 XANDLER_INTERNAL マクロを使ってハンドラ関数へのポインタをそれぞれ指定します。

下記の例では、描画イベント [SFEVT_RESPONDER_RENDER]のハンドラとして OnRenderRequest 関数を登録し、キーイベントのハンドラとして OnKey 関数を登録しています。

ここで、キーイベントは (SFEVT_KEY, SFP16_BEGIN) から (SFEVT_KEY, SFP16_END) までの範囲にあるイベント、 つまりすべてのキーイベントを指定しています。

描画イベント [SFEVT_RESPONDER_RENDER]は (SFEVT_RESPONDER_RENDER, SFP16_RENDER_REQUEST) というイベントを指定しています。

例 3.3. コンストラクタの実装(ハンドラの登録)

// コンストラクタ
HelloWorld::HelloWorld(Void) static_throws
{
    if (static_try()) {
        // 描画ハンドラを登録する
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_RESPONDER_RENDER, SFEVT_RESPONDER_RENDER,
            SFP16_RENDER_REQUEST, SFP16_RENDER_REQUEST),
            XANDLER_INTERNAL(OnRenderRequest)
        ));
    }
    if (static_try()) {
        // キーハンドラを登録する
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_KEY, SFEVT_KEY, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnKey)
        ));
    }
}
[Note] イベント

イベント(SFXEvent)は、 イベント タイプと 2 つのパラメータ( P16 パラメータと P32 パラメータ)から構成されます。

イベントを処理するハンドラは、 SFYApplication::RegisterHandler または SFYResponder::RegisterHandler 関数を使ってレスポンダに登録します。

イベントには BREW SDK で定義される BREW 定義イベントと、 SophiaFramework 独自のレスポンダ定義イベントの 2 種類があります。

BREW 定義イベントのイベント タイプ名は、BREW SDK で定義されるイベント タイプ名の先頭に SF 接頭語が付加された名前になります。

BREW 定義イベントトレーサに登録された配信規則によりレスポンダに配信され、 レスポンダに登録されたハンドラが呼び出されて実行される配信型イベントです。

たとえば、SFEVT_KEY イベント(キーイベント)は BREW 定義イベントです。

一方、レスポンダ定義イベントのイベント タイプ名は、SFEVT_RESPONDER_ 接頭語が付加された名前になります。

レスポンダ定義イベントSFYResponder::InvokeForward または SFYResponder::InvokeBackward 関数を使って送信され、 レスポンダに登録されたハンドラが呼び出されて実行されるコールバック型イベントです。

たとえば、SFEVT_RESPONDER_RENDER イベント(描画イベント [SFEVT_RESPONDER_RENDER])はレスポンダ定義イベントです。

関連情報 : イベント一覧 | BREW 定義イベント | レスポンダ定義イベント | レスポンダシステムのイベント処理 | SFXEvent | SFXEventRange | SFCEventEnum

[Note] イベントの表現

このリファレンスマニュアルでは状況に応じてイベントを @イベントタイプ名、A(イベントタイプ名, P16 パラメータ)、B(イベントタイプ名, P16 パラメータ, P32 パラメータ)の3つの方法で表現しています。

[Tip] SFXEventRange クラス

ハンドラは、 SFYApplication::RegisterHandler または SFYResponder::RegisterHandler 関数の引数で SFXEventRange クラスを使ってイベントの範囲を指定してレスポンダに登録します。

SFXEventRange(sEventType, eEventType, sP16, eP16) は (sEventType, sP16, *) から (eEventType, eP16, *) までの範囲のイベントを表します。

たとえば、上の例にある SFXEventRange(SFEVT_KEY, SFEVT_KEY, SFP16_BEGIN, SFP16_END) は (SFEVT_KEY, SFP16_BEGIN) から(SFEVT_KEY, SFP16_END)までのイベント、つまりすべてのキーイベントを表します。

ハンドラが処理するイベントがひとつだけで (EventType, P16) であるときは、 SFXEventRange(sEventType, eEventType, sP16, eP16) で sEventType と eEventType は EventType、 sP16 と eP16 は P16 という風にそれぞれ同じ値を設定します。

上の例にある SFXEventRange(SFEVT_RESPONDER_RENDER, SFEVT_RESPONDER_RENDER, SFP16_RENDER_REQUEST, SFP16_RENDER_REQUEST) は (SFEVT_RESPONDER_RENDER, SFP16_RENDER_REQUEST, *) という描画イベントだけを表します。

関連情報 : SFXEventRange | SFXEvent | SFCEventEnum | SFCEventEnum SFYApplication::RegisterHandler | SFYApplication::UnregisterHandler | SFYApplication::ClearHandler | SFYResponder::RegisterHandler | SFYResponder::UnregisterHandler | SFYResponder::ClearHandler

[Tip] XANDLER_INTERNAL マクロ

内部のインスタンスを参照するハンドラを取得するマクロです。

ハンドラ登録時、ハンドラ関数名の指定では XANDLER_INTERNAL マクロを使います。

3.1.4. デストラクタの実装

アプレット終了時にはデストラクタが呼び出され、デストラクタではアプレットの終了処理を記述します。

スマートポインタで管理されるウィンドウやコントロールなどの全てのレスポンダ( UI コンポーネント)は、 参照カウントがゼロとなり使用されなくなったタイミングで自動的に終了処理が実行されます。

そしてヒープメモリからも解放され破棄されます。

スマートポインタで管理されるためレスポンダは使い終われば自動的に終了処理されるので、 明示的に終了処理するコードを記述する必要はありません。

勿論、「ウィンドウの終了処理」で詳細を説明しますが、 明示的に SFYResponder::Terminate 関数を呼び出すことで直ちにレスポンダの終了処理を行うことも可能です。

[Tip] レスポンダ

SophiaFramework では、UI コンポーネントのことを「レスポンダ」と呼びます。

関連情報 : SFYResponder

例 3.4. デストラクタの実装

// デストラクタ
HelloWorld::~HelloWorld(Void)
{
}

3.1.5. ハンドラの実装

HelloWorld クラス定義で宣言した描画ハンドラとキーハンドラを実装します。

3.1.5.1. 描画ハンドラの実装

SFXGraphics::DrawSingleText 関数を呼び出して文字列 "Hello World" を画面に表示する描画ハンドラを実装します。

[Caution] 描画処理の記述

GUI フレームワークを使う SFY アプレットでは、すべての描画処理は描画ハンドラに記述しなければいけません。

描画ハンドラの外に記述された描画処理については、開発者が煩雑な状態をすべて管理する必要があります。

例 3.5. 描画ハンドラの実装

// 描画ハンドラの実装
XANDLER_IMPLEMENT_VOIDRENDER(HelloWorld, OnRenderRequest, invoker, reason, graphics)
{
    unused(invoker);
    unused(reason);

    // レスポンダの描画処理は左上端を原点(0,0)とするローカル領域内で行う
    // アプリケーションの場合、ルートのローカル領域に対する描画となる

    // デフォルト設定ではルートのローカル領域は携帯電話画面と同じになる
    // つまり、アプリケーションのローカル領域は携帯電話画面の領域に等しい

    // このとき、仮想領域が設定されていないので、実際に描画される実領域も
    // ルートのローカル領域(携帯電話画面)と同じである

    // "Hello World" を中央に黒色で表示する
    graphics->DrawSingleText("Hello World", 
                              GetLocalBound(), 
                              SFXRGBColor(0x00, 0x00, 0x00, 0x00));

    // "Right Bottom" を右下に青色で表示する
    graphics->DrawSingleText("RightBottom", 
                              GetLocalBound(), 
                              SFXRGBColor(0x00, 0x00, 0xAA, 0x00), 
                              IDF_ALIGN_BOTTOM | IDF_ALIGN_RIGHT);

    // "Left Top+(10,30)" を携帯電話の画面領域を (10, 30) だけ移動した領域内に
    // 緑色で左上に下線付で表示する
    graphics->DrawSingleText("LeftTop+(10,30)", 
                              SFXGrid(10, 30), GetLocalBound(), 
                              SFXRGBColor(0x00, 0xAA, 0x00, 0x00), 
                              IDF_ALIGN_TOP | IDF_ALIGN_LEFT | IDF_TEXT_UNDERLINE);

    return;
}
[Tip] XANDLER_IMPLEMENT_VOIDRENDER マクロ

XANDLER_IMPLEMENT_VOIDRENDER は描画ハンドラを実装するためのマクロです。 描画イベント [SFEVT_RESPONDER_RENDER] が発生すると、 ここで実装したハンドラが呼び出されて実行されます。

invoker はハンドラの呼び出し元のレスポンダ、reason は P16 イベント パラメータ、graphics はグラフィックス オブジェクトを表しています。

上記の例では ハンドラの呼び出し元 invoker は SFYResponderPtr型の HelloWorldアプリケーションクラスがデフォルトで持つルートのポインタ、 P16 イベント パラメータ reason は SFP16_RENDER_REQUEST です。

関連情報 : 描画イベント専用ハンドラ [XANDLER_DECLARE_VOIDRENDER] | 描画イベント [SFEVT_RESPONDER_RENDER]

[Tip] unused マクロ

未使用変数の警告を防ぐために unused マクロを利用しています。

[Note] 描画イベントの処理

描画イベント [SFEVT_RESPONDER_RENDER]描画ハンドラを起動するイベントです。

この描画イベント [SFEVT_RESPONDER_RENDER]イベントループの最後のタイミング、 または SFYApplication::Render / SFYResponder::Render 関数の呼び出し時に発生します。

HelloWorld アプレットの場合、 SFYApplication::Render / SFYResponder::Render 関数を呼び出していません。

そのためキーイベント(SFEVT_KEY)などのイベントループの最後のタイミングで SFYResponder::Render 関数が自動的に起動され描画イベント [SFEVT_RESPONDER_RENDER]が発生し、 描画ハンドラが呼び出され携帯電話画面上に描画が行われます。

なお、描画処理はグラフィックス オブジェクト graphics を使ってレスポンダのローカル領域に対して行います。

[Note] アプリケーションクラスの描画ハンドラの座標系

アプリケーションクラスの場合、描画ハンドラルートレスポンダローカル領域に対して描画を行います。

アプリケーションクラスがデフォルトで保持するルートレスポンダ(ルート)のローカル領域は携帯電話の画面全体となります。

[Note] SFXGraphics::DrawSingleText()

SFXGraphics::DrawSingleText 関数は、指定した場所に指定した 1 行の文字列を表示します。

複数行の文字列を表示する場合は、SFXGraphics::DrawMultipleTextCenterSFXGraphics::DrawMultipleTextLeft、 または SFXGraphics::DrawMultipleTextRight 関数を使います。

[Note] 背景の描画について

SFYWidget クラスを継承するクラスでは背景色を SFYWidget::SetBackgroundColor 関数で設定することができます。

SFYResponder::SetPropertyTransparent 関数を使ってレスポンダの透過属性が設定されていない限り、 そのレスポンダの描画ハンドラの実行に先立ち SFYWidget クラスの内部的処理により SFYWidget::SetBackgroundColor 関数で設定した背景色でレスポンダのローカル領域が塗り潰されます。

上の例では、SFYWidget::SetBackgroundColor 関数を使って背景色を設定していませんが、 何も設定しない場合は背景色として白色[SFXRGBColor(0xFF, 0xFF, 0xFF, 0x00)]が指定されたことになります。 また、SFYResponder::SetPropertyTransparent 関数を使って透過属性も設定されていません。

その結果、白色の背景領域に "Hello World " という文字列が描画されることになります。

※ 描画ハンドラで背景色で領域を塗り潰す処理は不要です。 レスポンダ領域の背景色を変更したい場合は、SFYWidget::SetBackgroundColor 関数で希望の色を指定するだけで済みます。

[Note] 4 種類のレスポンダ領域について

SophiaFramework には UI コンポーネントを効率良く処理するために以下の 4 種類のレスポンダ領域が存在します。

1.実領域

レスポンダの可視領域を親レスポンダのローカル領域内に配置した矩形領域です。この矩形がレスポンダの可視領域となります。実領域は親レスポンダの左上端を原点(0, 0)とする親レスポンダのローカル領域の相対座標系で表します。

実領域は SFYResponder::SetRealBound 関数で設定し、SFYResponder::GetRealBound 関数で取得します。

詳細情報 : 実領域

2.仮想領域

レスポンダ領域全体を自レスポンダの実領域の左上端を原点(0, 0)とする相対座標系で表現した矩形領域です。大きさはローカル領域と同じです。

仮想領域は実領域と同じか、実領域を含む領域となります。後者の場合、仮想領域は不可視領域も含むことになります。

一般に、仮想領域は不可視領域も含む場合にスクロールして不可視領域を表示する処理に利用されます。なお、仮想領域を設定しない場合、仮想領域は実領域に等しく、レスポンダの全領域が可視領域となります。

仮想領域は SFYResponder::SetVirtualBound 関数で設定し、SFYResponder::GetVirtualBound 関数で取得します。

詳細情報 : 仮想領域

3.ローカル領域

ローカル領域は、レスポンダの左上端を原点(0,0) とする相対座標系で表したレスポンダ全体の矩形領域です。大きさは仮想領域と同じです。

一般に、レスポンダ内での描画処理は SFYResponder::GetLocalBound でローカル領域を取得し、その領域に対して行います。

詳細情報 : ローカル領域

4.グローバル領域

実領域を携帯電話画面の左上端を原点(0, 0)とする絶対座標系で表した矩形領域です。

BREW 標準コントロールを配置する際に必要となる絶対座標系で表したレスポンダ領域として利用します。

グローバル領域は SFYResponder::GetGlobalBound 関数で取得できます。

詳細情報 : グローバル領域

[Note] アプリケーションのローカル領域

SFY アプレットのアプリケーションクラスは、デフォルトでルートをひとつ所有します。

SFYApplication::GetLocalBound 関数を呼び出して取得される領域は、 このルートローカル領域です。

アプリケーションにデフォルトで設定された、 このルートローカル領域は携帯電話画面の領域と同じです。

上の例では簡略化のため、アプリケーションにデフォルト設定されたルートの領域内に描画をしていますが、 通常はウィンドウを定義してその領域内に描画することが推奨されます。

3.1.5.2. キーハンドラの実装

セレクトキーが押されたとき、アプリケーションを終了させるキーハンドラを実装します。

例 3.6. キーハンドラの実装

// キーハンドラ
XANDLER_IMPLEMENT_BOOLEVENT(HelloWorld, OnKey, invoker, event)
{
    unused(invoker);

    switch (event.GetP16()) {
        case AVK_SELECT: // セレクトキーが押されたとき
            Terminate(); // アプリケーションを終了させる
            return true;
    }

    return false; // キーイベントを処理しないときは false を返す
}
[Tip] XANDLER_IMPLEMENT_BOOLEVENT マクロ

XANDLER_IMPLEMENT_BOOLEVENT は Bool 型を返すハンドラを実装するための汎用マクロです。 ここでは、BREW 環境から送信されるキーイベントのハンドラを実装しています。 キーイベントが発生すると、ここで実装したハンドラが呼び出されて実行されます。

関連情報 : 引数のある汎用ハンドラ [XANDLER_DECLARE_VOIDEVENT または XANDLER_DECLARE_BOOLEVENT] | キーイベント | Bool 型

[Tip] Terminate() 関数

SFCApplication::Terminate 関数を呼び出すと、 アプリケーションクラスのデストラクタが呼び出されてアプリケーションは終了します。

アプリケーションクラスのデストラクタでは、 レスポンダツリー描画エンジン配信エンジンの順に終了処理が行われ、 アプリケーションが使用していたリソースはすべて解放されます。

※レスポンダの終了処理を行う SFYResponder::Terminate 関数とは処理内容の範囲が異なります。

[Note] キーイベントの処理

キーイベント(SFEVT_KEY)は、利用者が携帯電話のキーを押したタイミングで発生します。

発生したキーイベントトレーサに従ってフォーカスを持つレスポンダに送信します。

トレーサのデフォルト設定では、 キーイベントは最背面のレスポンダ(ルートレスポンダ)から出発して再帰的にフォーカスを持つ子レスポンダへと配信されてゆきます。

キーイベントの処理は、キーイベントが最後に到着したレスポンダから到着の逆順で行われます。 また、あるレスポンダでキーイベントの処理がされた場合は、そこで処理を終えます。

具体的には以下のような流れの処理になります。

キーイベントを受け取ったレスポンダはフォーカスを持つ子レスポンダが存在する場合は、 キーイベントをフォーカスを持つ子レスポンダに送信します。

キーイベントはこれ以上送信すべきフォーカスを持つ子レスポンダが存在しないレスポンダに到達したときに初めて、 レスポンダに登録されたキーハンドラが呼び出されて処理されます。

そのときキーハンドラがキーイベントを処理したときは true を返しその時点でこの処理を終了します。

処理しなかったときは false を返し、親レスポンダでキーイベントの処理を継続します。

親レスポンダがキーイベントを処理したときは true を返しその時点で処理を終了します。

処理しなかったときは false を返しキーイベントをさらにその親のレスポンダで処理します。

このキーイベントの処理は、 ルートレスポンダまでの何れかの親レスポンダで処理されたときにそのレスポンダで終了します。 ルートレスポンダまで処理されない場合は、何も処理されないまま終了します。

上の例の場合、HelloWorld アプリケーションクラス(※)でも処理されなかったキーイベントは何も処理されなかったことになります。

※アプリケーションクラスはレスポンダではありませんが、通常アプリケーションクラスはルートレスポンダを保持しています。 アプリケーションをレスポンダとして扱う場合、レスポンダの処理はアプリケーションクラスに保持されているルートレスポンダに委譲されます。

3.1.6. グローバル変数の定義とアクセス

アプリケーションのインスタンスは、アプリケーション内のどこからでも SFYApplication::GetInstance 関数を使ってアクセスできます。 このためグローバルな変数は下記のようにアプリケーションクラスに定義します。

例 3.7. グローバルな変数の定義とアクセス

//
//  ExampleAppli アプリケーションクラス(AppWizard で自動生成)
//
SFMTYPEDEFCLASS(ExampleAppli)
class ExampleAppli : public SFYApplication
{
    SFMSEALCOPY(ExampleAppli)
public:
    static SFCInvokerPtr Factory(Void);
private:
    explicit ExampleAppli(Void) static_throws;
    virtual ~ExampleAppli(Void);

    // グローバル変数 global_something_val を定義する
    SInt32 global_something_val;
public:
    // グローバル変数 global_something_val にアクセスするための GetGlobalSomethingVal() 関数を宣言する
    SInt32 GetGlobalSomethingVal();
};

// グローバル変数 global_something_val にアクセスするための GetGlobalSomethingVal() 関数を定義する
ExampleAppli::GetGlobalSomethingVal(Void)
{
    return global_something_val;
}

// GetGlobalSomethingVal() 関数経由でグローバル変数 global_something_val の値を取得する
static_cast<ExampleAppli>(SFYApplication::GetInstance())->GetGlobalSomethingVal();

3.1.7. エラー処理の機構

コンストラクタで使用している static_exception::static_trystatic_exception::static_throw 関数は、 エラー値を検証するための関数とエラー値を設定するための関数です。

設定されたエラー値は static_exception::static_catch 関数で取得できます。 通常 static_exception::static_catch 関数はエラー値を throw するクラスを利用する側で使います。

例 3.8. エラー値をキャッチしエラー処理するコード

helloworld = ::new HelloWorld();
switch( helloworld->static_catch() ){

        // エラー値に応じてエラー処理をする

};

static_exception クラスはエラー値を管理する変数を持っています。 この変数はテンプレート型で通常 SFCError 型が利用されます。

static_exception クラスの存在意義は、 コンストラクタやオペレータでのエラー値を外部に搬出する、一般的な規約を制定する点にあります。

関連情報 : アプリケーションクラス(基礎編)