[リストへもどる]
一括表示

投稿時間:2003/08/10(Sun) 20:05
投稿者名:みつお
Eメール:
URL :
タイトル:
Validateイベントについて
たびたびすみません。
またまた基本的な質問です。

VBの画面でユーザーにテキストボックスに入力してもらい、
Validateイベントにて入力チェックをする仕組みを作っています。
Validateイベントでは数字かどうかのチェックを行い、数字でなければ
メッセージボックスを出すという処理を行っています。
もちろんそのあとKeepFocusはFalseにしています。
そこで、質問というのは、テキストボックスで入力を行った後、すぐに
コマンドボタンを押すとValidateイベントに移行するのですが、その後、
コマンドボタンのClickイベントに飛んでくれません。
すみませんが、原因のわかる方いれば教えていただけないでしょうか?

投稿時間:2003/08/11(Mon) 01:52
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: Validateイベントについて
> もちろんそのあとKeepFocusはFalseにしています。
現在のバージョンでは、
  Private Sub Text1_Validate(Cancel As Boolean)
のように、Cancelという引数名になるはずですが、これをあえて、
ヘルプの表記にある KeepFocus という引数名に変更しているのでしょうか?

> そこで、質問というのは、テキストボックスで入力を行った後、すぐに
> コマンドボタンを押すとValidateイベントに移行するのですが、その後、
> コマンドボタンのClickイベントに飛んでくれません。
Validateイベントの引数に True を代入すると、マウスやキーボード操作での
フォーカスの移動が中止されるので(一部例外あり)、Clickイベントも起きなくなりますよ。

投稿時間:2003/08/11(Mon) 08:36
投稿者名:みつお
Eメール:
URL :
タイトル:
Re^2: Validateイベントについて
お世話になります。

> > もちろんそのあとKeepFocusはFalseにしています。
> 現在のバージョンでは、
>   Private Sub Text1_Validate(Cancel As Boolean)
> のように、Cancelという引数名になるはずですが、これをあえて、
> ヘルプの表記にある KeepFocus という引数名に変更しているのでしょうか?

プログラム上ではCancelが引数になっています。
魔界の仮面弁士さんのおっしゃる通りヘルプではKeepFocusと表記されていた
のでここではそう書きました。わかりづらくて申し訳ありません。

> Validateイベントの引数に True を代入すると、マウスやキーボード操作での
> フォーカスの移動が中止されるので(一部例外あり)、Clickイベントも起きなくなりますよ。

Validateイベントの最後にcancel=Falseとしているのですが、それでも飛んできません。
仮にLostfocusイベントに変えてみたのですが、それでも飛んできません。

それで、Validateイベントのメッセージボックスを取ってみたところ、Clickイベントに
飛びました。
ということは自分なりにメッセージボックスが原因なのかなと。
しかし、メッセージボックスは必要なので、別の方法で対処したいのですが、
何か方法はあるでしょうか?

投稿時間:2003/08/11(Mon) 12:33
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: Validateイベントについて
> しかし、メッセージボックスは必要なので、別の方法で対処したいのですが、
> 何か方法はあるでしょうか?

どのようなコードになっているか解らないので何とも言えないのですが。
メッセージボックスの結果でSetFocusを実行したのではだめなのでしょうか?

又は、フラグを立てて、メッセージボックスの表示を回避するとか。

投稿時間:2003/08/11(Mon) 13:58
投稿者名:みつお
Eメール:
URL :
タイトル:
Re^4: Validateイベントについて
花ちゃんさん、いつもお世話になります。

> どのようなコードになっているか解らないので何とも言えないのですが。
> メッセージボックスの結果でSetFocusを実行したのではだめなのでしょうか?
> 又は、フラグを立てて、メッセージボックスの表示を回避するとか。

Text1_Validate(cancel As Boolean)
    
    Text1.Textとデータベースの内容がイコールかをチェック
  
  上記処理がイコールでない場合msgboxをだす。
  
  msgboxの返却値がvbOKだった場合Text2.Textにデータベースの
  内容を反映

  cancel = False

end sub

簡潔に書くとこういう内容なのですが、Text1からコマンドボタンを押すと、
上記の関数が呼ばれ、そのあとコマンドボタンのClickイベントが
呼ばれないのです。
上記の処理で、メッセージボックスを出さなくするとClickイベントが
呼ばれるようになります。
SetFocusを呼んでClickイベントが呼ばれるようになるのでしょうか?
すみません、なかなか理解できなくて。

投稿時間:2003/08/11(Mon) 14:46
投稿者名:nanashi
Eメール:
URL :
タイトル:
Re^5: Validateイベントについて
通常、コマンドボタンをクリックした時に
 Text1_Validate
 Command1_MouseDown
 Text1_LostFocus
 Command1_GotFocus
 Command1_Click
 Command1_MouseUp
の順にイベントが発生します。

ですが、Validateイベント内でメッセージボックスを出した時は
Command1_GotFocusまでしかイベントが起きず、なぜかマウスを押したままの状態になります。
(メッセージボックスをOKした後、そのままカーソルをコマンドボタン上に持っていってみて下さい)

詳しい原因や回避策は思い付きませんが、「こういうことが起こってるよ」ということで。
とりあえず現状ではClickイベントは発生しませんね。

投稿時間:2003/08/12(Tue) 09:07
投稿者名:みつお
Eメール:
URL :
タイトル:
Re^6: Validateイベントについて
お世話になります。

> 通常、コマンドボタンをクリックした時に
>  Text1_Validate
>  Command1_MouseDown
>  Text1_LostFocus
>  Command1_GotFocus
>  Command1_Click
>  Command1_MouseUp
> の順にイベントが発生します。
>
> ですが、Validateイベント内でメッセージボックスを出した時は
> Command1_GotFocusまでしかイベントが起きず、なぜかマウスを押したままの状態になります。
> (メッセージボックスをOKした後、そのままカーソルをコマンドボタン上に持っていってみて下さい)

まさしくその通りになりました。
マウスを押した状態で、そのあと2回クリックしないとコマンドボタンを押せない
ような状態になります。


>
> 詳しい原因や回避策は思い付きませんが、「こういうことが起こってるよ」ということで。
> とりあえず現状ではClickイベントは発生しませんね。

こういうこともあるんですね。
どうしようか再考中です。
もしよい案があれば教えていただきたく思います。
nanashiさん、ありがとうございました。

投稿時間:2003/08/12(Tue) 09:53
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^7: Validateイベントについて
下記のような方法ではだめでしょうか?

Option Explicit
Private ComPos As Boolean
Private Sub Command1_Click()
    MsgBox "Command1 がクリックされました"
    ComPos = False
End Sub
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If ComPos Then Command1.Value = True
End Sub
Private Sub Text1_Validate(Cancel As Boolean)
    Dim ret As Integer
    ret = MsgBox("テスト中", vbOKCancel)
    If ret = vbOK Then
        ComPos = True
    Else
        ComPos = False
    End If
    ' 又は If ret = vbOK Then Command1.Value = True
End Sub

投稿時間:2003/08/13(Wed) 19:31
投稿者名:みつお
Eメール:
URL :
タイトル:
Re^8: Validateイベントについて
> 下記のような方法ではだめでしょうか?
>

花ちゃんさん、お世話になります。
この方法、ばっちりでした。
おかげさまで無事解決することができました。
皆さん、本当にありがとうございました。