過去の桐井戸端BBS (桐ver.9)
29498 マウスインアウトイベントでゆっくり移動したときはイベントを発生させてすばやく移動したときは発生させたくない 鳴瀬 2005/03/27-15:18
イベント処理に挑戦中です!
マウスインアウト・イベントの&フラグを参照してマウスがオブジェクト内に入ったときのみ処理を行うイベント書きました。

ある意味では問題ないのですが、困った点が1つだけあります。
ゆっくりマウスをオブジェクト内に進入させてイベントを発生させ、その後、オブジェクト外に出すのは問題ないのですが、
すばやくマウスを動かしてオブジェクトを横切らせてもイベントが発生します。
仕様上当然なのですが、当方してはこの場合にはイベントを発生したくありません。(処理を無効にしたい)
マウスを動かす速度とかに関係するのでしょうが何か対応策は考えられないでしょうか?
29499 Re:mouse_in_out_event ONnoji 2005/03/27-18:14
記事番号29498へのコメント
鳴瀬さんは No.29498「mouse_in_out_event」で書きました。
>ゆっくりマウスをオブジェクト内に進入させてイベントを発生させ、その後、オブ
>ジェクト外に出すのは問題ないのですが、すばやくマウスを動かしてオブジェクト
>を横切らせてもイベントが発生します。仕様上当然なのですが、当方してはこの場
>合にはイベントを発生したくありません。(処理を無効にしたい)

体操の「吊り輪」で十字懸垂をした時、
ある一定の時間姿勢を保持しないと、採点されない…みたいなでしょうか。

マウスがインしたら、タイマーの「実行を予約」する。
マウスがアウトしたら、タイマーの「停止を予約」する。
こんな感じで実現可能だと思います。

サンプルをアップしました。
よろしければお試しください。


---------------------------------------------------

鳴瀬さん江

sample.wfm を開いてください。

ファイルは桐ver.8 です。

桐ver.9 でも使えます。

赤い罫線のオブジェクトにマウスインしたら、既定のインターバル後にメッセージボックスを表
示します

<インターバルの指定>

以下は 100/100秒 = 1秒 に設定します。

手続き実行 prcTimerPrimaryON( "&mOnTargetMouseStay", 100 )

以下は 50/100秒 = 0.5秒 に設定します。

手続き実行 prcTimerPrimaryON( "&mOnTargetMouseStay", 50 )

決して、10/100秒 未満の値を指定しないでください。
/* 警告:第二引き数の値を 10 未満にするとハングします */

---------------------------------------------------
29501 Re:mouse_in_out_event 鳴瀬 2005/03/27-21:30
記事番号29499へのコメント
ONnojiさん

>体操の「吊り輪」で十字懸垂をした時、
>ある一定の時間姿勢を保持しないと、採点されない…みたいなでしょうか。

そうです。

さっそく、downloadさせていただきました。
拝見してみましたが、汎用化されているルーチンなので解析に小一時間かかりそうです。(+_+)

処理したい内容はコマンドオブジェクトのツールヒントと同様に
マウスがオブジェクト上にきたら音声でヒントをアナウンスするようなイベントを
作成したいと思ったからです。
# 音声ファイル(wav)は既に作成済みです。

>マウスがインしたら、タイマーの「実行を予約」する。
>マウスがアウトしたら、タイマーの「停止を予約」する。
>こんな感じで実現可能だと思います。

「こんな感じ」の部分を少し噛み砕いていただけると幸いです。
29502 Re:mouse_in_out_event ONnoji 2005/03/27-22:15
記事番号29501へのコメント
>>マウスがインしたら、タイマーの「実行を予約」する。
>>マウスがアウトしたら、タイマーの「停止を予約」する。
>>こんな感じで実現可能だと思います。

鳴瀬さん、こんにちは。

>拝見してみましたが、汎用化されているルーチンなので解析に小一時間かかりそうです。(+_+)
>「こんな感じ」の部分を少し噛み砕いていただけると幸いです。

次のように置き換えて考えていただけれればと思います。

prcTimerPrimaryOFF( ) は、

 オブジェクト操作 @フォーム{ タイマー1 = "0" }と同等です。

prcTimerPrimaryON( 変数名, 整数 )は、

 オブジェクト操作 @フォーム{ タイマー値1 = 整数 }
 オブジェクト操作 @フォーム{ タイマー1 = "1" }
 変数名 = 1

と同等です。
 
これらの手続きに関して、これ以上は噛み砕けません…(^^ゞ
29503 時限タイマーでドッカ〜ン! ONnoji 2005/03/28-11:26
記事番号29502へのコメント
>>「こんな感じ」の部分を少し噛み砕いていただけると幸いです。

鳴瀬さん、こんにちは。

タイマーは、イベントハンドラや手続きが実行されている間は動作しません。

タイマーの使い方には2種類があります。

(1)連続タイマー:常に属性がオンでインターバルが設定されている

(2)時限タイマー:ある時点で属性がオンに設定されて、不要になった時点で属性がオフに設定される

はじめてタイマーを利用する人は、
(1)の連続タイマーを連想することが多いと思いますが、
これは時計を作る時くらいしか使いません。

もっとも利用するのは(2)時限タイマーです。
これは利用範囲が広いです。

以下に[トレース出力]ウィンドウの結果を整形したものを示します。
参考にしてください。
 
 ※注意!掲示板では半角カナが全角カナに変換されています。
 
┌when "famTarget::マウスインアウト(1,1)"を実行開始しました

│┌when "prcfamTargetMouseInRun("lblターゲット")"を実行開始しました
││
││┌when "prcTimerPrimaryON("&mOnTargetMouseStay",100)"を実行開始しました
│││ *-----------------------------------------------------*
│││ ** タイマーの「実行を予約」
│││ ** 一般手続き:prcTimerPrimaryON( )での処理内容
│││ ** オブジェクト操作 @フォーム{ タイマー値1 = 100 }
│││ ** オブジェクト操作 @フォーム{ タイマー1 = "1" }
│││ ** &mOnTargetMouseStay = 1
│││ *-----------------------------------------------------*
││└end
││
│└end

└end
 
 ※[マウスインアウト]イベントハンドラの一連の流れが終了していることに注目
 ※手続きの流れが継続している間はタイマーのインターバルはカウントされない
 :
 :
 インターバル( 100 = 1秒 )
 :
 :
 
┌when "フォーム::タイマー1( )"を実行開始しました

│┌when "prcTimerPrimaryOFF( )"を実行開始しました
││ *-----------------------------------------------------*
││ ** タイマーの「停止を予約」
││ ** 一般手続き:prcTimerPrimaryOFF( )での処理内容
││ ** オブジェクト操作 @フォーム{ タイマー1 = "0" }
││ *-----------------------------------------------------*
│└end

│┌if ( &mOnTargetMouseStay ) /* フラグが立っているか? */
││
││ &mOnTargetMouseStay = 0 /* フラグをクリア */
││
││┌when "prcMsgPause("i","フォーム::タイマー1():prcMsgPause","lblターゲット")"を実行開始しました
│││ *-----------------------------------------------------*
│││ ** メッセージボックスを表示している
│││ ** メッセ^字ボックスの代わりに音声ファイル(wav)を再生すれば良い
│││ *-----------------------------------------------------*
││└end
││
│└end

└end
 
┌when "famTarget::マウスインアウト(0,1)"を実行開始しました

│┌when "prcfamTargetMouseOutRun("lblターゲット")"を実行開始しました
││
││┌when "prcTimerPrimaryOFF( )"を実行開始しました
│││ ** タイマーの「停止を予約」
││└end
││
│└end

└end

29504 一般手続き(サブルーチン)にしているワケ ONnoji 2005/03/28-11:49
記事番号29503へのコメント
>汎用化されているルーチンなので解析に小一時間かかりそうです。(+_+)

鳴瀬さん、こんにちは。

単純な[オブジェクト操作]コマンドを、
わざわざ一般手続き(サブルーチン)にしているワケをご説明いたします。

時限タイマーをオンにするだけなら、以下のように書けばOKです。

オブジェクト操作 @フォーム{ タイマー値1 = 100 }
オブジェクト操作 @フォーム{ タイマー1 = "1" }
&mOnTargetMouseStay = 1

また、時限タイマーをオフにするだけなら、

オブジェクト操作 @フォーム{ タイマー1 = "0" }

です。

しかし、このように書くと、
どこでタイマー属性をオン/オフしたか?、
調べるのが大変になります。
※うっかりで書き忘れ、消し忘れがあると、(T_T)になります。
そこで、一般手続きとして、明示的にしたというワケです。

なお、[トレース出力]ウィンドウでも、
手続きの実行開始…実行終了という形で表示されますので、
一石二鳥の効果があるというわけです。

29505 Re:一般手続き(サブルーチン)にしているワケ 鳴瀬 2005/03/28-12:16
記事番号29504へのコメント
ONnojiさん

>>しかし、このように書くと、
>どこでタイマー属性をオン/オフしたか?、
>調べるのが大変になります。
>※うっかりで書き忘れ、消し忘れがあると、(T_T)になります。
>そこで、一般手続きとして、明示的にしたというワケです。
>
重ね重ね、解説、ありがとうございます。

一応、自己解決をみました。マウスインアウトイベントで

if(&フラグ=1)
サウンド 再生,"ほげほげ"
else
サウンド 停止
end

だけでほぼ実用に耐えうる希望の動作が実現できました。
# 当初はelse文を書いていませんでした。
マウスがインした同時にイベントが発生してアウトした時点では
イベントが発生しない(だから、当初、else文を意識的に書かなかったわけですが)を
すでに発生したイベントの効果を強制的に無効化すればよかったんですね。

その一方で”時限爆弾的処理”も面白いですね。引き続いて解明したいと思っています。

29506 蛇足 ONnoji 2005/03/28-12:28
記事番号29505へのコメント
鳴瀬さん、こんにちは。

解決されたようですね。(^^v

以下は蛇足です。

ライブラリに余計な一般手続きがあるので難しく見えたかもしれません。

今回は、矢印(→)を付けた一般手続き(3個)しか利用していません。
これらを sample.kev にコピペしてもOKです。

 ** sample.cmd
 ** このライブラリには以下の手続きが含まれています。
 ** prcMsgOKCancel
→** prcMsgPause
 ** prcMsgYesNo
→** prcTimerPrimaryOFF
→** prcTimerPrimaryON
 ** prcTimerSecondaryOFF
 ** prcTimerSecondaryON

<追伸>

上以外の一般手続きも含まれていますが、
これは私(ONnoji)が、消したつもりで消し忘れた一般手続きです。
どうか気にしないでください。(^^ゞ

戻る