Wide Studio Programmer's Guide

Wide Studio Home
Up to


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



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

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

//WSEV_KEY_HOOKトリガで WSCvifield インスタンスに設定します。
#include "WSDkeyboard.h"
void cbop(WSCbase* object){
  (A)入力されつつあるキーを取得。
  long key = WSGIappKeyboard()->getKey();
  (B)キーがリターンキーであれば
  if (key == WSK_Return){
    //"入力確定"なる名称をもつイベントプロシージャを実行。
    object->execProcedure("入力確定");
  }
}

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

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

新たらにフォーカスがあたって入力を開始する場合や 新たらにマウスでクリックされて入力を開始する場合に 前回入力文字列をクリアするイベントプロシージャを作成してみましょう。 大きな流れとしては次の様になります。
  • (1)フォーカスが新たにあたった場合、クリアフラグを立てます。
  • (2)マウスがクリックされた場合、クリアフラグを立てます。
  • (3)キー入力された場合、クリアフラグがたっていたら、クリアします。
  • (1),(2),(3)のサブイベントプロシージャを張り付けて初期化します。

#include <WSDkeyboard.h>
//フォーカスがあたっていたインプットフィールドを保持する変数
static WSCbase* _focus_if = NULL;
//WSEV_FOCUS_CH トリガで起動するサブEP
static void _focus_ch_(WSCbase* object){
  //(A) フォーカスが移動して来たのかを調査
  if (_focus_if != object && object->getFocus() != False){ 
    //(B)他のオブジェクトからフォーカスが移動してきた場合、
    //クリアするタイミング。そのことをフラグに覚えておく
    object->setUserData("CLEAR TIMING",(void*)1);
    //(C)新たにフォーカスがあたったのは、自分。
    _focus_if = object;
  }
}
//WSEV_MOUSE_PRESS トリガで起動するサブEP
static void _btn_press_(WSCbase* object){
  //(D) マウスでクリックされたら
  //クリアするタイミング。そのことをフラグに覚えておく
  object->setUserData("CLEAR TIMING",(void*)1);
  object->setProperty(WSNcursorPos,0);
  //(E)新たにフォーカスがあたったのは、自分。
  _focus_if = object;
}
//WSEV_KEY_PRESS トリガで起動するサブEP
static void _key_hook_(WSCbase* object){
  //(F) キー入力時に、クリアタイミングかどうか調査
  long fl =(long)object->getUserData("CLEAR TIMING");
  if (fl == 1){
    long key = WSGIappKeyboard()->getKey();
    //(G)クリアタイミングで、移動キーでなければ
    if (key != WSK_Tab &&
        key != WSK_Up &&
        key != WSK_Down &&
        key != WSK_Left &&
        key != WSK_Right ){
      //(H)クリア。
      object->setProperty(WSNlabelString,"");
    }else{
      return;
    }
  }
  //(I)クリアタイミングフラグを落とす。
  object->setUserData("CLEAR TIMING",(void*)0);
}

//前回入力文字列クリア本体
//WSEV_INITIALIZE トリガでインプットフィールドに設定します。
void ifdclr(WSCbase* object){
  //フォーカスがあたったときに起動するサブEPを設定
  WSCprocedure* ac1 = new WSCprocedure("ac1",WSEV_FOCUS_CH);
  ac1->setFunction(_focus_ch_,"_focus_ch_");
  object->addProcedure(ac1);

  //マウスがクリックされたときに起動するサブEPを設定
  WSCprocedure* ac2 = new WSCprocedure("ac2",WSEV_MOUSE_PRESS);
  ac2->setFunction(_btn_press_,"_btn_press_");
  object->addProcedure(ac2);

  //キー入力されたときに起動するサブEPを設定
  WSCprocedure* ac3 = new WSCprocedure("ac3",WSEV_KEY_HOOK);
  ac3->setFunction(_key_hook_,"_key_hook_");
  object->addProcedure(ac3);
}

まずフォーカス関連のサブEPについて説明します。 フォーカスが新たにあたったことを知るために、前回フォーカスがあたっていた オブジェクトを静的変数で保持しておきます。 (A)では、ます、保持しておいたオブジェクトと自分が異なるかを調べます。 異なれば新たにフォーカスがあたったことを意味し、(B)でクリアフラグを 立てます。次に(C)で自分をその静的変数に保持します。
次にマウスのクリック関連のサブEPについて説明します。 (D)でクリアフラグを立てて入力カーソルを先頭に設定します。 次に(E)で自分をフォーカス保持の静的変数に保持します。
次にキー入力関連のサブEPについて説明します。 キー入力関連のサブEPでは、クリアフラグがたっている場合、文字列をクリアして、 そのクリアフラグを落とします。まず、(F)でクリアフラグが立っているか調べます。 (G)では移動キーで、クリアされては悲しいので、そのキーを判別して、 (H)でクリアし、(I)でクリアフラグを落とします。
Document Release 3.00

For Use with Wide Studio Release 3.00, Summper 2002


Wide Stuido Home | Up to

Copyright(C) T. Hirabayashi, 1999-2002 Last modified: June 10, 2002