DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Click DoubleClick

  • 題名: Click DoubleClick
  • 著者: こう
  • 日時: 2004/08/05 16:15:04
  • ID: 5361
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[Win 2000 Pro]
分類:[VB6以前]

質問があるのですが

VB6.0で同じコントロールに対してClick と DoubleClickイベント
を両方実装したいのですが、両方書くと両方ともClickイベントにな
ってしまいます。 どうすればよいでしょうか?
なにとぞ両方を識別できる方法を教えて下さい。

こう
■No5361に返信(こうさんの記事)
> 質問があるのですが
>
> VB6.0で同じコントロールに対してClick と DoubleClickイベント
> を両方実装したいのですが、両方書くと両方ともClickイベントにな
> ってしまいます。 どうすればよいでしょうか?
> なにとぞ両方を識別できる方法を教えて下さい。

タイマ制御やフラグ等でも出来ますが、
ユーザの設定でダブルクリックの感度が変わるので、
GetDoubleClickTime() Win32APIを使うべきです。

じゃ、駄ソースでも載っけておきましょう。

Option Explicit

Private Declare Function GetDoubleClickTime Lib "user32" () As Long

Private Sub Command1_Click()
  Dim iClick As Integer
  Dim vTime As Single

  iClick = iClick + 1

  ' マウスのDoubleClickの間隔を計算
  vTime = Timer + GetDoubleClickTime() / 1000

  If vTime >= 86400 Then
    vTime = vTime - 86400
  End If

  ' 次のClick()メッセージを待つ
  Do While Timer < vTime
    DoEvents
  Loop

  Select Case iClick
    Case 1
      Call MsgBox("TODO:ここにシングルクリック時の処理を書く")

    Case 2
      Call MsgBox("TODO:ここにシングルクリック時の処理を書く")
  End Select

  iClick = 0
End Sub
お返事大変ありがとうございます タイマーなどのやり方があるとは
思いませんでした。

そこでもう少し具体的に質問なのですが、
まずコンボボックスのEnableがFalseの状態で、そのコンボボックスをダブル
クリックするとコンボボックスのEnableがTrueとなるような方法はあるでしょうか?
わかれば教えて下さい。
■No5370に返信(こうさんの記事)
> お返事大変ありがとうございます タイマーなどのやり方があるとは
> 思いませんでした。
>
> そこでもう少し具体的に質問なのですが、
> まずコンボボックスのEnableがFalseの状態で、そのコンボボックスをダブル
> クリックするとコンボボックスのEnableがTrueとなるような方法はあるでしょうか?
> わかれば教えて下さい。

はい。前述のコードを関数化(っていうかコピペ)すれば容易に可能でかつ、
複数のコントロールに(種類に関わらず)使えます。



Timer   :タイマコントロール
cboResult:対象となるコンボボックス

' /*-----------------------------------------------------*/
'  標準イベント:cboResult::Click()
' /*-----------------------------------------------------*/
Private Sub cboResult_Click()
  If IsDoubleClick() = True Then
    cboResult.Enabled = True
  End If
End Sub


' /*-----------------------------------------------------*/
'  【機 能】DoubleClickされたかを返す関数
'  【戻り値】Boolean:ダブルクリックされていればTrueを返す
' /*-----------------------------------------------------*/
Private Function IsDoubleClick() As Boolean
  Dim iClick As Integer
  Dim vTime As Single

  iClick = iClick + 1

  ' マウスのDoubleClickの間隔を計算
  vTime = Timer + GetDoubleClickTime() / 1000

  If vTime >= 86400 Then
    vTime = vTime - 86400
  End If

  ' 次のClick()メッセージを待つ
  Do While Timer < vTime
    DoEvents
  Loop

  If iClick = 2 Then
    IsDoubleClick = True
  End If

  iClick = 0
End Funtion

If iClick = xxx Then を好きな値に変えれば、
ダブルクリックだろうと、トリプルクリックだろうと、テトリスクリックだろうと…(おいおい
可能です。
2004/08/05(Thu) 19:36:07 編集(投稿者)

横槍失礼します。
Enabled が False になってると、イベント自体が発生しないかと思うのですが‥‥(^_^;

それからもう一つ。
コンボ ボックスでは、マウス クリックしても Click イベントが発生しなかったかと。
<Click イベントはリストの選択が変更された時に発生します。
2004/08/05(Thu) 19:53:47 編集(投稿者)

■No5382に返信(深山さんの記事)
> 横槍失礼します。
> Enabled が False になってると、イベント自体が発生しないかと思うのですが‥‥(^_^;

をを、そうでしたね...。
と、なるとGetCursorPos().....うう...面倒だ。
そもそも、Enabled が Falseの時って、メッセージキューにも入ってこない?

擬似的に、Enabledに見せかけるか、意地でやるか...
ただ擬似的にやっても、面倒だし... 矢印部分まで再現できるかどうか...

> それからもう一つ。
> コンボ ボックスでは、マウス クリックしても Click イベントが発生しなかったかと。
> Click イベントはリストの選択が変更された時に発生します。

そうでした。最近、VB.NETばかりやっていたので、すっかり脳内置換しちゃったようです。

# 如何にVB6以前が、イベントの定義がいい加減で、柔軟性もないことか再理解したような...
# 言語仕様にケチつけてもしょうがないですが... いずれにせよ、申し訳ありません...。

■No5370に返信(こうさんの記事)
> まずコンボボックスのEnableがFalseの状態で、そのコンボボックスをダブル
> クリックするとコンボボックスのEnableがTrueとなるような方法はあるでしょうか?
> わかれば教えて下さい。

結局のところ、できるような、できないような...

自分自身が無効なのに、自分自信が有効になりうるスイッチを持つコントロール...
かなり直感的に判りづらいような気がしますが...

できたとしても、かなり面倒だと思われます。(あまりメリットもないかと)

お役に立てないクセに偉そうなことを言って、申し訳ありません m(_ _)m
  • 題名: Re[6]: Click DoubleClick
  • 著者: こう
  • 日時: 2004/08/06 22:00:37
  • ID: 5443
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
いろいろお返事ありがとうございます。
確かにVB6.0からVB.netに変わってから
大分変わったらしいですね。
でもいろいろと勉強になりました。
どうもありがとう御座います
解決済み!
  • 題名: Re[2]: Click DoubleClick
  • 著者: 駄ソース!
  • 日時: 2004/08/08 8:49:33
  • ID: 5448
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> じゃ、駄ソースでも載っけておきましょう。

失礼な!!

>
> Option Explicit
>
> Private Declare Function GetDoubleClickTime Lib "user32" () As Long
>
> Private Sub Command1_Click()
>   Dim iClick As Integer
>   Dim vTime As Single
>
>   iClick = iClick + 1
>
>   ' マウスのDoubleClickの間隔を計算
>   vTime = Timer + GetDoubleClickTime() / 1000
>
>   If vTime >= 86400 Then
>     vTime = vTime - 86400
>   End If
>
>   ' 次のClick()メッセージを待つ
>   Do While Timer < vTime
>     DoEvents
>   Loop
>
>   Select Case iClick
>     Case 1
>       Call MsgBox("TODO:ここにシングルクリック時の処理を書く")
>
>     Case 2
>       Call MsgBox("TODO:ここにシングルクリック時の処理を書く")
>   End Select
>
>   iClick = 0
> End Sub

これって、 ぐうぜんですか?
  http://www.bcap.co.jp/hanafusa/VBHLP/cdwclick.htm

DOBON.NET | プログラミング道 | プログラミング掲示板