tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルコマンドを長押しすると別の処理をさせる
記事No12871
投稿日: 2008/08/09(Sat) 20:58
投稿者翔さん
どうもこんばんは。翔さんです
前回もここで質問させていただきプログラムを入力した結果大変うまくいきました。
ありがとうございました。
今回はその続きでコマンドボタンを押しっぱなし(長押し)すると別の処理が出来るようにしたいのです。
具体的には、スロットで普段はコマンドを押すともう1度繰り返すことが出来るボタンに
長押しをすると終了のコマンドのところにマウスをあわせボタンを押すと終了するというものです。
ウェブで結構探しましたがなかなかそれにあたるようなプログラムは
見つかりませんでした。
たぶんドラッグを改造するかもしくは新しい関数を使うのかなと思い探しましたが見つからなかったのでここに質問しに着ました。
ずうずうしい話かもしれないですが、どうかよろしくお願いします。

[ツリー表示へ]
タイトルRe: コマンドを長押しすると別の処理をさせる
記事No12872
投稿日: 2008/08/10(Sun) 00:43
投稿者花ちゃん
あまり、スマートな方法ではないですが、MouseDown から MouseUp までの
時間をTimer コントロール等で監視すれば一応それらしき事はできます。

[ツリー表示へ]
タイトルRe^2: コマンドを長押しすると別の処理をさせる
記事No12873
投稿日: 2008/08/10(Sun) 16:28
投稿者花ちゃん
ろくでもないコードですが、ちょっと試しに作って見ました。
今回のようにリピート処理が不要な場合はその部分を削除して下さい。

又、下記のような方法でもいいかも
CommandButton でダブルクリックを取得する でダブルクリックで処理をする
http://www.hanatyan.sakura.ne.jp/vbhlp/cdwclick.htm



Option Explicit

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private FrgMouseDown As Boolean

Private Sub Command1_MouseDown(Button As Integer, _
                     Shift As Integer, X As Single, Y As Single)
   FrgMouseDown = True
  
   '1.5秒以上押し続けた場合処理を1回実行する(時間はお好みで)
   Call GetKeepsPushing(1500, False)
  
   '1.5秒以上押し続けた場合処理を何回も繰り返す
   'Call GetKeepsPushing(1500, True)
End Sub

Private Sub Command1_MouseUp(Button As Integer, _
                     Shift As Integer, X As Single, Y As Single)
   FrgMouseDown = False
'  Me.Cls
End Sub

Private Sub GetKeepsPushing(ByVal pt As Long, ByVal rp As Boolean)
   Dim st As Long
   '約 49.71 日以上連続稼働しているPCは注意して下さい。
   st = timeGetTime        'ボタンが押された時の時間
   Do While FrgMouseDown   'True の間押されている時間を測定
      DoEvents
      '指定の時間以上押されていたら処理を抜ける
      If timeGetTime - st > pt Then Exit Do
   Loop
  
   '押されていた時間が指定の時間以内の場合何もしない
   If timeGetTime - st < pt Then Exit Sub
'-----------------------------------------------------------------------
      'ボタンが押し続けられた場合の処理
      Print "Command ボタンが1.5秒以上押されました。"
'-----------------------------------------------------------------------
   If rp = False Then
      '1回だけ実行する場合
      FrgMouseDown = False
   Else
      'リピート操作が必要な場合(押している間何回も処理を実行する)
      Call GetKeepsPushing(200, True)
   End If
End Sub

[ツリー表示へ]
タイトルRe^3: コマンドを長押しすると別の処理をさせる
記事No12874
投稿日: 2008/08/10(Sun) 17:55
投稿者翔さん
本当にありがとうございました。
ひとつ質問なのですが・・・
>約 49.71 日以上連続稼働しているPCは注意して下さい。
なぜ、49.71日以上の場合注意しないといけないのですか?
あと連続稼動というのは電源を1日1回つけるのかそれとも電源を朝から晩までつけた状態を49.71日以上付けた場合のケースですか?
まあ後者のほうならそんあケースはあまり考えられないでしょうけどね

[ツリー表示へ]
タイトルRe^4: コマンドを長押しすると別の処理をさせる
記事No12875
投稿日: 2008/08/10(Sun) 18:05
投稿者花ちゃん
> なぜ、49.71日以上の場合注意しないといけないのですか?
http://msdn.microsoft.com/ja-jp/library/cc428795.aspx
起動してから 2^32 ミリ秒経過すると、0 にリセットされるので、その間をまたぐと時間の
計算が正しくできないからです。
同じ事が、 Timer で時間を取得した場合にも言えます、この場合は 0時でリセット
されます。

まあ、つけっぱなしでも、リセットされる前後の数秒の間に使用しなければ、問題ない
のですが、この事を書いておかないとつっこむ人が中におられるので。

> あと連続稼動というのは電源を1日1回つけるのかそれとも電源を朝から晩までつけた状態を49.71日以上付けた場合のケースですか?

timeGetTime 関数の場合は、パソコンを起動してから、終了するまでの時間です。
2^32 ミリ秒 は、約49.71日になります。

[ツリー表示へ]
タイトルRe^5: コマンドを長押しすると別の処理をさせる
記事No12876
投稿日: 2008/08/10(Sun) 18:28
投稿者翔さん
そういうことだったんですね。それならあまり問題はないですね。
とりあえず紹介されたのを両方試してみてどちらか使いやすい方を使ってみます。
何から何までありがとうございました。
花ちゃんさんもこの夏は特に暑いですがお体にきをつけてください。

[ツリー表示へ]