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

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

SFYResponder はレスポンダシステムの核となるクラスであり、 すべてのレスポンダクラスは SFYResponder クラスを継承します。

独自にユーザー定義レスポンダクラスを作成する場合、 SFYResponder クラスを継承するクラスを起点にできれば、 実装はそれだけ容易になります。

たとえば、自分自身を描画する機能を持つ独自レスポンダクラスを実装する場合は、 SFYResponder クラスよりも SFYWidget クラスを起点にする方が簡単でしょう。

自分自身の描画以外にも他の機能を持つレスポンダの実装では、 SFYContainerSFZWindow、 や SFZDialog などのより具象化されたクラスを起点にすれば、 実装はそれだけ容易になるでしょう。

以下は、レスポンダシステムに標準で組み込まれている抽象レスポンダクラスの一覧です。 これらは、カスタマイズされたユーザー定義レスポンダクラスを実装するための起点として使用されます。

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

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

ユーザー定義レスポンダクラスは、 上記の抽象レスポンダクラスを含む SophiaFramework UNIVERSE 標準提供レスポンダクラスを起点にして実装します。

[Important] 重要

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

その他の関数の呼び出しは省略可能です。

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

SFYResponder は、 レスポンダクラスを実装するときの最初の起点(基底クラス)となります。 このクラスには、すべてのレスポンダに共通する要素や機能が実装されています。

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

例 9.36. 宣言

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.37. 実装

// コンストラクタ
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 文を記述すると、 特定の継承関係になっているときにコンパイラがフリーズするバグが確認されています。