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

9.8. アプリケーションクラス(応用編)

ここでは、SophiaFramework UNIVERSE のアプリケーションウィザードが自動生成する、 サスペンド や レジュームなどの処理を含む HelloWorld アプリのコードについて解説します。

9.8.1. アプリケーションウィザードが自動生成するアプリケーションクラスの最大コード

図 9.27. 動作例

動作例

SophiaFramework UNIVERSE のアプリケーションウィザードが自動生成する、 HelloWorld アプリのアプリケーションクラスの最大コードです。

例 9.42. 宣言

//
//      USRApplication.hpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.3.
//

#ifndef __USRAPPLICATION_HPP
#define __USRAPPLICATION_HPP

#define TARGET_BUILD_DEBUG
#include <SophiaFramework.hpp>
#include "USRApplication.bid"

SFMTYPEDEFCLASS(USRApplication)
class USRApplication: public SFYApplication {
    SFMSEALCOPY(USRApplication)
public:
    static SFCInvokerPtr Factory(Void);
private:
    explicit USRApplication(Void) static_throws;
    virtual ~USRApplication(Void);
    XANDLER_DECLARE_VOIDRENDER(OnRenderRequest)
    XANDLER_DECLARE_VOIDSTART(OnAppStart)
    XANDLER_DECLARE_VOIDSTOP(OnAppStop)
    XANDLER_DECLARE_VOIDRESUME(OnAppResume)
    XANDLER_DECLARE_VOIDSUSPEND(OnAppSuspend)
    XANDLER_DECLARE_BOOLVOID(OnAppNoClose)
    XANDLER_DECLARE_BOOLVOID(OnAppNoSleep)
    XANDLER_DECLARE_BOOLEVENT(OnKey)
    XANDLER_DECLARE_BOOLEVENT(OnKeyPress)
    XANDLER_DECLARE_BOOLEVENT(OnKeyRelease)
};

#endif // __USRAPPLICATION_HPP //

例 9.43. 実装

//
//      USRApplication.cpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.3.
//

#include "USRApplication.hpp"


// ブートローダ
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
    // ここにライセンスコードを記述する

    *license = "heap://";

    return (id == AEECLSID_USRAPPLICATION) ? (&USRApplication::Factory): (null);
}


// ファクトリ関数: ユーザー定義アプリケーションクラスのインスタンスを生成する関数
SFCInvokerPtr USRApplication::Factory(Void)
{
    return ::new USRApplication;
}


// コンストラクタ
USRApplication::USRApplication(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_APP_START, SFEVT_APP_START, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnAppStart)
        ));
    }
    if (static_try()) {

        // アプリ終了ハンドラの登録
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_APP_STOP, SFEVT_APP_STOP, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnAppStop)
        ));
    }
    if (static_try()) {

        // アプリ再開ハンドラの登録
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_APP_RESUME, SFEVT_APP_RESUME, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnAppResume)
        ));
    }
    if (static_try()) {

        // アプリ中断ハンドラの登録
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_APP_SUSPEND, SFEVT_APP_SUSPEND, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnAppSuspend)
        ));
    }
    if (static_try()) {

        // アプリ終了確認ハンドラの登録
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_APP_NO_CLOSE, SFEVT_APP_NO_CLOSE, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnAppNoClose)
        ));
    }
    if (static_try()) {

        // アプリスリープ確認ハンドラの登録
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_APP_NO_SLEEP, SFEVT_APP_NO_SLEEP, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnAppNoSleep)
        ));
    }
    if (static_try()) {

        // キーハンドラの登録
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_KEY, SFEVT_KEY, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnKey)
        ));
    }
    if (static_try()) {

        // キー押下ハンドラの登録
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_KEY_PRESS, SFEVT_KEY_PRESS, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnKeyPress)
        ));
    }
    if (static_try()) {

        // キー解放ハンドラの登録
        static_throw(RegisterHandler(
            SFXEventRange(SFEVT_KEY_RELEASE, SFEVT_KEY_RELEASE, SFP16_BEGIN, SFP16_END),
            XANDLER_INTERNAL(OnKeyRelease)
        ));
    }
}


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


// 描画ハンドラ
XANDLER_IMPLEMENT_VOIDRENDER(USRApplication, OnRenderRequest, invoker, reason, graphics)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);
    unused(reason);

    // ここに描画時の処理を記述する

    // 画面の中央に "Hello World" という文字列を黒色で描画する
    graphics->DrawSingleText("Hello World", GetLocalBound(), SFXRGBColor(0x00, 0x00, 0x00, 0x00));

    return;
}


// アプリ開始ハンドラ
XANDLER_IMPLEMENT_VOIDSTART(USRApplication, OnAppStart, invoker, environment)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);
    unused(environment);

    // ここにアプリ開始時の処理を記述する

    return;
}


// アプリ終了ハンドラ
XANDLER_IMPLEMENT_VOIDSTOP(USRApplication, OnAppStop, invoker, quitable)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);
    unused(quitable);

    // ここにアプリ終了時の処理を記述する

    return;
}


// アプリ再開ハンドラ
XANDLER_IMPLEMENT_VOIDRESUME(USRApplication, OnAppResume, invoker, environment)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);
    unused(environment);

    // ここにアプリ再開時の処理を記述する

    return;
}


// アプリ中断ハンドラ
XANDLER_IMPLEMENT_VOIDSUSPEND(USRApplication, OnAppSuspend, invoker, reason, info)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);
    unused(reason);
    unused(info);

    // ここにアプリ中断時の処理を記述する

    return;
}


// アプリ終了確認ハンドラ
XANDLER_IMPLEMENT_BOOLVOID(USRApplication, OnAppNoClose, invoker)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);

    // アプリの終了を拒否する場合は true を返す

    return false;
}


// アプリスリープ確認ハンドラ
XANDLER_IMPLEMENT_BOOLVOID(USRApplication, OnAppNoSleep, invoker)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);

    // アプリのスリープを拒否する場合は true を返す

    return false;
}


// キーハンドラ
XANDLER_IMPLEMENT_BOOLEVENT(USRApplication, OnKey, invoker, event)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);

    // ここにキーのキーイベントを受信したときの処理を記述する

    // セレクトキーが押されたらアプリを終了する

    switch (event.GetP16()) {

        case AVK_SELECT:

            Terminate();
            return true;
    }

    return false;
}


// キー押下ハンドラ
XANDLER_IMPLEMENT_BOOLEVENT(USRApplication, OnKeyPress, invoker, event)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);
    unused(event);

    // ここにキーが押下状態になったときの処理を記述する

    return false;
}


// キー解放ハンドラ
XANDLER_IMPLEMENT_BOOLEVENT(USRApplication, OnKeyRelease, invoker, event)
{
    // 未使用変数のワーニングを回避する

    unused(invoker);
    unused(event);

    // ここにキーが解放状態になったときの処理を記述する

    return false;
}

9.8.2. アプリケーションウィザードが自動生成するアプリケーションクラスの最小コード

図 9.28. 動作例

動作例

SophiaFramework UNIVERSE のアプリケーションウィザードが自動生成する、 HelloWorld アプリのアプリケーションクラスの最小コードです。

例 9.44. 宣言

//
//      USRApplication.hpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.3.
//

#ifndef __USRAPPLICATION_HPP
#define __USRAPPLICATION_HPP

#define TARGET_BUILD_DEBUG
#include <SophiaFramework.hpp>
#include "USRApplication.bid"

SFMTYPEDEFCLASS(USRApplication)
class USRApplication: public SFYApplication {
    SFMSEALCOPY(USRApplication)
public:
    static SFCInvokerPtr Factory(Void);
private:
    explicit USRApplication(Void) static_throws;
    virtual ~USRApplication(Void);
};

#endif // __USRAPPLICATION_HPP //

例 9.45. 実装

//
//      USRApplication.cpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.3.
//

#include "USRApplication.hpp"


// ブートローダ
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
    // ここにライセンスコードを記述する

    *license = "heap://";

    return (id == AEECLSID_USRAPPLICATION) ? (&USRApplication::Factory): (null);
}


// ファクトリ関数: ユーザー定義アプリケーションクラスのインスタンスを生成する関数
SFCInvokerPtr USRApplication::Factory(Void)
{
    return ::new USRApplication;
}


// コンストラクタ
USRApplication::USRApplication(Void) static_throws
{
    // ここに各種ハンドラの登録を記述する

}


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

9.8.3. テキスト入力コントロールエディタを変更する方法

以下の方法により、 アプリケーションクラスが内部で保持するテキスト入力コントロールエディタ (デフォルト: SFXEditor)を変更できます。

[Tip] Tip

テキスト入力に関して機種依存の問題が発生した場合は、 ユーザー定義テキスト入力コントロールエディタを定義・実装し、 デフォルトのテキスト入力コントロールエディタ(SFXEditor)を置き換えます。

以下の SFXEditor クラスの実装にある、 Open 関数や OnBypass 関数の内容を変更することで、 テキスト入力に関する機種依存の問題を解決できます。

例 9.46. テキスト入力コントロールエディタを変更する方法

// 1. SFXBaseEditor の派生クラスとしてユーザー定義テキスト入力コントロールエディタ SFXUserEditor クラスを作成する
class SFXUserEditor : public SFXBaseEditor {

    // ...(省略)...

};

// 2. SFXUserEditor インスタンスを作成しコンストラクタの引数として渡す
// ファクトリ関数
SFCInvokerPtr USRApplication::Factory(Void)
{

    return ::new USRApplication(::new SFXUserEditor);

}

// 3. SFYApplication クラスの引数ありコンストラクタで SFXUserEditor インスタンスをセットする
// コンストラクタ
USRApplication::USRApplication(SFXBaseEditorPtr editor) : SFYApplication(editor) static_throws
{

    if (static_try()) {

        // ...(省略)...

    }
}

デフォルトのテキスト入力コントロールエディタである、 SFXEditor クラスの実装は以下の通りです。

例 9.47. SFXEditor クラスの実装

------------------------------------------------------------------------------------------------------------
/**
***     File            : SFXEditor.f.hpp
**/

#ifndef __SOPHIAFRAMEWORK_SFXEDITOR_FHPP
#define __SOPHIAFRAMEWORK_SFXEDITOR_FHPP

#include <SFXGeneral/SFXEnvironment.h.hpp>

SFMTYPEDEFCLASS(SFXEditor)

#endif // __SOPHIAFRAMEWORK_SFXEDITOR_FHPP //
------------------------------------------------------------------------------------------------------------
/**
***     File            : SFXEditor.h.hpp
**/

#ifndef __SOPHIAFRAMEWORK_SFXEDITOR_HHPP
#define __SOPHIAFRAMEWORK_SFXEDITOR_HHPP

#include <SFXGeneral/SFXEnvironment.h.hpp>
#include <SFXGeneral/SFXBaseEditor.h.hpp>
#include <SFXGeneral/SFXEditor.f.hpp>
#include <SFXGeneral/SFXEditProperty.f.hpp>
#include <SFCCore/SFCApplication.h.hpp>
#include <SFBWrapper/SFBTextCtl.h.hpp>

class SFXEditor : public SFXBaseEditor {
    SFMSEALCOPY(SFXEditor)
    private:
                SFBTextCtlSmp                   _textctl;
                SFBMenuCtlSmp                   _menuctl;
                SFXEditPropertyPtr              _property;
                CallbackSPP                     _spp;
                VoidPtr                         _reference;

    public:
        explicit                                SFXEditor                       (Void);
        virtual                                 ~SFXEditor                      (Void);
        virtual SFCError                        Open                            (SFXEditPropertyPtr property, CallbackSPP spp, VoidPtr reference);
                Void                            Close                           (Void);
    private:
                XALLBACK_DECLARE_SFCAPPLICATION(OnBypass)
};

#include <SFXGeneral/SFXEditor.i.hpp>

#endif // __SOPHIAFRAMEWORK_SFXEDITOR_HHPP //
------------------------------------------------------------------------------------------------------------
/**
***     File            : SFXEditor.i.hpp
**/

#ifndef __SOPHIAFRAMEWORK_SFXEDITOR_IHPP
#define __SOPHIAFRAMEWORK_SFXEDITOR_IHPP

#endif // __SOPHIAFRAMEWORK_SFXEDITOR_IHPP //
------------------------------------------------------------------------------------------------------------
/**
***     File            : SFXEditor.i.cpp
**/

#include <SFXGeneral/SFXEditor.h.hpp>
#include <SFXGeneral/SFXDevice.h.hpp>
#include <SFXGeneral/SFXEditProperty.h.hpp>

#define     ITEM_NAME                 ("Done")
#define     LABEL_OK                  0

/*public */SFXEditor::SFXEditor(Void) : _property(null)
{
}// SFXEditor::SFXEditor //

/*public */SFXEditor::~SFXEditor(Void)
{
    Close();
}// SFXEditor::~SFXEditor //

/*public virtual*/SFCError SFXEditor::Open(SFXEditPropertyPtr property, CallbackSPP spp, VoidPtr reference)
{
    #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH
    static SFXRGBColor::AtomRecConst            color[] = {
        {{{0x00, 0xFF, 0xFF, 0xFF}}},
        {{{0x00, 0x00, 0x00, 0x00}}}
    };
    #endif
    SFBDisplaySmp                               display;
    SFXWideString                               string;
    SFXRectangle                                remember;
    SFXRectangle                                rectangle;
    UInt32                                      flag;
    SFCError                                    error(SFERR_NO_ERROR);

    if (property != null) {
        _property = property;
        if ((display = SFBDisplay::GetInstance()) != null) {
            display->GetClipRect(&remember);
            display->SetClipRect(SFXRectangle::EmptyInstance());
            if ((_textctl = SFBTextCtl::NewInstance(GetSFBTextCtlClassID(), &error)) != null) {
                if ((_menuctl = SFBMenuCtl::NewInstance(GetSFBMenuCtlClassID(), &error)) != null) {
                    if ((error = string.Set(ITEM_NAME)) == SFERR_NO_ERROR) {
                        if (_menuctl->AddItem(LABEL_OK, &string, reinterpret_cast<UInt32>(_menuctl.Get()))) {
                            _textctl->SetSoftKeyMenu(_menuctl);
                            #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH
                            flag = TP_FRAME | TP_MULTILINE | TP_FIXSETRECT;
                            #else
                            flag = TP_NODRAW | TP_FRAME | TP_NOUPDATE | TP_FIXSETRECT;
                            #endif
                            if (_property->GetPasswordMode()) {
                                flag |= TP_PASSWORD;
                            }
                            _textctl->SetProperties(flag);
                            rectangle.Set(SFXGrid::ZeroInstance(), SFXDevice().GetScreenSize());
                            rectangle.SubBottom(_menuctl->GetRect().GetHeight());
                            _textctl->SetRect(rectangle);
                            _textctl->SetMaxSize(_property->GetMaximumLength());
                            _textctl->SetInputMode(_property->GetInputMode());
                            if (_textctl->SetText(_property->GetText())) {
                                if ((error = RegisterBypass(XALLBACK_INTERNAL(OnBypass))) == SFERR_NO_ERROR) {
                                    _spp = spp;
                                    _reference = reference;
                                }
                            }
                            else {
                                error = SFERR_FAILED;
                            }
                        }
                        else {
                            error = SFERR_FAILED;
                        }
                    }
                }
            }
            if (error != SFERR_NO_ERROR) {
                Close();
            }
            display->SetClipRect(remember);
            if (error == SFERR_NO_ERROR) {
                #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH
                display->SetColor(CLR_USER_TEXT, color[1]);
                display->SetColor(CLR_USER_BACKGROUND, color[0]);
                display->SetColor(CLR_USER_LINE, color[1]);
                #endif
                _textctl->SetActive(true);
                _textctl->SetCursorPos(TC_CURSORSTART);
            }
        }
        else {
            error = SFERR_FAILED;
        }
    }
    else {
        error = SFERR_INVALID_PARAM;
    }
    return error;
}// SFXEditor::Open //

/*public */Void SFXEditor::Close(Void)
{
    if (_textctl != null) {
        _textctl->SetSoftKeyMenu(SFBMenuCtlSmp::EmptyInstance());
        _textctl->SetActive(false);
    }
    UnregisterBypass(XALLBACK_INTERNAL(OnBypass));
    _textctl.Release();
    _menuctl.Release();
    _property = null;
    return;
}// SFXEditor::Close //

/*private */XALLBACK_IMPLEMENT_SFCAPPLICATION(SFXEditor, OnBypass, event)
{
    SFXWideString  string;
    SFCError       error;
    Bool           result(false);

    result = _textctl->HandleEvent(event);
    if (!result) {
        #if defined TARGET_ENVIRONMENT_SIMULATOR
        result = _menuctl->HandleEvent(event);
        #endif
    }
    switch (event.GetType()) {
        case SFEVT_APP_RESUME:
            result = true;
            break;
        case SFEVT_APP_SUSPEND:
            result = true;
            break;
        case SFEVT_KEY:
        case SFEVT_KEY_PRESS:
        case SFEVT_KEY_RELEASE:
        #if TARGET_VERSION_LT(3, 0, 0)
        case SFEVT_KEY_HELD:
        #endif
            result = true;
            break;
        case SFEVT_COMMAND:
            if (!result) {
                switch (event.GetP16()) {
                    case LABEL_OK:
                        if ((error = string.Set(_textctl->GetTextPtr())) == SFERR_NO_ERROR) {
                            if ((error = _property->SetText(string.Substring(0, _property->GetMaximumLength()))) == SFERR_NO_ERROR) {
                                _property->SetInputMode(_textctl->GetInputMode());
                            }
                        }
                        Close();
                        if (_spp != null) {
                            (*_spp)(error, _reference);
                        }
                        if ((application = SFCApplication::GetInstance()) != null) {
                            application->RenderDeviceScreen();
                        }
                        break;
                    default:
                        break;
                }
                result = true;
            }
            break;
        default:
            break;
    }
    return result;
}// XALLBACK_IMPLEMENT_SFCAPPLICATION(SFXEditor, OnBypass) //