ホーム > サポート > SophiaFramework 技術 FAQ : SophiaFramework に関するよくある質問とその回答

SophiaFramework 技術 FAQ

全般

メモリ関連

スマートポインタ関連

ファイル関連

カメラ関連

レスポンダ関連

イベント関連

ハンドラ関連

その他


全般

Microsoft Visual Studio 2005 で SophiaFramework を使うには ・・・ ?

Version :
全て
質問 : Microsoft Visual Studio 2005 で SophiaFramework を使うにはどうすればよいですか?
答え :

SophiaFramework UNIVERSE 5.0 以降、Microsoft Visual Studio 2005 に対応しています。

ただし、BREW SDK Tools 1.1.1 SP02 Ja が前提になっていて、このモジュールの不具合を修正して利用する必要があります。

■BREW SDK Tools 1.1.1 SP02 Ja の不具合修正方法

  1. BREW SDK Tools 1.1.1 SP02 Ja をインストールする
  2. C:\Program Files\BREW SDK Tools 1.1.1 SP02 Ja\VSAddins\vs80 の内容を確認する
  3. 1041フォルダが存在しない場合、1041フォルダを作成し、1033フォルダの内容をコピーする
Last Modified :
2008/11/18

VC6 で ClassView にクラスリストが表示されないのですが ・・・ ?

Version :
全て
質問 : Microsoft Visual Studio C++ 6.0 (以下 VC6)で、ClassView にクラスリストが表示されるようにするにはどうすればよろしいですか?
答え :

VC6 には、ClassView パーサのマクロ処理に関して不具合があります。

現時点で、ヘッダファイル内コンストラクタの static_throws マクロが原因となって VC6 の ClassView にクラスリストが表示されないことが分かっています。

この場合の回避策は以下のとおりです。

回避策 1. static_throws マクロの記述を削除します。

static_throws マクロはコンパイル時に削除されますので、削除しても実行時に影響は及びません。

( 開発者に例外を搬出する可能性があることを明示しているだけなので )

回避策 2. ヘッダファイルの先頭の方で

#define static_throws

と記述します。

回避策 1. または 2. により、ClassView にクラスリストは正常に表示されるようになります。

# VC6 では ClassView 関連の不具合のため、他にも正常にパースできない可能性があります。 ClassView にクラスリストを表示する必要性が高い場合は、Microsoft Visual C++ .NET2003 をご利用ください。正常にClassView にクラスリストが表示されます。

Last Modified :
2007/10/26

コンパイル時にインクルードファイルを開けないなどの fatal error にはどのように対処すれば・・・?

Version :
全て
質問 :
エラーメッセージ「fatal error : include ファイルを開けません。'*****': No such file or directory」が表示されて、SophiaFramework で作成したアプリをコンパイルできません。
答え :
1. Microsoft Visual C++ 6.0 の Service Pack 6 適用( VC++ 6.0 のみ)

Microsoft Visual C++ 6.0 の場合、Service Pack 6 を適用しなければ、SophiaFramework UNIVERSE アプレットを BREW シミュレータ用に正常にビルドできません。

Service Pack 6 の入手先 : Visual C++ 6.0、および Visual SourceSafe 6.0d を対象とする Service Pack 6

2. インクルード ファイルの確認

[ツール (メニュー)]→[オプション (メニュー)]→[ディレクトリ (タブ)]→[表示するディレクトリ] の項目で [インクルード ファイル] 項目を選択すると下のリストにいくつかの項目が表示されます。

そのなかに下記の項目が設定されているか確認します。

  • $(BREWDIR)\inc, $(SFHOME)\Include

設定されていない場合は、リストの空き部分をクリックし、パスを手動で追加します。

※事前に環境変数 BREWDIR / SFHOME に BREW SDK / SophiaFramework UNIVERSE のインストール先フォルダが正しく設定されているか確認してください。   

3. ライブラリ ファイルの確認

[ライブラリ ファイル] 項目を選択すると同様にいくつかの項目が表示されます。

そのなかに下記の項目が設定されているか確認します。

  • VC++6.0 / BREW 4.0 のとき :
    $(SFHOME)\Library\SophiaFrameworkBrew400JpnVC60.lib
  • .NET2003 / BREW 4.0 のとき :
    $(SFHOME)\Library\SophiaFrameworkBrew400JpnVCNET2003.lib
  • VS2005 / BREW 4.0 のとき :
    $(SFHOME)\Library\SophiaFrameworkBrew400JpnVC2005.lib
  • VC++6.0 / BREW 3.1 のとき :
    $(SFHOME)\Library\SophiaFrameworkBrew310JpnVC60.lib
  • .NET2003 / BREW 3.1 のとき :
    $(SFHOME)\Library\SophiaFrameworkBrew310JpnVCNET2003.lib
  • VS2005 / BREW 3.1 のとき :
    $(SFHOME)\Library\SophiaFrameworkBrew310JpnVC2005.lib

設定されていない場合は、リストの空き部分をクリックし、利用している開発環境に応じたパスを手動で追加します。


 詳細情報 ( SophiaFramework UNIVERSE リファレンス ):

Last Modified :
2009/01/09

RealView Compilation Tools for BREW 1.2 のリンケージエラーにはどのように対処すれば・・・?

Version :
全て
質問 : RealView Compilation Tools for BREW ( RVCTB ) 1.2 のリンケージエラーが発生して、SophiaFramework で作成したアプリの mod ファイルが作成できません。
答え :

SophiaFramework は RVCTB 1.2 の Build 848 を前提としています。 Build 848 でない場合は、ARM 社 ADS 1.2: Build 848 patch for Windows を適用します。

RVCTB 1.2 が Build 848 でもリンケージエラーが発生する場合は、コンパイラ最適化オプションの -Ospace-Otime に変更します。

※ RVCTB 1.2 の Build バージョンは、armcpp コマンドで確認できます。

Last Modified :
2007/03/28

C 言語用 BREW API はどのようにして呼び出しますか?

Version :
全て
質問 :
C 言語用 BREW API はどのようにして呼び出しますか?
答え :

■ 例 1 : IShell インターフェースの場合

SFBShellSmp xshell;
IShellPtr ishell;

// 方法1
if ((xshell = SFBShell::GetInstance()) != null) {
    ishell = interface_cast(xshell.Get());
   // xshell が有効な間、 ishell を利用できる
   // ishell のスコープは xshell のスコープに依存する
}

 // 方法2
if ((xshell = SFBShell::GetInstance()) != null) {
   ishell = interface_cast(xshell.Detach());
   // ishell の解放権限を xshell から取得する
   // 開発者が ishell を明示的に解放する
   ISHELL_Release(ishell);
}

■ 例 2 : IFileMgr インターフェースの場合

SFBShellSmp shell;
SFBBaseSmp xfilemgr;
IFileMgr* ifilemgr;

// 方法1
if ((shell = SFBShell::GetInstance()) != null) {

   // IFileMgr インターフェースを作成する
   if ((xfilemgr = shell->CreateInstance(AEECLSID_FILEMGR)) != null) {

      // スマートポインタクラスから 
      // IFileMgr インターフェースへのポインタを取得する
      ifilemgr = reinterpret_cast<IFileMgrPtr>
                                    (interface_cast(xfilemgr.Get()));

      // IFileMgr インターフェースを利用する
      if (IFILEMGR_Test(ifilemgr, "myfile.txt") == SFERR_NO_ERROR) {
         // ...
      }
      // ifilemgr のスコープは xfilemgr のスコープに依存する
      // スコープを伸ばすには、xfilemgr と ifilemgr をクラス変数にする
   }
}

// 方法2
if ((shell = SFBShell::GetInstance()) != null) {

   // IFileMgr インターフェースを作成する
   if ((xfilemgr = shell->CreateInstance(AEECLSID_FILEMGR)) != null) {

      // スマートポインタクラスから
      //  IFileMgr インターフェースへのポインタを取得する
      ifilemgr = reinterpret_cast<IFileMgrPtr>
                                    (interface_cast(xfilemgr.Detach()));

      // IFileMgr インターフェースを利用する
      if (IFILEMGR_Test(ifilemgr, "myfile.txt") == SFERR_NO_ERROR) {
         // ...
      }

      IFILEMGR_Release(ifilemgr);
      // ifilemgr のスコープは xfilemgr のスコープに依存しないが、
      // ifilemgr は開発者が管理する
      // IFileMgr インターフェースを利用し終わった時点で 
      // 開発者が ifilemgr を明示的に解放する
   }
}
Last Modified :
2007/03/28

SFR アプリと SFC アプリとは ・・・ ? また、そのメリットとデメリットは ・・・ ?

Version :
全て
質問 :
SFR アプリSFC アプリとは ・・・ ? また、そのメリットとデメリットは ・・・ ?
答え :

SFR アプリとは、SophiaFramework の GUI フレームワークを使うアプリのことです。アプリ クラスが SFRApplication を 継承するので SFR アプリと呼びます。

一方、SFC アプリとは、GUI フレームワークを使わないアプリのことです。アプリ クラスが SFCApplication を 継承するので SFC アプリと呼びます。

SFR アプリのメリットは、SophiaFramework 独自の UI レンダリング エンジンを用いた UI コンポーネントを利用できる点にあります。 UI がコンポーネント化されていますので、イベント処理はハンドラ形式になるので、コードは美しく見通しが良くなります。

デメリットは、いくつかの UI 関連の BREW 標準インターフェースに関して、相性が悪い部分があることです。 IHtmlViewer は、そのままでは SFR アプリで使えません。

SFC アプリのメリットは、UI の構築方法やイベントの処理方法が BREW 標準のものとほぼ同じ構造であることです。 そのため、従来の BREW 標準のノウハウをそのまま活用できます。 IHtmlViewer などのインターフェースがラッパークラス経由で BREW 標準と同様に使えます。

BREW 標準で開発されたコードや、KDDI 社提供のサンプル コードの再利用がしやすくなります。

SFC アプリのデメリットは、SophiaFrameworkの UI コンポーネントを利用できないことと、 イベント処理が BREW 標準の分岐形式となるためコードが煩雑になることです。

なお、文字列やコレクションなどのユーティリティ クラスは SFR アプリでも SFC アプリでも利用可能です。

以上をまとめると、SFR アプリは複雑な UI を構築するとき、SFC アプリは既存の BREW 標準のコードを流用するときに、 それぞれ効果を発揮します。

Last Modified :
2007/06/01

メモリ関連

SFBImage 利用時の HeapAllocFailed エラーを回避するには ・・・ ?

Version :
全て
質問 :

SFBImage 利用時の HeapAllocFailed エラーを回避するには ・・・ ?

答え :

最初に、画像を展開する前に、SFXHelper::getramfree() 関数 もしくは SFBHeap::CheckAvail() 関数を使用して、ヒープの空き容量がどれくらい残っているかを確認します。そして、ヒープの総空き容量と断片化していない最大割り当て可能サイズを確認します。

総空き容量が足りない場合は画像を小さくする、または品質を下げることを検討します。 また、総空き容量は残っているのに断片化していて割り当てられない場合は、起動時に連続するヒープ領域を確保して、そのヒープを使います。

SFBImage が内部的に使うヒープ領域は明示的に指定できません。画像を展開する直前に予め確保しておいてヒープを解放してから画像を展開し、表示が終わったら再び連続するヒープ領域の確保を試みます。 こうすることで画像を表示できる可能性が高まります。

Last Modified :
2007/04/02

スマートポインタ関連

C 言語で記述された BREW 用コードを SophiaFramework 用に書き換える方法は ・・・ ?

Version :
4.1
質問 :

C 言語で記述された BREW 用コードを SophiaFramework 用に書き換える方法は ・・・ ?

また、SophiaFramework 上で IShell インターフェースのインスタンスなどはどのように生成すればよいか分かりません。

答え :

一般的なサンプルコードの書き換えは可能です。

SophiaFramework では、I インターフェースは SFB クラスに変換され、インスタンスのポインタはすべてスマートポインタを使って管理されます。

ISHELL_CreateInstance() 関数を使ってインターフェースのインスタンスを生成できますが、SophiaFramework では、通常、生成するクラスの NewInstance() 関数を使います。

// 標準的な方法
SFBKDDIAddrSmp addr;

addr = SFBKDDIAddr::NewInstance();
if (addr != null) {
  // ok
}

// SFBShell を使う場合
SFBShellSmp shell;
SFBKDDIAddrSmp addr;
SFCError error;

// その1
shell = SFBShell::GetInstance();
addr = shell->CreateInstance(AEECLSID_ADDR);
if (addr != null) {
  // ok
}

// その2
error = shell->CreateInstance(AEECLSID_ADDR, &addr);
if (error == SUCCESS) {
  // ok
}

※1. 標準的な方法の場合、内部的に SFBShell を用いた方法に変換されます。

※2. MIF ファイルで許可されていない場合は、インスタンスを生成できません。

SophiaFramework では、SFBShell インスタンスは、以下のように SFBShell::GetInstance() 関数で取得できるので、m_pIShell などの変数によるインスタンス管理は不要です。

SFBShellSmp shell;
 
shell = SFBShell::GetInstance();
 
Last Modified :
2007/04/02

SFBShell インスタンスの解放は必要ですか? また、クラス全体で使えますか?

Version :
4.1
質問 :

SFBShell インスタンスの解放は必要ですか? また、クラス全体で使えますか?

答え :

SophiaFramework では BREW インターフェースのインスタンスをスマート ポインターを使って管理していますので、明示的に解放する必要はありません。変数のスコープが無効になった時点で自動的に解放されます。

明示的に解放するには、shell.Release() などを呼び出します。

SFBShellSmp 型の変数はクラスのスコープ内に存在する場合、クラスが破棄されるまではその変数はクラス全体で使えます。

Last Modified :
2007/04/02

SFB で始まる名前のラッパークラスのインスタンスを明示的に解放するのは ・・・ ?

Version :
4.1
質問 :

SFB で始まる名前のラッパークラスのインスタンスを明示的に解放するのは ・・・ ?

答え :

明示的に解放するには、スマート ポインターの Release 関数を呼び出します。

具体的は、次のようなコードになります。

SFBMediaSmp _media;

_media = SFBMediaQCP::NewInstance();

...

_media.Release();
	

これは、次のコードと意味的に同じです。

ISHELL_CreateInstance(..., &_media);

...

IMEDIAQCP_Release(_media);
	
Last Modified :
2007/06/05

ファイル関連

IFileCp に相当する C++ ラッパークラスは ・・・ ?

Version :
4.1
質問 :

IFileCp に相当する C++ ラッパークラスは ・・・ ?

答え :
SFBKDDIFileCp クラスです。
Last Modified :
2007/04/03

SFBKDDIFileCp を使ってネイティブ フォルダの .bmp ファイルを取得するには ・・・ ?

Version :
全て
質問 :

SFBKDDIFileCp を使ってネイティブ フォルダの .bmp ファイルを取得するには ・・・ ?

答え :

検証した結果、W22H, W22SA, W21CA の場合、IFileCp インターフェースから .jpg / .png / .gif ファイルは取得できましたが、.bmp ファイルは取得できませんでした。

SophiaFramework の SFBKDDIFileCp クラスは、単純にIFileCp インターフェースをラップしているだけですので.bmp ファイルだけを弾くといった特別な処理は行っていません。

SFBKDDIFileCp は IFileCp インターフェースの C++ ラッパーなので、これらの機種では SFBKDDIFileCp を使ってネイティブ フォルダの .bmp ファイルを取得できません。

Last Modified :
2005/02/17

カメラ関連

SFBCamera の使い方は ・・・ ?

Version :
4.1
質問 :
SFBCamera の使い方は ・・・ ?
答え :

SFBCamera の基本的な使い方は、インスタンスの生成や破棄を除けば ICamera インターフェースと同様です。

■ サンプルコード

SFBCameraSmp camera;
 
// カメラのインスタンスを取得
camera = SFBCamera::NewInstance();
if (camera != null) {
 AEESize size;
 
 // 内部コールバックエントリを登録
 camera->RegisterNotify(...);
 
 size.cx = 240;
 size.cy = 320;
 
 // 指定されたサイズでカメラを設定
 camera->SetSize(&size);
 
 // カメラで取得する画像のサイズを設定
 camera->SetDisplaySize(&size);
 ...
}
Last Modified :
2007/04/03

カメラ関連のサンプルコードはありますか?

Version :
4.1
質問 :

カメラ関連のサンプルコードはありますか?

答え :

シーケンス 1 だけに対応したサンプルコードが、下記の Web からダウンロード可能です。

URL : CameraSample.zip

BREW カメラアプリ チュートリアルもあります。

Last Modified :
2007/04/04

W21CA, W22H でカメラの撮影サイズが反映されないのですが ・・・ ?

Version :
全て
質問 :

W21CA, W22H でカメラの撮影サイズが反映されないのですが ・・・ ?

答え :

BREW の場合、カメラ処理はAPI の呼び出し順序や必ず呼び出さなくてはいけない API が存在するなどの機種依存があります。

例えば、SetSize() を呼び出す前に、遅延エンコードやメディアの設定を行うと、SetSize() が正常に動作しないかもしれません。また、SetDisplaySize() や SetZoom()、 SetSize() は呼び出し順序が決まっています。

Last Modified :
2007/04/04

EncodeSnapshot() が失敗するのですが ・・・ ?

Version :
4.1
質問 :

EncodeSnapshot() が失敗するのですが ・・・ ?

答え :

Invoke() を使ってレスポンダを破棄すると、そのレスポンダへのポインタは無効となります。

破棄イベントを処理したレスポンダはハンドラの戻り値として TRUE を返す必要があります。

破棄するレスポンダにカメラ処理の構造体やコールバックエントリがある場合、破棄のタイミングには注意が必要です。

或いは、コールバックのタイミングは機種依存があるかもしれません。

Last Modified :
2007/04/04

オートフォーカス機能は使えますか?

Version :
全て
質問 :

オートフォーカス機能は使えますか?

答え :

オートフォーカス対応機種であれば、オートフォーカス機能は使えます。

ズーム機能を使えば、マニュアルでフォーカスを合わせることが可能です。

オートフォーカス機能、ズーム機能ともに設定値を変更すると反映されるまでに時間がかかりますので、コールバックの結果を待って次の処理に移らなければなりません。

Last Modified :
2007/04/04

レスポンダ関連

親ウィンドウの原点との相対座標や BREW 環境の原点との相対座標の計算方法は ・・・ ?

Version :
4.1
質問 :

親ウィンドウの原点との相対座標や BREW 環境の原点との相対座標の計算方法は ・・・ ?

答え :

自分自身の座標を親の仮想領域系の座標に変換するには、GetBaseBound() 関数を使います。

親のコンテント座標系の座標に変換するには、親の仮想領域の座標を加算します。

■ サンプルコード

SFXRectangle my;

my = GetBaseBound() + GetDirector()->GetVirtualBound().GetOrigin();

親のベース座標系の座標に変換するには、上記座標に親のコンテント領域の座標を加算します。

■ サンプルコード

SFURect my;

my = GetBaseBound() + GetDirector()->GetVirtualBound().GetOrigin()
  + GetDirector()->GetContentBound().GetOrigin();

GetDirector() を使ってレスポンダの親を辿って座標を加算すれば、最終的には BREW 環境における原点からの相対座標 ( 絶対座標 ) に変換できます。

※ 1. 最上位のレスポンダはアプリクラスです。アプリクラスには親がありませんので、アプリクラスで GetDirector() を呼ぶと自分自身が返されます。

※ 2. 仮想領域がコンテント領域からどれくらいオフセットがあるかを計算するには、GetVirtualBound().GetOrigin() を使います。

Last Modified :
2007/04/04

フォーカスされたときに SFRComboboxControl の色を変更できますか?

Version :
4.1
質問 :

フォーカスされたときに SFRComboboxControl の色を変更できますか?

答え :

SFRComboboxControl は、デフォルトではフォーカスされても色を変更できません。

色を変更するには、[ SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT ] イベントのハンドラをオーバーライトするか、HandleContent() 仮想関数をオーバーライトして描画処理を独自実装の関数に差し替えます。

※ SFRComboboxControl のデフォルト描画関数は呼び出されなくなります。コントロールのデザインはすべて独自に実装する必要があります。

Last Modified :
2007/04/04

SFREditboxControl は 1 行固定で使えますか?

Version :
4.1
質問 :

SFREditboxControl は 1 行固定で使えますか?

答え :

SFREditboxControl を一行固定で使うには、コントロール生成後に以下のコードを追加します。

text->SetProperties(text->GetProperties() & ~TP_MULTILINE);
 
Last Modified :
2007/04/04

SFREditboxControl で表示される文字列を右揃えにできますか?

Version :
4.1
質問 :

SFREditboxControl で表示される文字列を右揃えにできますか?

答え :
できません。SFREditboxControl の基となっている ITextCtl に文字列の右揃え指定オプションがないからです。
Last Modified :
2007/04/04

SFREditboxControl に関して、フォーカス時とターゲット時を区別する方法は ・・・ ?

Version :
4.1
質問 :

SFREditboxControl に関して、フォーカス時とターゲット時を区別する方法は ・・・ ?

答え :

枠の色で区別できます。フォーカスのみ設定され、入力できない状態のときは灰色、ターゲットされて入力できる状態のときは青色です。

フォーカスされているかどうかは GetStatusFocus() 関数で、ターゲットされているかどうかは GetStatusTarget() 関数で取得できます。

※ SFREditboxControl はフォーカスされていてもターゲット状態にならない限り、入力できません。

Last Modified :
2007/04/04

SFREditboxControl に関して、フォーカス時とターゲット時の枠の太さを変更するには ・・・ ?

Version :
4.1
質問 :

SFREditboxControl に関して、フォーカス時とターゲット時の枠の太さを変更するには ・・・ ?

答え :

枠の太さは変更できません。独自に SFREditboxControl の周囲に枠を書くなどの方法で代替は可能です。

Last Modified :
2007/04/04

煩雑なキー操作をせずに SFREditboxControl を使えますか?

Version :
4.1
質問 :

煩雑なキー操作をせずに SFREditboxControl を使えますか?

答え :

SFREditboxControl を含むウィンドウなどのレスポンダで、独自にキーをハンドリングすることで、煩雑なキー操作を回避できます。

以下のサンプルコードの場合、SFREditboxControl にフォーカスが設定させている状態でセレクトキーを押すと自動的にネイティブ入力画面に遷移し、ネイティブ入力画面から戻ると自動的に次のコントロールにフォーカスを進めます。

自動的にフォーカスを進めずに、ターゲット状態の解除だけを行うようにも変更できます。

■ サンプルコード

class MyWin {
  private:
    HANDLER_DECLARE_BOOLVOID(OnSelect)
    HANDLER_DECLARE_VOIDCONTROL(OnEdit)
};

MyWin::MyWin(Void)
{
  SFREditboxControlPtr text;

  // テキスト ボックス
  text = ::new SFREditboxControl(this, SFXRectangle(10,10,100,100), "");
  
  // テキストの入力後やフォーカスが外れたときの
  // イベントハンドラの設定
  text->RegisterHandler(SREVT_CONTROL, 
                           HANDLER_BEFORE, 
                           HANDLER_FUNCTION(OnEdit));

  // セレクトキーを押したときのイベントハンドラの設定
  RegisterHandler(SFEVT_KEY, 
                  AVK_SELECT, 
                  HANDLER_AFTER, 
                  HANDLER_FUNCTION(OnSelect));
  
}

HANDLER_IMPLEMENT_BOOLVOID(MyWin, OnSelect)
{
  SFRControlPtr control;
  Bool result(false);

  // フォーカスされているレスポンダを取得する
  if ((control = static_cast<SFRControlPtr>(GetFocus())) != null) {
    // SFREditboxControl がフォーカスされているとき
    if (control->GetAttribute() == ATTRIBUTE_SFREDITBOXCONTROL) {
      // ターゲット状態に設定する
      control->SetStatusTarget(true);
      #if defined TARGET_ENVIRONMENT_PHYSICAL
      // 自動的にネイティブ入力画面に遷移する
      result = control->Invoke(SFXEvent(SFEVT_KEY, AVK_SELECT, 0));
      #else
      result = true;
      #endif
    }
  }
  if (!result) {
    result = SFRWindow::SelectHandler();
  }
 return result;
}

HANDLER_IMPLEMENT_VOIDCONTROL(MainWindow, OnEdit, result, control)
{
    unused(result);

    control->SetStatusTarget(false);
    return;
}
Last Modified :
2007/04/09

イベント関連

0x8000 以降のユーザ定義イベントの範囲は他製品のライブラリを含みますか?

Version :
全て
質問 :

0x8000 以降のユーザ定義イベントの範囲は他製品のライブラリを含みますか?

答え :

0x7000 から 0x8000 までのイベントタイプが SophiaFramework の内部イベントです。

他製品がこの範囲のイベントタイプを使う場合の動作は保証できません。

Last Modified :
2005/02/17

EVT_FLIP は端末の開閉の状態を判断に使えますか?

Version :
4.1
質問 :

EVT_FLIP は端末の開閉の状態を判断に使えますか?

答え :

デフォルトでは、デバイスイベントは「強制配信・子階層への配信無し」というトレーサの設定になっています。アプリケーションクラス以外のクラスでイベントを受け取るにはトレーサの設定を上書きする必要があります。

※ SophiaFramework では、BREW 標準のイベントタイプは先頭に「SF」というプレフィックスが付きます。EVT_FLIP の場合は SFEVT_FLIP です。

■ サンプルコード

class MyApp {
  private:
	HANDLER_DECLARE_VOIDEVENT(FlipHandler)
};

MyApp::MyApp(Void)
{
  RegisterHandler(SFEVT_FLIP, HANDLER_AFTER, HANDLER_FUNCTION(FlipHandler));
  ...
}

HANDLER_IMPLEMENT_VOIDEVENT(MyApp, FlipHandler, event)
{
  // イベント受信時の処理
  return;
}

アプリケーションクラス以外の階層で SFEVT_FLIP をハンドルするには、アプリケーションクラスのコンストラクタ内などで、以下のようにトレーサを設定します。

■ サンプルコード

MyApp::MyApp(Void)
{
  RegisterTracer(SFEVT_FLIP, TRACER_PROVIDE, TRACER_FORWARD);
  ...
}

上記設定により、SFEVT_FLIP イベントは「強制配信・全階層を前から後ろへ配信」という設定になります。よって、ウィンドウクラスなどでもSFEVT_FLIP イベントをハンドルできるようになります。ハンドラの記述方法は、アプリケーションクラスでハンドルする場合と同様です。

Last Modified :
2007/04/09

クリアキーを押してもアプリを終了させないようにできますか?

Version :
4.1
質問 :

クリアキーを押してもアプリを終了させないようにできますか?

答え :

BREW では、クリアキーのイベントに対してアプリが FALSE を返するとアプリは自動的に終了します。自動的に終了させないためには、アプリケーションクラスでクリアキーについて空ハンドラを登録するという方法があります。

■ サンプルコード

MyApp::MyApp(Void)
{
  RegisterHandler(SFEVT_KEY, AVK_CLR, HANDLER_AFTER, HANDLER_NULL);
  ...
}
Last Modified :
2007/04/09

ソフトキーが押されたとき、セレクトキーが押されたように偽装できますか?

Version :
4.1
質問 :

ソフトキーが押されたとき、セレクトキーが押されたように偽装できますか?

答え :

イベントの偽装は、最初に本来のイベントを処理して偽装イベントを自分自身に送信することで実現します。

■ サンプルコード ( ソフトキー 1 が押されたときにセレクトキーを偽装するコード )

MyWin::MyWin(Void)
{
  RegisterHandler(SFEVT_KEY, 
                  SFEVT_KEY_RELEASE, 
                  AVK_SOFT1, 
                  HANDLER_AFTER, 
                  HANDLER_FUNCTION(DummyHandler));
  ...
}

HANDLER_IMPLIMENT_BOOLEVENT(MyWin, DummyHandler, event)
{
  SFXEvent dummy(event);

  dummy.SetP16(AVK_SELECT);
  return Invoke(dummy);
}
 
Last Modified :
2007/04/09

ハンドラ関連

イベントハンドラのオーバーライトやイベントのバイパスに関する規則はありますか?

Version :
4.1
質問 :

イベントハンドラのオーバーライトやイベントのバイパスに関する規則はありますか?

答え :

イベントハンドラは C++ の仮想関数ではありません。親クラスに存在するハンドラと同じ名前で定義しても自動的に呼び出されません。最後に登録されたハンドラが有効になります。子クラスでセレクトキーに別のハンドラをバインドさせると、親クラスのハンドラは無視されます。また、子クラスのハンドラが FALSE を返しても親クラスのハンドラは検索されません。

親クラスのハンドラを起動するは、子クラスで明示的に親クラスのハンドラを呼び出します。

例えば、フォーカスの移動を監視するために SFRWindow クラスを継承した独自のクラスに FocusDownHandler() を作成しても、これだけでは意味がありません。実際にフォーカスの移動を監視するためには、独自のクラスに FocusDownHandler() を作成し、RegisterHandler() でイベントとハンドラをバインドします。

一般に、FocusDownHandler() は下矢印キーにバインドされるでしょう。子クラスで下矢印キーをハンドラにバインドすると、下矢印キーをハンドルする親クラスもしくは先に登録されている他のハンドラは呼び出されなくなります。

■ サンプルコード

class Super {
  protected:
    HANDLER_DECLARE_BOOLVOID(SelectHandler)
};

Super::Super(Void)
{
  RegisterHandler(SFEVT_KEY, 
                  AVK_SELECT,
                  HANDLER_AFTER, 
                  HANDLER_FUNCTION(SelectHandler));
  ...
}

HANDLER_IMPLEMENT_BOOLVOID(Super, SelectHandler)
{
  // do something...
  return true;
}

class Sub : public Super {
  private:
    HANDLER_DECLARE_BOOLVOID(SelectHandler)
};

Sub::Sub(Void)
{
  RegisterHandler(SFEVT_KEY, 
                  AVK_SELECT, 
                  HANDLER_AFTER, 
                  HANDLER_FUNCTION(SelectHandler));
  ...
}

HANDLER_IMPLEMENT_BOOLVOID(Sub, SelectHandler)
{
  Bool result = false;

  // do something...

  if (!result) {
    // 明示的に親のハンドラを呼び出さない限り
    // 親のハンドラが呼び出されない
    result = Super::SelectHandler();
  }
  return result;
}

また、親クラスでセレクトキーに親クラスのハンドラがバインドされている状態で、子クラスですべてのキーを独自のハンドラにバインドした場合なども、親クラスのハンドラが呼び出されることはなくなります。

Last Modified :
2007/04/09

コンボボックスのハンドラで他のボタンへフォーカスを移動させるには ・・・ ?

Version :
4.1
質問 :

コンボボックスのハンドラで他のボタンへフォーカスを移動させるには ・・・ ?

答え :

下記 Web サイトにて、コンボボックスのハンドラで他のボタンへフォーカスを移動させるサンプルアプリのコードが利用可能です。

URL : ComboSample.zip

Last Modified :
2007/04/09

その他

BREW 日本拡張パッケージの SmallFont を使う方法は ・・・ ?

Version :
4.1
質問 :

BREW 日本拡張パッケージの SmallFont を使う方法は ・・・ ?

答え :

■ サンプルコード ( SFXGraphics を利用する場合 )

SFXGraphics::RegisterFont(AEE_FONT_NORMAL, AEECLSID_KDDI_SMALL_FONT)

※ UnregisterFont は (明示的に対応付けを解消する場合以外) 呼び出す必要はありません。

Last Modified :
2007/12/10

アドレス帳の情報を取得したり削除する方法は ・・・ ?

Version :
4.1
質問 :

アドレス帳の情報を取得したり削除する方法は ・・・ ?

答え :

IAddrBook / IAddrRec インターフェースは KDDI 社の端末に搭載されていません。そのため、SFBAddrBook や SFBAddrRec は国内では使えません。但し、シミュレーター上では動作確認できます。

※ MIF ファイルの「アドレス帳へのアクセス」をチェックする必要があります。

■ サンプルコード

SFBAddrBookSmp book;
SFBAddrRecSmp rec;
ACharPtr mail = "null-pointer@s-cradle.com";
AEEAddrField field[] = {{AEE_ADDRFIELD_EMAIL, AEEDB_FT_STRING, mail,
sizeof(mail)}};

if ((book = SFBAddrBook::NewInstance()) != null) {
  if ((rec = book->CreateRec(AEE_ADDR_CAT_NONE, field, field.Getsize())) != null) {
    // ok
  }
}
Last Modified :
2007/12/10