Validateのバグ?


ケットシー  2006-10-06 17:48:14  No: 133580

Vb6 SP6  です。

画面にテキストとラベルを用意します。
テキストのValidateイベントでチェックをし、入力エラーがあれば
メッセージボックスを表示します。
また、ラベルをクリックすることで実行したり中止したりする
プログラムを作ろうと思います。

それで、テキストにフォーカスがある状態でラベルをクリックすると、
なぜかValidateイベントが発生してしまいます。
フォーカスは変わらないのになぜイベントが起きてしまうのでしょうか?
これを回避することはできるのでしょうか?


我龍院忠太  2006-10-07 01:03:51  No: 133581

ラベルにはクリックイベントがあるからね.....
フォーカスを移動せずにクリックイベントを起すのは難しいのでは。
あくまでも内部の話だが。

>これを回避することはできるのでしょうか?
Validateイベントの中で、GetCursorPosでカーソルの位置を読んで
その位置がラベルと重なっていたら、Validateイベントの中で
処理を握りつぶすとか。
ラベルとそのコンテナのMouseMoveを拾って、フラグを立てて、
Validateイベントの中でそのフラグを見て処理を中止するとか...
あまり美しい方法は無いかも。(^^;


matsu  2006-10-07 02:48:46  No: 133582

ラベルコントロールにはCausesValidationってないですね。
回避ではないですが、ラベルの代わりにピクチャーボックスではどうですか?
CausesValidation = Falseでイベントは発生しないです。


ケットシー  2006-10-07 07:46:39  No: 133583

ピクチャだとフォーカスが移動してしまいます。
できるだけラベルで作ろうと思います。

フォームとラベルのmousemoveイベントでそれぞれフラグを
立てて判断するしかないでしょうか?


Hoge  2006-10-07 10:14:50  No: 133584

プログラムの仕様がいまひとつみえないのですが
ラベルコントロールをクリックで処理するときに
テキストボックスの値は無関係ってことでしょうか?

希望するテキストボックスのValidateイベントが発生するのは
どのタイミングなのでしょうか?
ラベル1つテキストボックス1つじゃ、あなたの考える仕様では
永久にValidateイベントは発生しませんよね。

テキストボックスが複数あって、そこへ移動するときのみ
Validateイベントでチェックをして、入力に誤りがあればフォーカスを
移さない。でも、ラベルコントロールクリックで走る処理にはテキスト
ボックスの値は関係ない。。。

うーん。どんなプログラムなんだろう。

ここ
>テキストのValidateイベントでチェックをし、入力エラーがあれば
>メッセージボックスを表示します。
と、ここ
>また、ラベルをクリックすることで実行したり中止したりする
>プログラムを作ろうと思います。
のつながりをもうちょっと説明してもらえれば代替案がだせるかも。


ガッ  2006-10-07 11:58:33  No: 133585

んー…LostFocus…はちょっと気分が悪いか…


我龍院忠太  2006-10-07 19:04:26  No: 133586

>フォームとラベルのmousemoveイベントでそれぞれフラグを
>立てて判断するしかないでしょうか?
フォームの上にラベルが乗ってるなら、

Dim boolFlgVal As Boolean
Private Sub Form_MouseMove(Button As Integer, _
    Shift As Integer, X As Single, Y As Single)
    boolFlgVal = True
End Sub
Private Sub Label1_MouseMove(Button As Integer, _
    Shift As Integer, X As Single, Y As Single)
    boolFlgVal = False
End Sub
Private Sub Text1_Validate(Cancel As Boolean)
    If Not boolFlgVal Then Exit Sub
    MsgBox "ボタンが押されました", vbOKOnly, "Validate"
End Sub
これだけのことですね。

>うーん。どんなプログラムなんだろう。
テキストボックスが一つと、コマンドボタンが一つ
それとラベルが幾つか有って、ラベルをクリックするとメニューが
変わる、ボタンはテキストボックスの内容を処理する。
たとえば、テキストにはメールアドレスを入れ、ボタンはそれを
登録するものとする。

クライアントはテキストボックスにメルアドを入れかけたが、
気が変わってメニューを変えようと、ラベルをクリックするが、
当然Validateが起き上がって、メニューを変えられない。
そこでもう一度ラベルをクリックすればメニューが変わるのだけれど、
そんなことは知る由もないので、慌ててテキストをクリアーして
再度ラベルを叩くと、またValidateが起き上がる。
そこで仕方が無いので、入れたくも無い正しいメルアドをしぶしぶ
入力して再度ラベルを叩くと、今度はデーターが正しいので
「登録しますか?」などと余計なメッセージが出て、「いいえ」
を選択すると、テキストは自動的にクリアーされるが、
再度ラベルを叩くと.....  (^^;


ケットシー  2006-10-07 22:43:34  No: 133587

プログラムはマスタ画面です。

入力するテキストがいくつかあり、登録・中止・終了の機能を持たせたラベルを
張っています。コマンドボタンは基本的に使いません。
登録ラベルをクリックしたときは入力項目の再チェックを行いますが、
中止・終了ラベルをクリックした場合は何もチェックしません。

また、できるだけマウスを使わないようにするため、ファンクションキー
を押すことでラベルをクリックしたときと同じ動きをさせてます。
その際、ファンクションを押したときとマウスでクリックしたときで動きが
違うことがあり、今回のValidateの変な動きを知りました。

コマンドボタンを使わない理由も上記と同じで、できるだけキーボードのみで
入力できるようにするためです。


Hoge  2006-10-09 05:44:06  No: 133588

あなた考える仕様では
例えばテキストボックス1にデータを入力して
登録ラベルをクリックするとテキストボックス1のValidateイベントの
チェック処理は走らずに登録ラベルクリックのチェック処理だけ走ること
になりますが、そういう仕様でいいのでしょうか?

であれば、テキストボックス1のValidateイベントのチェック処理は
いらないんじゃないかと。


ケットシー  2006-10-09 21:38:41  No: 133589

たとえば1〜3までの値しか入力できないテキストがあった場合、
仮に4と入力して別のテキストに移動しようとすると
(もしくは登録ラベルをクリックしようとすると)
テキストのValidateイベントで
「1〜3までの値を入力してください」
とメッセージを出し、移動はキャンセルされます。

ただ、中止ラベル(画面をクリアする)・終了ラベル(画面を閉じる)
をクリックした場合はチェックはもちろん不要なので、
Validateイベントは起こしたくありません。

また、これとは別に、登録ラベルを押した後にもテキストの内容の
チェックをしています。
万が一に備え、Validate時と登録時で2回チェックを行っています。


Hoge  2006-10-10 09:42:19  No: 133590

>たとえば1〜3までの値しか入力できないテキストがあった場合、
>仮に4と入力して別のテキストに移動しようとすると
>「1〜3までの値を入力してください」
>とメッセージを出し、移動はキャンセルされます。
LostFocus時にチェックして無効な値だったらSetFocusでフォーカスを
戻してメッセージを出すとか

>(もしくは登録ラベルをクリックしようとすると)
ラベルクリック時にチェックして無効な値だったらメッセージを出すとか

どうしてもValidateイベントを発生させないようにしたいとなれば
マイクロソフトにかけあってみるとか


我龍院忠太  2006-10-10 22:46:35  No: 133591

>万が一に備え、Validate時と登録時で2回チェックを行っています。
一回で良いんじゃないかな、整合性のチェックを同じルーチンで
やってるなら意味は無いし、かえってバグの元だと思いますが。


大吉末吉  2006-10-10 23:35:44  No: 133592

ケットシー   さん  こんにちは。

本質的な方法じゃありませんが・・・
単純に、ラベルのEnabledをFalseにしてしまうとかじゃ駄目なんでしょうか?

#淡色表示がまずいなら、ラベルをコンテナに載せて、コンテナのEnabledをFalseに・・・


matsu  2006-10-11 01:46:06  No: 133593

我龍院忠太さんの言うように2回チェックする必要はないと思います。
登録時だけでいいならValidateイベントではチェックしないように
すればいいと思いますが。

Validateイベントを発生させない方法ですが、ユーザーコントロールに
ラベルを貼り付けてユーザーコントロールのCanGetFocusをFalseに設定すれば
Validateイベントは発生しませんでした。


matsu  2006-10-11 01:51:07  No: 133594

ユーザーコントロールの方法ですが、テストの方法が悪かったみたいでした。
Validateイベントは発生します。
すみませんでした。


ケットシー  2006-10-12 00:43:07  No: 133595

CanGetFocusをfalseにしてもClickイベントをはずしてもやはりValidate
は起こるみたいです・・・

とりあえずフォームのラベルのMouseMoveでフラグをたててやってみます
ありがとうでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加