|目次|前ページ|次ページ| ───────────────────────────────────── 2.プログラミングテクニック ───────────────────────────────────── [1]非同期/同期イベント取得モードについて 非同期イベント取得モードとは、コントロールから発生するイベントは発生するその都度 イベントメッセージとしてサーバに送信されます。 非同期モード設定は <esc>%1010;7;answer;timer; sp M このモードは応答速度は良いのですが、状態取得などリスポンス応答を取得 する必要がある場合は、イベントメッセージと混同する場合があります。 【推奨】同期イベント取得モードとは、コントロールから発生するイベントは一旦スタックに保存 されます。サーバアプリケーションからイベントメッセージ送信要求を出すと1件分のイベントメッセージ がサーバに送信されます。もしイベントがは発生しないと次のRead文で待たされる ことになります。タイマーを設定するとタイムアウトでメッセージが送信されます。 このモードは応答速度は遅くなりますが、状態取得などリスポンス応答を取得 するのが容易になります。 同期モード設定は <esc>%1010;8;answer;; sp M イベントメッセージを1件要求は <esc>%1010;1;;;timer;; sp M 共通関数は [ZVCMSYN]を使用します。->【同期イベントの応答シーケンス】を参照 ───────────────────────────────────── ※【注】同期モード設定でも状態取得や文字列取得等の応答を求めるコマンドの ※戻りメッセージの場合にはメッセージスタックを経由せず即受信されますので ※メッセージ要求を発行せずコマンド送信直後に、Read文で応答を受信します。 ───────────────────────────────────── [2]VCMのウィンドウをVcom窓の内側に貼り付けるかポップアップウィンドウで別窓とするか @[7]parent=0,[9]form=0 でフォームを作成するとVcom画面上の 子ウインドウとしてフォームが表示されます。サンプル[ZVCMFR5/ZVCMFR5A] A[7]parent=0,[9]form>0 でフォームを作成するとVcom画面とは別の 独立したウインドウとして表示されます。サンプル[ZVCMFR4/ZVCMFR4A] [3]キャンバスオブジェクトによる汎用印刷エンジンとの併用について @プリンタをオープンする。<esc>[5i(Windowsプリンタモード) A汎用印刷エンジンの所定の設定をする。(フォント等) Bキャンバスオブジェクトを作成する。[ZVCMCVS] Cキャンバスオブジェクトにプリンタデバイスコンテキストをハンドル設定する。[ZVCMCVS7] Dキャンバスオブジェクトからの描画機能と通常のプリンタ出力を併用する。[ZVCMCVS] Eキャンバスオブジェクトを削除する。[ZVCMCVS] Fプリンタをクローズする。<esc>[4i ※JPEG画像ファイルの読み書きやキャンバス描画メソッドを利用するにはキャンバスオブジェクトが必要です [4]イベントマスクの設定方法について コントロールからイベントメッセージを発生させるにはコントロールを作成する前にイベントマスクの設定をします。 イベントメッセージとは、例えばエデットコントロールの場合では、 -->(1)特定のキーボードを押した場合(Keybord) -->(2)フオーカスを失った場合(KillFocus) -->(3)フオーカスを得た場合(SetFocus) -->(4)マウス左クリックされた場合(Click) -->(5)マウスダブルクリックされた場合(DblClick) -->(6)マウス右クリックされた場合(Popup) -->(7)値が一部でも変更された場合(Change) のいずれかが発生しますが、その内どのイベントメッセージを発生させ、どれを禁止するかを コントロールを作成する直前に設定しておきます。 <esc>%999;88;;mask0;mask1;mask2;mask3;mask4;mask5;mask6;mask7; sp M で設定します。フオーカスを失う時とフオーカスを得る時のみ発生させたいのなら mask1=8+16 -> 24 に設定します。<esc>%999;88;;0;24;;;;;;; sp M この後、エデットコントロールを作成すると設定したイベントメッセージのみが発生します。 D CLEAR^ZVCMEVENT S mask1=8+16 D EVENTMASK^ZVCMEVENT または、 D INIT^ZVCMEVENT ;;;mask0〜mask7を削除;;; D SETFOCUS^ZVCMEVENT,KILLFOCUS^ZVCMEVENT ;;;mask1を設定;;; D SETEVENT^ZVCMEVENT ;;;イベントマスクの設定 [5]応答メッセージのフェーマットを取得・設定する 応答メッセージのメッセージ先頭の制御文字、末尾の終端文字、各テータフィールドを区切る デリミタ文字を変更設定することが出来ます。 デフォルトでは、先頭文字:無し,終端文字:<CR>,デリミタ文字:$ となっています。 応答メッセージのフェーマットを取得するには、 D ReadMsgFormat^ZVCMSUB で行います。 変更するには、 D ALTERMSGFMT^AVCMSYN で行います。 [6]アプリケーションプログラムの利用形態 @1フォーム上に複数のコントロールを操作可能にして、入力値の取得はフオーカスを失う時の イベントメッセージを取得し、画面入力の完了はプッシュボタンで感知する。 通常のWindowsアプリケーションのスタイルです。 A1フォーム上には常に1個のコントロールを操作可能にして、入力を行う方法 BVT端末エミュレータ画面とVCMのコントロールを同時利用して入力を行う方法 ※フォーム描画モードを利用するかまたは、Vcom画面上に枠無しのフォームを貼付け その上にコントロールを配置する。 Cストリームオブジェクトを使用して文字列データや画像データのデータ転送(サーバ<->端末)や ファイル転送に利用する。 DVT端末エミュレータ画面もしくはVCMコントロール画面で、マウス右クリック等でポップアップ形式の 下のコントロールの手前にリストボックスやグリッドでリスト表示選択(ヘルプ)に使用する。 [7]アプリケーションプログラムからは共通関数[ZVCM*]を使用する アプリケーションプログラムからは直接エスケープシーケンスを使用するのではなく、必ず ZVCMxxxの共通関数ルーチンを使用するとアプリケーションの作成効率が良くなります。 また、TESTエントリにサンプルコーディングが書かれています。 [8]アプリケーションプログラムから高機能サブルーチン[ZVCS*]を使用する アプリケーションプログラムからパラメタ設定でZVCSxxxxを呼び出しするとリスト選択などの 業務を容易に行うことが出来ます。 この高機能サブルーチン[ZVCS*]を実際に利用する場合は、サブルーチン[ZVCS*]を別ルーチン名に コピーしたものをカスタマイズして使用してください。 [9]シンターミナルを実現する 端末に配置するのは、Vcomの実行形式一式と場合によって変更されることのない 画像ファイルに限定できます。 アプリケーションプログラムやマスタデーブルファイルは、全てサーバに配置することにより プログラムの端末への配信の必要がなくなり、バージョン管理などが大幅に楽になります。 [10]VCMコントロールの位置サイズ指定について コントロールの位置サイズ指定は、rectパラメタで、x,y,w,hで指定しますが、 指定の単位は、Vcomテキストの 行桁単位もしくは ピクセルで指定が出来ます。 Vcomテキストの行桁単位の場合は数値は 浮動小数点数として扱われますので 小数点付きの数値でも指定が可能です。 ※親子関係がある場合は x y は親からの相対位置になります ※親子関係がなくてもパネルをコントロールより後に作成表示すると コントロールがパネルの上に表示されます [11]editおよびrectパラメタの指定について @エスケープシーケンスでedit,rectパラメタの番号を、0指定した時は、編集領域番号0を指定した のではなく指定されなかったとみなします。 Aエスケープシーケンスでedit,rectパラメタの番号を、1〜63を指定した場合は、編集領域番号 1〜63の最大文字長255バイトの領域が指定されたものとみなします。 Bエスケープシーケンスでedit,rectパラメタの番号を、531,532,533,534のいずれかが指定された 時は、65535バイトの領域が使用されます。 ※使用する場合は予めその領域にエスケープシーケンスで(共通関数有)ダウンロードしておきます ※サーバと端末間で日本語コードが異なる時は、コード変換されます。 [12]フォーム,コントロールは非表示で作成し一気に表示する フォーム,コントロールは非表示モードで作成してエスケープシーケンスで同時に表示すると 画面上で見た目、バラバラに表示しているより良くなります。 [13]応答メッセージのフェーマットを共通関数で分解する RESP<--受信応答メッセージ D VCMRESP^ZVCMSUB 各フィールドがローカル変数に分解される。 [14]キーボードイベントについて @コントロールからキーボードイベントメッセージを発生させるにはコントロールを作成する前に イベントマスク(mask0=8:ビット3)の設定をします。 A[5]rectパラメタの[12]keycodeに0,1,2,3,...終了キーコード設定しておきます。 コントロールid毎に終了キーコードが管理されています。 Bイベント応答メッセージの[9-1](終了キー)に仮想キーコードが設定されてきます。 $[5-1](従来イベントコード);[5-2](新イベント種別)でキーボードイベントが識別されます。 Cコントロールid毎に終了キーコードをセットではなく仮想キーコードで指定することも可能です。 <esc>%control;11;[3]id;[4]edit;;;;;;; sp M [4]editが指す編集番号には、 (1)key ; shift $ (2)key ; shify $ ... $ --> 【6.各コントロールで共通のシーケンス】に記載 [15]行桁のプリンタスケールモードについて @ビットマップではプリンタオープン中かつデバイスモードが1又は2のはプリンタ上のサイズです ◆ whのサイズ指定についてのご注意 <esc>[500;devicemode; G --> 予めスケールモードを設定しておく必要があります devicemode=1:プリンタメインフォントスケール devicemode=2:プリンタカレントフォントスケール devicemode=0:画面フォントスケール ※共通関数での指定 S devicemode=(スケールモード) D DEVICEMODE^ZVCMCVS7 ;;;スケールモードを設定 Aキャンバスではプリンタオープン中かつデバイスモードが1又は2の場合プリンタのサイズ位置です ◆ xy座標の位置指定についてのご注意 <esc>[500;devicemode; G --> 予めスケールモードを設定しておく必要があります devicemode=1:プリンタメインフォントスケール devicemode=2:プリンタカレントフォントスケール devicemode=0:画面フォントスケール [16]プリンタオープン中に画面表示したい @長いパラメタ領域に設定 <esc>%areano;term;sp F<画面表示したい文字列>$C(term) areano=531:長いパラメタ領域(1) areano=532:長いパラメタ領域(2) areano=533:長いパラメタ領域(3) areano=534:長いパラメタ領域(4) term=文字列のターミネータコード(0 は <CR>とします) A長いパラメタ領域を画面表示 <esc>%560;editno; sp F --> 予め集領域番号に設定しておきます editno=1〜63,531,532,533,534:編集領域番号(画面に文字長も表示されます:デバグ用) editno=561,562,563,564:長いパラメタ領域番号(1〜4)(文字列のみ表示) ※共通関数での指定 S dspstr=(エスケープシーケンスを含む画面表示したい文字列) D DISPLAY^ZVCMCVS7 ;;;531領域が使用されます [17]コントロールオブジェクトの廃棄について @通常、子から順にオブジェクトを廃棄していきます A親を廃棄すると、vcmは自動的にその子から順に廃棄していきます Bあるcidで新規にオブジェクトを作成した場合そのcidにオブジェクトが存在していると そのオブジェクトを廃棄してから作成をします。 Cフォームを廃棄するとそれを親とするコントロールは自動的に廃棄されます。 D一括してすべてのオブジェクトを廃棄するコマンドが用事されています。 E本ソフトを終了する際は、自動的に全てのオブジェクトは廃棄されます。 [18]キャンバスオブジェクトと汎用グリッドのテキスト描画について @キャンバスオブジェクトでテキストの背景を透過にするにはブラシのスタイルをクリア(2)に 設定します A汎用グリッドでもセル内の各行の属性のスタイルにクリア(2)にを設定して テキストの背景を透過にできます。 さらに背景を模様(3〜8)で塗ることができます。(スタイルを設定) Bテキスト描画の方向(Orientation)が=0の場合は左から右に描画します。 それ以外の場合はX軸の左回りの角度を10倍した値です。 0以外を指定した場合テキストの背景を塗ることが出来ません。 C描画開始位置(x,y)はVcom画面の行桁サイズ又はピクセルサイズです。 2行目以降の自動改行位置は前の行のフォントサイズで計算されます。 ─────────────────────────────────── 2-1 |目次|前ページ|次ページ|