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

サンプルイベントプロシージャ・ラベル編



マウスで選択可能なラベルにするには

イベントプロシージャにおいて、 最も基本的なマウスの動作に反応するイベントプロシージャのサンプルです。 ラベル上でマウスがクリックされるたびに 数字がカウントアップされるイベントプロシージャを作成してみましょう。

(*----------------------------------------------------------*)
(*Function for the event procedure                          *)
(*----------------------------------------------------------*)
open Swig
open Mwt
open Mwtlib
(* WSEV_MOUSE_PRESS(MOUSE-PRESS)トリガ、でラベルに設定します。 *)
let cbop obj =
  (* (0)マウスボタン1のみ処理 *)
   let status = _WSGIappMouse '() -> getMouseStatus() in
     if ( (get_int status) land (get_int _WS_MOUSE_BTN1) ) <> 0 then
       (* (A)userValue プロパティに覚えている数字を取得 *)
       let value = obj -> getProperty ( "userValue" ) in begin
       (* (B)その数字をカウントアップ *)
         let value2 = (get_int value) +1 in
         (* (C)その数字の表示 *)
         obj -> setProperty ( "labelString", (make_int value2));
         (* (D) userValue プロパティにカウントアップした数字を覚えておく *)
         obj -> setProperty ( "userValue", (make_int value2));
       end;
  ()
let _ = Callback.register "cbop" cbop

まず、このイベントプロシージャは、WSCvbtn,WSCvlabel など、 labelString プロパティを持つオブジェクトに、MOUSE-PRESS トリガで 設定します。マウスボタンがオブジェクト上でマウスがクリックされるたび に、この関数は起動されます。 イベントプロシージャが起動されると、(0)で、マウスボタンの判定をおこ ない、マウスボタン1以外のボタンだったらリターンします。マウスボタン の判定の参考にしてください。

次に (A)で userValue プロパティに覚えている数字を取得します。 userValue プロパティは初期値は0で、ユーザが値を自由に指定して、 保持することができます。ここで、オブジェクトに覚えさせているのは、多 数のオブジェクトに貼られたとき、それぞれのラベルの数字が交じらない様 にするためです。逆にスタティック変数などに保持するように作成すると、 すべてのラベルで一つのカウンタを利用した表示が行えます。

次に(B)でその数字をカウントアップし、 (C)で表示します。(D)で表示した 数字を userValue プロパティに保持し、次のイベントプロシージャ起動 に備えます。

もし、トリガ、MOUSE-IN で張られた場合は、マウスの出 入りした回数を表示するでしょう。



マウスで選択可能なラベルにするには

次に、選択可能なラベルを作成してみましょう。ラベルが選択されている 様に見せるために、色を変化させてみましょう。今度は、userValue プロパティ の変わりにset/getVariantData() 関数を用いて選択状態を保持してみます。

(* WSEV_MOUSE_PRESS(MOUSE-PRESS)トリガ、でラベルに設定します。 *)
let cbop obj =
    (* (A) getVariantData() で覚えている値を取得 *)
  let value = obj -> getVariantData ( "STATUS" ) in begin
    (* (B) value が0だったら選択状態に、1だったら元の表示状態に戻す *)
    if get_int (value -> getInt()) = 0 then begin
    (* (C)元の色名称(文字列)を userString で覚えておく *)
      let color = obj -> getProperty ( "backColor" ) in
      obj -> setProperty ( "userString", (color -> "getCharPtr"()));
    (* (D)選択色の表示状態にする *)
      obj -> setProperty("backColor","slateray4");
    (* (E)状態を覚えておく *)
      obj -> setVariantData ("STATUS",1);
    end else begin
    (* (F)元の色を取り出す *)
      let color = obj -> getProperty ( "userString" ) in
    (* (G)元の色の表示状態にする *)
      obj -> setProperty ( "backColor", (color -> "getCharPtr"()));
    (* (H)状態を覚えておく *)
      obj -> setVariantData ( "STATUS", 0);
    end;
  end;
  ()
let _ = Callback.register "cbop" cbop

このイベントプロシージャは、WSCvbtn,WSCvlabel など、labelString プロパティを持つオブジェクトに、MOUSE-PRESS トリガで設定します。

イベントプロシージャが起動されると、(A)でsetVariantData() 関数で覚えてい る数字を取得します。set/getVariantData()関数は初期値は0で、ユーザが値 を自由に指定して、保持することができます。好きな名称を割り当てて、任 意の値を保持しておくことが出来ます。

次に(B)でその値を判別し、 (C)で元の色を、次回、表示を元に戻すためにプ ロパティ userString で保持して、覚えておきます。次に(D) で選択色 での表示状態にし、(E)で再び選択状態を保持しなおします。

色を元に戻すフェーズは、(F)で保持しておいた元の表示色を取得して、 (G)でその色を反映します。(H) で再び選択状態を保持します。

マウスでハイライトするラベルにするには

マウスのイン・アウトでハイライトするイベントプロシージャを作ってみま しょう。オブジェクト上にマウスが入ってくるとハイライトし、マウスが出 ていくともとに戻るイベントプロシージャになります。

ここで重要なことは、マウスが入った場合に発生するトリガと、マウスが出 た場合に発生するトリガにそれぞれイベントプロシージャを設定するイベン トプロシージャを作成するという点にあります。

すなわち初期化でイベントプロシージャが起動され、その中で新たなイベン トプロシージャを設定することで、複数のイベントプロシージャを一つのイ ベントプロシージャの設定で実現が可能となります。

(*----------------------------------------------------------*)
(*Function for the event procedure                          *)
(*----------------------------------------------------------*)
open Swig
open Mwt
open Mwtlib
(* サブEP1 # マウスイン *)
let subop1 obj =
  (* (A)元の色名称を userString プロパティに覚えておく *)
  let color = obj -> getProperty ( "backColor" ) in
  obj -> setProperty ( "userString", (color -> "getCharPtr"()) );
  (* (B)選択色の表示状態にする *)
  obj -> setProperty ( "backColor", "slategray4");
  ()
let _ = Callback.register "subop1" subop1

(* サブEP2 # マウスアウト *)
let subop2 obj =
  (* (C)元の色名称を取り出す *)
  let color = obj -> getProperty ( "userString" ) in
  (* (D)元の色の表示状態にする *)
  obj -> setProperty ( "backColor", (color -> "getCharPtr"()) );
  ()
let _ = Callback.register "subop2" subop2

(* WSEV_INIT(INITIALIZE)トリガでラベルに設定します。 *)
let cbop obj =
  (* 初期化トリガが発生して実行されると *)
  (* サブEPを、それぞれ新しく設定します。 *)
  (* (E)イベントプロシージャの新規設定   サブEP1 *)
  (* OP名称="ハイライトOP1"  関数=subop1  起動トリガ=WSEV_MOUSE_IN *)
  obj -> addProcedure ( "ハイライトOP1","subop1",_WSEV_MOUSE_IN);
  (* (F)イベントプロシージャの新規設定   サブEP2 *)
  (* OP名称="ハイライトOP2"  関数=subop2 起動トリガ=WSEV_MOUSE_OUT *)
  obj -> addProcedure ( "ハイライトOP2","subop2",_WSEV_MOUSE_OUT);
  ()
let _ = Callback.register "cbop" cbop

サブEP1は、マウスインのトリガで起動し、ラベルの背景表示色をハイライ ト色にします。サブEP2は、マウスアウトのトリガで起動し、ラベルの背景 表示色を元の色に戻します。イベントプロシージャ本体は、初期化トリガで オブジェクトに設定されており、(E)、(F)でサブEP1,2をオブジェクトに設 定しています。以後、マウスがインアウトすると、新しくプログラムの中か ら設定されたサブEPが実行されるようになります。

マウスで選択可能なグループ化されたラベルにするには

同じエリア上に配置されるラベルを、マウスで選択可能なグループ化された ラベルにするイベントプロシージャを実装するために、マウスで選択された ラベルを陥没状態にして、そのエリアにどのラベルが選択されているかを保 持するようにします。

(* WSEV_MOUSE_PRESS(MOUSE-PRESS)トリガでラベルに設定します。 *)
let cbop obj =
  (* (A)userValue プロパティに設定されている値をIDとして使用する *)
  let value = obj -> "getProperty" ( "userValue" ) in
  (* (B)選択された状態(陥没状態)にする *)
  obj -> setProperty ( "shadowType", _WS_SHADOW_IN );
  (* (C)親に覚えている選択されていたオブジェクトを取得する *)
  let parent = obj -> getParent () in
  let targetn = parent -> getVariantData ("SelectedItem") in
  let target = parent -> getChildInstance ((targetn -> "getCharPtr"())) in
  (* (D)その選択されていたオブジェクトの表示状態を元(突出状態)に戻す *)
  if (get_bool (_WSGIappObjectList '() -> existInstance( target ))) then
    ignore(target -> setProperty ( "shadowType", _WS_SHADOW_OUT ));
  if (get_bool (_WSGIappObjectList '() -> existInstance( target ))) &&
     (get_string (target -> getInstanceName()) = get_string (obj -> getInstanceName()) ) then begin
    (* (E)選択しているオブジェクトをもう一度つついた場合 *)
    (*  二度目の選択の場合は、覚えていた自分を0にして忘れる *)
    parent -> setVariantData ( "GroupValue",0);
    parent -> setVariantData ( "SelectedItem","");
  end else begin
    (* (F)一度目の選択の場合は、自分を親に登録。 *)
    parent -> setVariantData ( "GroupValue", 0);
    parent -> setVariantData ( "GroupValue", (value -> "getInt"()));
    parent -> setVariantData ( "SelectedItem", (obj -> "getInstanceName"()));
  end;
  ()

let _ = Callback.register "cbop" cbop

グループ化するラベル達に、それぞれ識別するための ID が必要になります が、userValue プロパティに設定されている値を ID として使用するこ とにします。

(A)で userValue プロパティに設定されている ID を取得します。

(B)で選択されたことを示すため、陥没枠表示にします。

(C)で選択されていたオブジェクトを取得します。どのオブジェクトでも良 いのですが、この例の場合、グループ化するラベル達に共通な親オブジェク トに覚えておきます。

(D)で選択されていたオブジェクトの表示状態をもとの突出状態に戻します。

(E)で選択されていたオブジェクト(target)と、新たに選択されたオブジェ クト(object)が等しい場合、すなわち、2度選択された状態になった場合、 解除します。親に覚えていた値とオブジェクトをリセットします。

(F)では、新たに選択されたオブジェクトと値を親に覚え直します。
Document Release 3.80 for WideStudio ver 3.80, Jan 2005


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