WideStudio Application Builder User's Guide(Ocaml言語)

サンプルイベントプロシージャ・インプットフィールド編



リターンキーで特定のイベントプロシージャを実行するには

イベントプロシージャにおいて、特定のイベントプロシージャを起動するこ とをしてみましょう。ここでは、リターンキーを入力で、"入力確定"なる名 称を持つイベントプロシージャを起動する例をあげます。

(* WSEV_KEY_HOOKトリガで WSCvifield インスタンスに設定します。*)
let cbop obj =
  (* (A)入力されつつあるキーを取得。*)
  let key = get_int (_WSGIappKeyboard '() -> getKey ()) in
  (* (B)キーがリターンキーであれば *)
  if (key = get_int _WSK_Return) then
    (* "入力確定"なる名称をもつイベントプロシージャを実行。*)
    ignore(obj -> execProcedure ( "入力確定" ));
  ()

let _ = Callback.register "cbop" cbop

(A)でキーボードグローバルインスタンスから、入力されつつあるキーを取得します。

(B)でリターンキーかどうか判別し、もしそうだったら(C)で、"入力確定"な るEP名称をもつEPを実行させます。 この入力確定実行イベントプロシージャ は、リターンキーによる入力確定動作を行いたい場合によく用いられます。

初期時入力で前回入力文字列をクリアするには

新たらにフォーカスがあたって入力を開始する場合や新たらにマウスでクリッ クされて入力を開始する場合に前回入力文字列をクリアするイベントプロシー ジャを作成してみましょう。大きな流れとしては次の様になります。


  • (1)フォーカスが新たにあたった場合、クリアフラグを立てます。

  • (2)マウスがクリックされた場合、クリアフラグを立てます。

  • (3)キー入力された場合、クリアフラグがたっていたら、クリアします。

  • (1),(2),(3)のサブイベントプロシージャを張り付けて初期化します。

(* フォーカスがあたっていたインプットフィールドを保持する変数 *)
let focus_if = C_void

(* WSEV_FOCUS_CH トリガで起動するサブEP *)
let _focus_ch_ obj =
  (* (A) フォーカスが移動して来たのかを調査 *)
  if ( focus_if <> C_void) &&
     ( get_string (focus_if -> getInstanceName()) <> get_string (obj -> getIsntanceName ()) ) &&
     ( get_int (obj -> getFocus ()) == get_int _False ) then begin
    (* (C)新たにフォーカスがあたったのは、自分。 *)
    let focus_if = obj in
    (* (B)他のオブジェクトからフォーカスが移動してきた場合、 *)
    (* クリアするタイミング。そのことをフラグに覚えておく *)
    ignore(obj -> setVariantData ("CLEAR TIMING", 1 ));
  end;
  ()
let _ = Callback.register "_focus_ch_" _focus_ch_

(* WSEV_MOUSE_PRESS トリガで起動するサブEP *)
let _btn_press_ obj =
  (* (E)新たにフォーカスがあたったのは、自分。 *)
  let focus_if = obj in
  (* (D) マウスでクリックされたら *)
  (* クリアするタイミング。そのことをフラグに覚えておく *)
  obj -> setVariantData("CLEAR TIMING",1);
  obj -> setProperty("cursorPos",0);
  ()
let _ = Callback.register "_btn_press_" _btn_press_

(* WSEV_KEY_PRESS トリガで起動するサブEP *)
let _key_hook_ obj =
  (* (F) キー入力時に、クリアタイミングかどうか調査 *)
  let fl = get_int (obj -> getVariantData("CLEAR TIMING")) in
  if (fl == 1) then begin
    let key = get_int (_WSGIappKeyboard '() -> getKey()) in
    (* (G)クリアタイミングで、移動キーでなければ *)
    if (key <> get_int _WSK_Tab &&
        key <> get_int _WSK_Up &&
        key <> get_int _WSK_Down &&
        key <> get_int _WSK_Left &&
        key <> get_int _WSK_Right) then begin
      (* (H)クリア。 *)
      ignore(obj -> setProperty("labelString",""));
      (* (I)クリアタイミングフラグを落とす。 *)
      ignore(obj -> setVariantData("CLEAR TIMING",0));
    end;
  end;
  ()
let _ = Callback.register "_key_hook_" _key_hook_

(* 前回入力文字列クリア本体 *)
(* WSEV_INITIALIZE トリガでインプットフィールドに設定します。*)
let ifdclr obj =
  (* フォーカスがあたったときに起動するサブEPを設定 *)
  obj -> addProcedure( "ac1", "_focus_ch_", _WSEV_FOCUS_CH);
  (* マウスがクリックされたときに起動するサブEPを設定 *)
  obj -> addProcedure( "ac2", "_btn_press_", _WSEV_MOUSE_PRESS);
  (* キー入力されたときに起動するサブEPを設定 *)
  obj -> addProcedure( "ac3", "_key_hook_", _WSEV_KEY_HOOK);
  ()
let _ = Callback.register "ifdclr" ifdclr

まずフォーカス関連のサブEPについて説明します。フォーカスが新たにあたっ たことを知るために、前回フォーカスがあたっていたオブジェクトを静的変 数で保持しておきます。

(A)では、ます、保持しておいたオブジェクトと自分が異なるかを調べます。 異なれば新たにフォーカスがあたったことを意味し、(B)でクリアフラグを 立てます。次に(C)で自分をその静的変数に保持します。

次にマウスのクリック関連のサブEPについて説明します。(D)でクリアフ ラグを立てて入力カーソルを先頭に設定します。次に(E)で自分をフォーカ ス保持の静的変数に保持します。

次にキー入力関連のサブEPについて説明します。キー入力関連のサブEPでは、 クリアフラグがたっている場合、文字列をクリアして、そのクリアフラグを 落とします。まず、(F)でクリアフラグが立っているか調べます。(G)では移 動キーで、クリアされては悲しいので、そのキーを判別して、(H)でクリア し、(I)でクリアフラグを落とします。
Document Release 3.80 for WideStudio ver 3.80, Jan 2005


WideStudio documents index | 目次
バグ情報、ご質問等ございましたら、メーリングリストでご確認の上、 御気軽にこちらの方までよろしくお願いいたします。