過去の桐井戸端BBS (桐ver.8)
18426 マウスイベントでダブルクリックを識別したい。V8SP6 やく 2003/01/08-11:46
マウスイベントで&フラグの値とかでダブルクリックを
識別したいのですが、できますでしょうか?
リファレンスにも記述がありませんでしたので
やはり無理なのでしょうか?
1 マウス左
2 マウス右
3 マウス左右
4 [Shift]
5 [Shift]+マウス左
6 [Shift]+マウス右
7 [Shift]+マウス左右
8 [Ctrl]
9 [Ctrl]+マウス左
10 [Ctrl]+マウス右。またはマウス中央
11 [Ctrl]+マウス左右。またはマウス左+マウス中央
12 [Ctrl]+[Shift]
13 [Ctrl]+[Shift]+マウス左
14 [Ctrl]+[Shift]+マウス右または[Shift]+マウス中央
15 [Ctrl]+[Shift]+マウス左右または [Shift]+マウス左+マウス中央
18 [Ctrl]+マウス中央
19 [Ctrl]+マウス左+マウス中央
20 [Ctrl]+マウス右+マウス中央
20 [Ctrl]+マウス左+マウス右+マウス中央
22 [Ctrl]+[Shift]+マウス中央
23 [Ctrl]+[Shift]+マウス左+マウス中央
24 [Ctrl]+[Shift]+マウス右+マウス中央
18433 Re:マウスイベントでダブルクリックを識別したい。V8SP6 ONnoji 2003/01/08-15:28
記事番号18426へのコメント
やくさん、こんにちは。
すいませんが、教えてください。
どのような種類のオブジェクトのダブルクリックを識別されたいのでしょうか?
テキストボックス? ラベル? etc. どれでしょう???
18435 Re:マウスイベントでダブルクリックを識別したい。V8SP6 やく 2003/01/08-17:59
記事番号18433へのコメント
ONnojiさん、こんにちわ。

>どのような種類のオブジェクトのダブルクリックを識別されたいのでしょうか?
>テキストボックス? ラベル? etc. どれでしょう???

□社員マスタ

上記のようにトグル(チェックボックス)を配置して
ボックスおよびラベル部をクリックするとチェックのオンオフを行って、
ラベル部をダブルクリックすると社員マスタのテーブルを開く、
といった洒落た(?)構造にしたかったのです。
ラベルでもテキストでもできるようでしたらぜひ教えて下さい。
チェックボックスとリンクしたラベルとは別のラベルで作っても
構いませんので。

18437 Re:マウスイベントでダブルクリックを識別したい。V8SP6 ONnoji 2003/01/08-18:59
記事番号18435へのコメント
>□社員マスタ
>
>上記のようにトグル(チェックボックス)を配置して
>ボックスおよびラベル部をクリックするとチェックのオンオフを行って、
>ラベル部をダブルクリックすると社員マスタのテーブルを開く、
>といった洒落た(?)構造にしたかったのです。
>ラベルでもテキストでもできるようでしたらぜひ教えて下さい。
>チェックボックスとリンクしたラベルとは別のラベルで作っても
>構いませんので。

やくさん、こんにちは。

理解できました!これなら実現できますよ。v(^^)v

この内容に興味があったので…実は色々と実験したのでありました。(^^ゞ
http://tools.geocities.co.jp/SiliconValley-Bay/7565/@geoboard/

■独立したラベル
チェックボックスとリンクしたラベルだと具合が悪いです。
すいませんが、リンクしているラベルを[切り取り]→[貼り付け]で独立したラベルにしてください。

■仕掛けのラベル
ここではダブルクリックする独立したラベルのオブジェクト名を
lbl社員マスタ と想定します。

新しく仕掛けのラベルとして lblTop を作成してください。
このラベル( lblTop )は lbl社員マスタ の上に一時的に配置しますので、
[オブジェクトのリスト]の順番は lbl社員マスタ より下にしてください。

※[オブジェクトのリスト]で lblTop を選択して上下矢印キーを押すと移動できます。

◇ フォーム
└◇ フォーム明細部
 ├─ chk社員マスタ … チェックボックス
 ├─ lbl社員マスタ … ラベル
 └─ lblTop     … 仕掛けのラベル

※オブジェクトの順番に気をつけてください。

仕掛けのラベル( lblTop )は最終的に 罫線=なし、背景色=透明 にすれば良いと思いまが、
最初は罫線があった方が確認し易いと思います。

次の投稿へつづく
18438 Re:つづき ONnoji 2003/01/08-19:00
記事番号18437へのコメント
■イベント( .kev )

例えが悪いですが、携帯電話の「ワン切り」方式のタイマーイベントを使います。
タイマーの実行間隔は変数 &mIntervalSecond の値で調整してください。
※1/100秒単位で指定してください。

仕掛けのラベル( lblTop )は最終的に 罫線=なし、背景色=透明 にすれば良いと思います。

イベントハンドラと一般手続きは次のようになります。

名札 メイン
└ prcTimerPrimaryOFF

フォーム::タイマー1
└ prcTimerPrimaryOFF

lblTop::マウス左クリック

lbl社員マスタ::マウス左クリック
└ prcTimerPrimaryON

prcTimerPrimaryOFF

prcTimerPrimaryON


掲示板では半角カタカナが全角カタカナに変換されていますのでご注意ください。

*--------------------------------------*
名札 メイン
 変数宣言 局所,整数{ &mIntervalSecond = 50,&mONlbl社員マスタDoubleClick }
 
 オブジェクト操作 @フォーム.タイマー値1 = "0.5"
 ** 手続き実行 prcTimerPrimaryON( "", "", &mIntervalSecond )
 
 ** オブジェクト操作 @フォーム.タイマー1 = "0"
 手続き実行 prcTimerPrimaryOFF( )

 
手続き定義開始 フォーム::タイマー1()
 ** オブジェクト操作 @フォーム.タイマー1 = "0"
 手続き実行 prcTimerPrimaryOFF( )
 
 if ( &mONlbl社員マスタDoubleClick )
  &mONlbl社員マスタDoubleClick = 0
  オブジェクト操作 @lblTop{ 始点X = 0,始点Y = 0 }
  ** ラベルの退避先は適当に値を指定してください。
 end
 
手続き定義終了

手続き定義開始 lblTop::マウス左クリック(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)
 確認 "ダブルクリックのつもり"
手続き定義終了

手続き定義開始 lbl社員マスタ::マウス左クリック(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)
 変数宣言 自動,数値{ &posX, &posY, &width, &height }
 
 手続き実行 prcTimerPrimaryON( "mONlbl社員マスタDoubleClick", 1, &mIntervalSecond )
 
 オブジェクト操作 &posX = &this.始点X
 オブジェクト操作 &posY = &this.始点Y
 オブジェクト操作 &width = &this.幅
 オブジェクト操作 &height = &this.高さ
 オブジェクト操作 @lblTop{ 始点X = &posX, 始点Y = &posY, 幅 = &width, 高さ = &height }
 
手続き定義終了

手続き定義開始 prcTimerPrimaryOFF( )
 オブジェクト操作 @フォーム.タイマー1 = "0"
手続き定義終了

手続き定義開始 prcTimerPrimaryON( 文字列 &varname, 整数 &val, 整数 &interval )
 変数宣言 自動,整数{ &int }
 
 ∫ = #set( &varname , &val )
 オブジェクト操作 @フォーム.タイマー値1 = &interval
 オブジェクト操作 @フォーム.タイマー1 = "1"
 
手続き定義終了
*--------------------------------------*

18444 Re:サンプルを用意しました ONnoji 2003/01/09-10:29
記事番号18438へのコメント
やくさん、こんにちは。

仕掛けのラベル( lblTop )は定義時には非表示にしておいて、
[lbl社員マスタ]の[マウス左クリック]イベントで表示にし、
そして、タイマー1イベントで再度非表示するといいようです。

なぜかというと、退避先で仕掛けのラベル( lblTop )をクリックされると、
仕掛けのラベル( lblTop )の背景色が「透明」であってもイベントが発生してしまいますから。(^^ゞ


手続き定義開始 フォーム::タイマー1()
 ** オブジェクト操作 @フォーム.タイマー1 = "0"
 手続き実行 prcTimerPrimaryOFF( )
 
 if ( &mONlbl社員マスタDoubleClick )
  &mONlbl社員マスタDoubleClick = 0
  ** オブジェクト操作 @lblTop{ 始点X = 0, 始点Y = 0 }
  オブジェクト操作 @lblTop{ 画面表示 = "0" }
 end
 
手続き定義終了


手続き定義開始 lbl社員マスタ::マウス左クリック( … 省略 … )
変数宣言 自動,数値{ &posX, &posY, &width, &height }
 
手続き実行 prcTimerPrimaryON("mONlbl社員マスタDoubleClick",1,&mIntervalSecond)

オブジェクト操作 &posX = &this.始点X
オブジェクト操作 &posY = &this.始点Y
オブジェクト操作 &width = &this.幅
オブジェクト操作 &height = &this.高さ
** オブジェクト操作 @lblTop{始点X=&posX,始点Y=&posY,幅=&width,高さ=&height}
オブジェクト操作 @lblTop{ 始点X = &posX, 始点Y = &posY,¥
 幅 = &width, 高さ = &height, 画面表示 = "1" }
手続き定義終了

18446 Re:サンプルを用意しました やく 2003/01/09-14:51
記事番号18444へのコメント
ONnojiさんResありがとうございました。
内容を理解する&実際のチェックボックスの数が多いので
ファミリ化するのに時間がかかると思いますが、
参考の上トライしてみます。

でも、タイマー値を他の用途で使っていたら。。。(?_?;)
管理工学様にはもう少し簡単にダブルクリックを識別できるようがんばってもらいたいですね。
少なくとも[Ctrl]+[Shift]+マウス右+マウス中央よりは、
使う頻度高いと思いま。。。

18447 Re:タイマー値を他の用途で使っていたら ONnoji 2003/01/09-16:04
記事番号18446へのコメント
やくさんは No.18446「Re:サンプルを用意しました」で書きました。
>ONnojiさんResありがとうございました。
>内容を理解する&実際のチェックボックスの数が多いので
>ファミリ化するのに時間がかかると思いますが、
>参考の上トライしてみます。

やくさん、こんにちは。

私( ONnoji )が提示したのはあくまでもひとつの方法です。
他にもっといい方法があるかもしれませんね。

>でも、タイマー値を他の用途で使っていたら。。。(?_?;)

それは大丈夫ですよ。
たとえば、整数:&mOnTxtCancel が 1(真) でタイマーが実行されても、
if ( &mOnTxtCancel ) ... end の範囲で、
&mOnTxtCancel = 0 で偽にすればいいのですから。(^^ゞ

ですから、余分に繰り返す心配は無用です。

---------------------------
手続き定義開始 フォーム::タイマー1()

 /* ワン切り オブジェクト操作 フォーム.タイマー1 = "0" */

 if ( &mOnTxtCancel )
  &mOnTxtCancel = 0 /* 偽にする */
  ** 何かします。
 end

 if ( スイッチA )
  スイッチAを偽に
  ** 何かします。
 end

 if ( スイッチB )
  スイッチBを偽に
  ** 何かします。
 end

手続き定義終了
---------------------------


18448 Re:タイマー値を他の用途で使っていたら ONnoji 2003/01/09-17:12
記事番号18447へのコメント
>>でも、タイマー値を他の用途で使っていたら。。。(?_?;)

タイマー値(実行間隔)のほうは、

必要に応じて、(例は0.5秒間隔)

 オブジェクト操作 @フォーム.タイマー値1 = "0.5"
  または
 オブジェクト操作 @フォーム.タイマー値1 = 50

のようにセットしなおせばOKですよ。


18449 Re:マウスイベントでダブルクリックを識別したい。V8SP6 いかすぱげてぃ 2003/01/09-18:33
記事番号18426へのコメント
ダブルクリックイベント、私も欲しい(欲しかった?)です。

で、V8が出た当時、書いたイベントが次のようなものでした。

LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
 手続き定義開始 ファミリ1::マウス左クリック(長整数 &マウス位置
[2]・・・・
  オブジェクト操作 @フォーム.タイマー1="1" 
  if (&click=1)
    確認 &this
  else
    &click = 1
  end
 手続き定義終了

 手続き定義開始 フォーム::タイマー1()
  オブジェクト操作 @フォーム.タイマー1="0"
  &click = 0
 手続き定義終了
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

前提として、
 ※ フォームのタイマーイベント時間は0.5程度に設定してOFF設定
 ※ 複数のオブジェクトを「ファミリ1」というファミリへ登録
 ※ 変数&clickを局所変数、値0として定義

考え方はシンプルで、1回目のクリックで変数にフラグを立て、規定時間内
に次のクリックが発生しないと、タイマーによってフラグを下ろしてしまうというものです。
上記例は「確認 &this」となってますが、実際にはクリックしたオブジェクト名(&thisの値)によって、処理を分岐します。

ちなみに、コマンドボタン(透明)を使って、
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
機能名        機能パラメータリスト
1           #代入(&click,&click+1)
2 実行条件      &click = 1
3 ---必要な処理---
4           #代入(&click,0)
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

なんてことも出来るのでしょうが、1回クリックしておいて、後でもう一度
クリックすると・・・シングルクリックでも実行されてしまいます。(^^;
最初の処理を手続き実行文にして、その辺はイベントに書けば大丈夫でしょうけど・・・

ちなみにあ、ダブルクリックされたオブジェクトの罫線描画をオブジェクト操作コマンドによって、
一瞬、凹ませてやったると「いかにも」って感じになります。

ちなみに1フォームにタイマーイベントは2つですが、サブフォームを透明にして
単なるダミーとして組み込めば、その分だけタイマーイベントも増えます。
限界値は知りませんが、以前8個程度のタイマーイベントを設定しましたが、
とりあえず破綻はしませんでした。

ということで・・・

いかすぱげてぃ

18451 Re:マウスイベントでダブルクリックを識別したい。V8SP6 うにん 2003/01/09-20:25
記事番号18449へのコメント
タイマーを使わないでも、フラグの代りにクリックしたときの時刻を保存すればいいんじゃないでしょうか。

if (#日時値-&click<=i"0:0:0.2")
確認 &this
end
&click=#日時値

フォーム開始で &click=#日時値 として定義しておきます。
上記は、0.2秒以内にクリックすればダブルクリックと判断します。

厳密には、クリックした場所も保存して、移動していたらダブルクリックでないというロジックも入れた方がいいでしょう。

18452 Re:マウスイベントでダブルクリックを識別したい。V8SP6 悲しげ 2003/01/09-21:33
記事番号18451へのコメント
わを〜、うにんさん、上手い。パチパチパチ・・・・

でも、0.2秒じゃチトきついですね。老いた私(^^;)は、0.5秒くらいに
直して使わせていただきました。

>移動していたらダブルクリックでないというロジック

それと#18449いか様の
>一瞬、凹ませてやったると「いかにも」って感じになります。

を、手抜きして(^^;)、コマンドボタンオブジェクトを使うことにして、
次のような感じにしてみました。
---------------------------------------------------------
名札 メイン
 変数宣言 固有,日時{&click=#日時値},固有,文字列{&focus}



手続き定義開始 bボタン::マウス左クリック(長整数 &マウス位置[2],・・・・
 if(#日時値-&click<=i"0:0:0.5" .and &this=&focus)
  確認 &this+"のダブルクリック感知せり (^^)v"
 end
 &click=#日時値,&focus=&this
手続き定義終了

手続き定義開始 bボタン::フォーカス喪失(文字列 &取得オブジェクト名)
 &focus=""
手続き定義終了
---------------------------------------------------------

これだと、上記「bボタン」は「ファミリ」も可能ですもんね。(^^)v

18453 Re:マウスイベントでダブルクリックを識別したい。V8SP6 悲しげ 2003/01/09-22:18
記事番号18452へのコメント
「確認」コマンドで止めてるから目立たないけど、
場合によっては「トリプルクリック」対策も必要かもしれません?
もうひとつ、変数の加算を噛ませるとか。
18454 Re:マウスイベントでダブルクリックを識別したい。V8SP6 うにん 2003/01/09-23:41
記事番号18453へのコメント
悲しげさん
V8SP6」で書きました。
>「確認」コマンドで止めてるから目立たないけど、
>場合によっては「トリプルクリック」対策も必要
>かもしれません?

そうですね。ダブルクリックを検知したときは、#日時値でなく適当に古い日時
d"2000-1-1 0:0:0"あたりを代入すればいいんではないかな。
(フォーム開始イベントもです。実は、最初は#Uを入れて失敗してたのです:-)

18457 Re:マウスイベントでダブルクリックを識別したい。V8SP6 いかすぱげてぃ 2003/01/10-11:02
記事番号18451へのコメント
うにんさん
>タイマーを使わないでも、フラグの代りにクリックしたときの時刻を保存すればいいんじゃないでしょうか。

うまい。その方が簡単ですね。
これなら、コマンドボタンでもそのまま使えます。(^^)v

>厳密には、クリックした場所も保存して、移動していたらダブルクリックでないというロジックも入れた方がいいでしょう。

じかにマウス移動イベントの発生でクリアするとキツイので、
或る程度の緩み(あそび)を設けてやるといいでしょう。

いかすぱ


18458 Re:チェックボックスでも日時値を使う方法なら出来ます ONnoji 2003/01/10-12:12
記事番号18426へのコメント
>マウスイベントで&フラグの値とかでダブルクリックを
>識別したいのですが、できますでしょうか?
>リファレンスにも記述がありませんでしたので
>やはり無理なのでしょうか?

やくさん、こんにちは。

チェックボックスおよびリンクしたラベルでも、
うにんさんが提示した日時値を使う方法なら出来ます。

いかすぱげてぃさん、うにんさん、悲しげさんこんにちは。
興味深く拝読させていただきました。


やくさんへ。
せっかくリンクしているラベルを独立させるのは大変ですね。
どうも申し訳ありませんでした。m(__)m

サンプルで、うにんさんの方法を確認してみてください。


戻る