戻る


SUBJ:【不定期連載】LHAPI入門 4  この連載は、HP100/200LX(以下100LXと表記)の内蔵インターフェース ルーチンであるLHAPIの入門です。  今回はISH会議室にアップしたサンプルプログラム1を題材に、LHAPI使用 の基本を解説します。 『お詫び』  以前、ISH会議室にアップしたサンプルプログラム1の中で使用した構造 体名や関数名の一部が古い名称になっていました。cap2.hの内部でdefine されているため間違いでは無いのですが、混乱を防ぐために総て新しい名 称に変更したバージョンを再度アップしました。今回使用している行番号 や名称は総て新しいバージョンのものになっています。  HP社から公開されているサンプルプログラムでは古い名称が使われてい ますが今後は新しい名称に統一されるものと思いますので、本連載でも新 しい名称に統一します。 ============ ここから ============= 5 基本構成  LHAPIを使用する上で守るべきいくつかの基本があります。  サンプルプログラム1のmain部をトレースすることにより、その基本を 解説します。  139行のm_init_app関数はEXM形式プログラムの最初に呼び出す初期化 ルーチンで、95LX用ライブラリのm_init関数に相当します。  141行ではInitializeLHAPI関数を用いてLHAPIにLHAPIBLOCK型の構造体 のアドレスを渡し初期化しています。LHAPIを使用するアプリケーション では必ずLHAPIBLOCK型の構造体を確保しておく必要があります。  また、タスクの制御がアプリケーションに移ったとき(E_ACTIV時)は LHAPIに再度アドレスを渡す必要があります。157行のReactiveLHAPI関数 で行っています。  142行のSetDefaultFont関数では、LHAPIで使用するデフォルトのフォン トを指定しています。この値は以降FONT_DEFAULTとして使用することが でき、特に指定がなければTitleBar以外はFONT_DEFAULTが使用されます。  143行のm_reg_app_name関数はメモリ不足時のTaskListで使われる名称を 指定しているもので、LHAPIには直接関係しません。  145行と146行では、MainViewとMainTitleにCREATEメッセージを送って います。  LHAPIの動作の基本はメッセージであり、各ウィンドウ間、アプリケー ションとウィンドウ間の連絡はメッセージで行います。  ここで、MainViewの定義を見てみます(57行から76行)。  57行から59行はファンクションキーの定義です。ファンクションキーは LHFKEY構造体の配列として定義します。Handlerメンバはキーを押下した ときに呼び出すDoHello関数がセットされ、関数F1キーのみ定義しています のでKeyNumメンバは1+LAST_FKEYとなります。  61行から64行はFileメニュー(プルダウンメニュー)の定義です。LHMENU 構造体の配列として定義します。LHMENU構造体の配列では、要素の最後に 0で構成されたLHMENU構造体を加えます。  66行から70行はメニューバーの定義です。この場合も、LHMENU構造体の 配列として定義します。プルダウンメニューの指定では、Handlerメンバに LHMENU構造体へのポインタをセットし、StyleメンバにMENU_PULLDOWNを セットします。  72行から76行はアプリケーションのメインウィンドウの定義です。 LHWINDOW型の構造体として定義します。ここで注目するのはClassメンバ です。LHAPIが標準で提供する基本クラスのハンドラではなく、ユーザーが 定義したハンドラが指定されています。このハンドラは113行から125行に 定義されています。  MainHandler内では、送られたメッセージにより独自の処理を行い( KEYSTROKEメッセージでは何も行わず、DRAWメッセージでDRAW_FRAMEオプ ションが指定されていた場合はウィンドウ全体をクリアします)、その後 自ウィンドウのObjectクラスのハンドラに全く同じメッセージを転送して います(DataとExtraはMessageのオプションです)。これがLHAPIにおける 継承であり、MainViewはObjectクラスのサブクラスであるといえます。  145行に話を戻すと、MainViewにCREATEメッセージ(CREATE_FOCUSオプ ション)を送信していますが、MainViewではMainHandlerに送られたメッ セージを渡します。MainHandlerではCREATEメッセージによる処理を行い ませんので、そのままObjectクラスに渡します。ObjectクラスではCREATE メッセージを受け取り、ウィンドウを作成します。CREATE_FOCUSオプショ ン(サブメッセージ)が指定されていますから、作成後にSET_FOCUSメッ セージをウィンドウに送りフォーカス状態にします。  MainTitleの定義も同様です(78行から88行)。但し、TDataTime(タイ トル右部の時計表示)もMainTile(タイトルバー)もLHAPI提供の基本クラ スのハンドラをそのまま使用しています(DataTimeとTitleBar)。  このように、サブクラスを作る必要がない場合は、基本クラスをそのまま Handlerメンバで指定します。  main部に戻ります。  150行から173行でイベントループを形成しています。152行のm_action関 数は95LX用ライブラリのm_nevent関数に相当します。EVENT構造体の do_eventメンバにDO_EVENTを代入してm_action関数をコールすることにより イベント待ちを行います。  イベント(kindメンバに代入)により各種処理を行います。  E_ACTIVとE_REFRESHの場合は、アプリケーションの活性化を行いますが ここで注意するのはFixupFarPtrs関数です(156行)。中身は91行から103行 ですが、行っていることはデータセグメントの値の再設定です。  SystemManagerは独自のメモリ管理を行っており、タスクスイッチ時に バックグラウンドタスクのデータ領域を勝手に変更することがあります。 その為、フォアグラウンドタスクになる度に、データセグメントの値が 替わっていることを覚悟せねばならず、再設定が必要となるわけです。 farポインタ等は注意してください。  E_DEACTの場合は、LHAPIにもその旨を伝えます(DeactiveLHAPI関数)。  E_NONEの場合は、TDataTimeにDRAWメッセージを送ることにより、時計 表示の最描画を行います。  E_KEYの場合は、フォーカス状態にあるウィンドウ(GetFocus関数で取 得)にKEYSTROKEメッセージを送ります。  E_TERMとE_BREAKの場合は、イベントループから抜け、175行のm_fini関 数をコールしてアプリケーションは終了します。  メインウィンドウのファンクションキーではDoHello関数を指定してい ます(58行)。DoHello関数内ではHelloViewに対してCREATEメッセージを 発行しています(134行)。  HalloViewはDialogBoxのサブクラスですが(105行から111行までの HelloDlgHandlerを参照)、DialobBox(及びそのサブクラス)では構成要 素をLHWINDOW構造体の配列として定義します(40行から45行)。  また、ローカルなLHFKEY構造体の配列を定義して指定することにより、 そのウィンドウ独自のファンクションキーを設定することができます (47行から49行)。サンプルではインプリメントしていませんが、メニュー についても同様です。 ============ ここまで =============  やっと本題に入れたようです。  LHAPIはオブジェクト指向的な動作をしますので、解説が漠然とした (概念的な)ものになってしまいましたが、内部でどのようにインプリメ ントされているかの情報が皆無であり、このような形にせざるを得ません でした。  殆どの部分がHP社が公開したサンプルソースを解析した結果から得た知 識であり、確信とは言いがたいレベルのものです。  それでも大外しはしていないはずです。  また、LHAPIに限らない100LX用ライブラリを使用したEXM形式プログラ ミングにも絡む範囲に入りましたので、95LX用ライブラリによるEXM形式 プログラミングの知識が有れば理解できるように注意して書きましたが、 いかがでしたでしょうか。  やはり一度、95LX用ライブラリによるものと100LX用ライブラリによる EXM形式プログラミングの違いについてまとめた方がよさそうですが、 それだけで数回の連載になってしまいますので躊躇しています。  次回は、メッセージについて解説します。  多分、第二回、第三回と同様、資料性の高い回になると思います。  その後は、各基本クラスの使い方を数回に分けて解説したいと考えて います。  質問、要望等は大歓迎ですので、気軽にお寄せ下さい。   詰め込み過ぎたかな    JCG00070 Brahma でした

戻る

All contents and programs Copyright 1996,97,98 (C) by Masaki " Brahma " Tsumori all rights reserved.