前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.0

9.4. レスポンダ(基礎編)

すべてのレスポンダは SFYResponder クラスを継承し、 レスポンダシステムを構成するために必要な機能を提供します。

開発者が独自にユーザー定義レスポンダを作成する場合、 SFYResponder よりも具体的なクラスを起点できると実装がそれだけ簡単になります。

たとえばレスポンダが自身を描画する場合は SFYWidget クラスを起点にします。

より具体的な属性を特定できる場合は SFYContainer クラス、 SFZWindow クラス、SFZDialog クラスなどを起点にできます。

以下の抽象レスポンダはカスタマイズされたユーザー定義レスポンダを作成するための起点となります。

表 9.4. 抽象レスポンダの種類

クラス名 解説
SFYResponder レスポンダを表す抽象クラスです。
SFYWidget ウィジェットを表す抽象クラスです。
SFYContainer コンテナを表す抽象クラスです。
SFZWindow ウィンドウを表す抽象クラスです。
SFZDialog ダイアログを表す抽象クラスです。
SFYMenu メニューを表す抽象クラスです。
SFYControl コントロールを表す抽象クラスです。
SFYBandControl 帯コントロールを表す抽象クラスです。
SFYLabelControl ラベルコントロールを表す抽象クラスです。
SFYBoxControl ボックスコントロールを表す抽象クラスです。
SFYButtonControl ボタンコントロールを表す抽象クラスです。
SFYCheckboxControl チェックボックスコントロールを表す抽象クラスです。
SFYRadiobuttonControl ラジオボタンコントロールを表す抽象クラスです。
SFYScrollBarControl スクロールバーコントロールを表す抽象クラスです。
SFYTabControl タブコントロールを表す抽象クラスです。
[Note] SophiaFramework UNIVERSE 標準提供レスポンダ

通常、SophiaFramework UNIVERSE 標準提供レスポンダを起点に使える場合がほとんどです。 SFYResponder クラスを直接起点にしてユーザー定義レスポンダを作成することは滅多に発生しません。

[Important] 重要

すべてのレスポンダにおいて、SFYResponder::SetParent 関数、SFYResponder::SetState 関数、SFYResponder::SetRealBound 関数の呼び出しは必須です。

その他の関数は必要に応じて呼び出すことも省略することもできます。

9.4.1. レスポンダを表す抽象クラス[SFYResponder]

SFYResponder クラスには、各種レスポンダに共通する要素や機能が実装されています。

SFYResponder クラスはユーザー定義レスポンダを実装するときの最初の起点となります。

以下にユーザー定義レスポンダを作成するときに最低限必要なコードを示します。

例 9.29. 宣言

SFMTYPEDEFRESPONDER(USRResponder)
class USRResponder : public SFYResponder {
    SFMSEALRESPONDER(USRResponder)
    SFMRESPONDERINSTANTIATEONE(USRResponder, SFYResponder)
public:

    // レスポンダのタイプを定義する
    // 小文字と記号のみからなるタイプは予約されているので使えない
    enum CodeEnum {
        CODE_TYPE = four_char_code('U', 'R', 'S', 'P')
    };
    SFMTYPEDEFTYPE(CodeEnum)

public:
    static USRResponderSmp NewInstance(SFCErrorPtr exception = null);
protected:
    explicit USRResponder(Void) static_throws;
    virtual ~USRResponder(Void);
};

例 9.30. 実装

// コンストラクタ
USRResponder::USRResponder(Void) static_throws
{
    if (static_try()) {

        // レスポンダのタイプを設定する
        SetType(CODE_TYPE);

        // 初期化処理を記述する
    }
}

// デストラクタ
USRResponder::~USRResponder(Void)
{
    // 終了処理を記述する
}

// スマートポインタで管理されるインスタンスを生成する関数
USRResponderSmp USRResponder::NewInstance(SFCErrorPtr exception)
{
    return static_pointer_cast<USRResponder>(Factory(::new USRResponder, exception));
}
[Caution] コンストラクタやデストラクタ内の return 文

通常、C++ではコンストラクタやデストラクタでは return 文を記述しません。

GCC(将来的にサポート予定)を使う場合、コンストラクタやデストラクタ内で return 文を記述すると、 特定の継承関係になっているときにコンパイラがフリーズするバグが確認されています。