ホーム > デベロッパ > BREW FAQ

BREW FAQ : プログラミング

ISOUNDPLAYER_SetStream() の引数 (IAStream インターフェース) に独自に IFile インターフェースから派生したものを設定しようと思っていますが、IFile インターフェースからの派生の方法は?

ISOUNDPLAYER_SetStream() の第二引数には、IFile 派生インターフェイスを設定する必要はありません。IAStream 派生インターフェイスであれば十分です。

      

BREWでISHELL_BrowseURLで内部ブラウザを立ち上げたいが、その時に元のBREWアプリを終了させる方法は?

内部ブラウザの呼び出し時に、呼び出し元の BREW アプリのみの終了はできないようです。ISHELL_BrowseURL() の呼出し後に、ISHELL_CloseApplet() を呼び出す実験をしてみました。ISHELL_CloseApplet() を呼び出すと、内部ブラウザの起動前に、BREW アプリが終了してしまいますので、内部ブラウザの起動が出来ません。また、内部ブラウザを起動すると、呼び出しもとの BREW アプリは終了できませんでした。

上記の実験結果から、内部ブラウザの起動時は、BREW アプリを終了しないことが望ましいと思われます。

      

インタフェースオブジェクトへのポインタが有効かどうか調べるには

インターフェイスオブジェクトへのポインタが有効であるかどうかを判定する一般的な手段はありません。
インターフェイスを使用したい場合は、ポインタが無効にならないように参照カウントを自前で管理する必要があります。

      

タイマーとは ?

タイマーとは、一定時間の経過後に関数を呼び出してくれる仕組みのことです。 アニメーションの表示など、ある一定のタイミングで処理を行いたい場合に使用します。 タイマーを使用するには、ISHELL_SetTimer 関数や ISHELL_SetTimerEx 関数を使用します。

たとえば、ISHELL_SetTimer 関数は以下のように定義されています。

ISHELL_SetTimer(
 IShell*   shell ,      // IShell インターフェイス
 int32     millisecs ,  // タイマーが経過時間をミリ秒で指定します。
 PFNNOTIFY fn,          // コールバック関数を指定します。
 void*     data         // コールバック関数に渡されるデータを指定します。
);

タイマーにより呼び出されるコールバック関数は、以下のプロトタイプをもつ必要があります。

// コールバック関数のプロトタイプ宣言
void TimerCallBack(void* pData);

SophiaFramework では、 SFBShell::SetTimer 関数や SFBShell::SetTimerEx 関数を使用します。 タイマーに登録するコールバック関数は、 void* 型の引数を持つ戻り値なしの関数を使用します。

[ BREW API のみを使用したコード ]

//
// タイマーを使用して図形を移動します。
//
void OnTimer(void* data)
{
    ShapeApplet* app = (ShapeApplet*)data;
    IGraphics*   graphic;

    // 図形を移動します。
    app->x +=  RandInt(3) - 1;
    app->y +=  RandInt(3) - 1;
    app->r  =  ABS(app->r + RandInt(3) - 1);

    // IGraphics インターフェイスを作成します。
    ISHELL_CreateInstance(app->a.m_pIShell, AEECLSID_GRAPHICS, (void**)&graphic);

    // 図形を描画します。
    Shape_OnDraw(app, graphic);

    // IGraphics インターフェイスを破棄します。
    IGRAPHICS_Release(graphic);

    // 再度タイマーを設定します。
    ISHELL_SetTimer(app->a.m_pIShell, 100, OnTimer, app);
}

[ SophiaFramework を使用したコード ]

//
// タイマーを使用して図形を移動します。
//

// シェイプクラスのクラス定義
SFMTYPEDEFCLASS(Shape)
class Shape :public SFRApplication
{
private:
    SFXCircle    _circle;

private:
    // 描画ハンドラ
    HANDLER_DECLARE_VOIDRENDER(Shape, OnDraw)

    // タイマーハンドラ
    Void OnTimer(Void);
    static Void OnTimerEntry(VoidPtr data)
    {
        static_cast<ShapePtr>(data)->OnTimer();
    }
};

//
// タイマーで呼び出される関数
//
Void Shape::OnTimer(Void)
{
    // SFBShell インスタンスを作成します。
    SFBShellSmp  shell = SFBShell::GetInstance();

    // 図形を移動します。
    _circle.r   = ABS(_circle.r + RandInt(3) - 1);
    _circle.cx += RandInt(3) - 1;
    _circle.cy += RandInt(3) - 1;

    // 図形を描画します。
    InvalidateContent();

    // 描画イベントを送信します。
    Invoke(SFXEvent(SREVT_RESPONDER_RENDER, SRP16_RENDER_INVOKE, false));

    // 再度タイマーを設定します。
    shell->SetTimer(100, OnTimerEntry, this);
}