昨日の話のつづき、
■■ 昨日までの話のあらすじ
BREWアプリは、HTMLファイルを読み込み、これによって画面入出力ができる。
これを使えばHTMLファイルを使って画面を作成できるため、開発は効率化する。
しかし、このHTMLファイルを使って画面を作成する関数IHTMLVIEWERについて、以下のことをやりたくても、その情報が公開されていない。
(1)ふつう、画面って、項目間のカーソル制御とか、やりたいよね。
(2)あと、スクロールがあるから、スクロールもさせたいし、
(3)イベントをとってきて何か検索して、その結果を項目に反映させたりしたい。
(4)さらには、かな漢を、ここは数字とかここはカナも、とかしたい。
ここで、(1)から(3)について、まず考える。
これを実現するには、
以下のようにおこなう
1.IHTMLVIEWER_GetViewState()を発行して、現在の画面状態を取得する
2.その値を加工する(スクロール量をきめたり、次のフォーカスを変えたければ変えたり)、項目値を変えたり
3.IHTMLVIEWER_SetViewState()を発行して、その加工した値をセットする。
さて、ここで、実際に行うには、IHTMLVIEWER_GetViewStateとIHTMLVIEWER_SetViewStateの関数の引数について、わからないといけないが、これについての説明が不十分だ。
この引数のうち、わからないのはたぶん、「HTML ビューアの状態 をあらわす文字列」というやつ。ほかの引数は理解できるはず。
で、この引数のフォーマットは、以下のとおり
カーソルのTOPの位置,現在フォーカスのあたっているところ?項目名=値&項目名2=値
このうち、?以降の「項目名=値&項目名2=値」は、CGIのGetの引数と同じ形(漢字は16進にするのも同じ)。なので、説明は要らない。公開されていないのは、「カーソルのTOPの位置」と「現在フォーカスのあたっているところ」だが、カーソルのTOP位置は、画面のY座標の相対座標なので、これもOK.
で、今日説明するのは、「現在フォーカスのあたっているところ」の中身について。
<<おことわり>>
以下の内容は、(また、上記の内容、昨日の内容も)ウィリアムのいたずらが、主にシミュレーターを使って解析したものであり、KDDIやメーカーの情報を受け取って知ったものではありません。したがって、解析不十分で間違っている可能性は十分あります。
さらに、端末によって、違う動きをする場合があります。シミュレーターと実機は動きが違うところがあります。その点、ご注意ください。
この内容を参考に開発を行う場合は、あくまで、自己責任でやってください。
つーか、BREWアプリを作るのなら、かならず実機で確かめるべきっす!!
■■ 「現在フォーカスのあたっているところ」の2種類の意味
少なくとも、現在フォーカスのあたっているところには、2種類の意味がある。
(1)HTML上、inputタグ、selectタグで書くもので、これは、IDと一致する。
IDの取得は、IHTMLVIEWER_FindElemの関数でできる
なお、この関数で、種別を指定する場合は、
"input"とか、"a"とか"select"で指定する。つまり、1行テキストも、サブミットのボタンも、inputタグなので、どちらもinputで指定する(位置は、これらの通し番号になる)
(2)aタグは、IDと一致しない。
この場合は、<A HREF=abc>のように書く場合、(AのほかにHREF属性しか指定しない場合)、ID+HREF属性の長さが、このフォーカスの当たっているところの指定となる。
たとえば、IHTMLVIEWER_FindElemの関数で100と返ってきて、<A HREF=abc>と書いていた場合、100+STRLEN("HREF=abc"); (この大文字で書いたのは、わざと。)の値になる。
"HREF="も、長さに含まれるところに注意。
上記(1)ないしは(2)の値を指定する。なお、(1)の値+2にすると、項目の2バイト目にいくのかというと、そんなことはなく、不正な値を指定すると、カーソルは表示されないか、へんなところにいく。
また、スクロール量が足りず、項目が「完全に」表示されている状態でないと、カーソルは、画面に表示している一番上の項目にフォーカスがいく「ことがある」。
で、あと、2つの話題を説明すると、かけると思う。
1つは、<FORM>タグの指定方法、
もうひとつは、HandleEventで上がってくる返り値
この値にTRUEを返すかFALSEを返すかで、システムのデフォルト処理(かな漢の表示など)を行ったり、行わなかったりできるようになる。
ただ、この2つを説明する時間が今ないので、またこんど。