Vb6 SP6 です。
画面にテキストとラベルを用意します。
テキストのValidateイベントでチェックをし、入力エラーがあれば
メッセージボックスを表示します。
また、ラベルをクリックすることで実行したり中止したりする
プログラムを作ろうと思います。
それで、テキストにフォーカスがある状態でラベルをクリックすると、
なぜかValidateイベントが発生してしまいます。
フォーカスは変わらないのになぜイベントが起きてしまうのでしょうか?
これを回避することはできるのでしょうか?
ラベルにはクリックイベントがあるからね.....
フォーカスを移動せずにクリックイベントを起すのは難しいのでは。
あくまでも内部の話だが。
>これを回避することはできるのでしょうか?
Validateイベントの中で、GetCursorPosでカーソルの位置を読んで
その位置がラベルと重なっていたら、Validateイベントの中で
処理を握りつぶすとか。
ラベルとそのコンテナのMouseMoveを拾って、フラグを立てて、
Validateイベントの中でそのフラグを見て処理を中止するとか...
あまり美しい方法は無いかも。(^^;
ラベルコントロールにはCausesValidationってないですね。
回避ではないですが、ラベルの代わりにピクチャーボックスではどうですか?
CausesValidation = Falseでイベントは発生しないです。
ピクチャだとフォーカスが移動してしまいます。
できるだけラベルで作ろうと思います。
フォームとラベルのmousemoveイベントでそれぞれフラグを
立てて判断するしかないでしょうか?
プログラムの仕様がいまひとつみえないのですが
ラベルコントロールをクリックで処理するときに
テキストボックスの値は無関係ってことでしょうか?
希望するテキストボックスのValidateイベントが発生するのは
どのタイミングなのでしょうか?
ラベル1つテキストボックス1つじゃ、あなたの考える仕様では
永久にValidateイベントは発生しませんよね。
テキストボックスが複数あって、そこへ移動するときのみ
Validateイベントでチェックをして、入力に誤りがあればフォーカスを
移さない。でも、ラベルコントロールクリックで走る処理にはテキスト
ボックスの値は関係ない。。。
うーん。どんなプログラムなんだろう。
ここ
>テキストのValidateイベントでチェックをし、入力エラーがあれば
>メッセージボックスを表示します。
と、ここ
>また、ラベルをクリックすることで実行したり中止したりする
>プログラムを作ろうと思います。
のつながりをもうちょっと説明してもらえれば代替案がだせるかも。
んー…LostFocus…はちょっと気分が悪いか…
>フォームとラベルの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が起き上がる。
そこで仕方が無いので、入れたくも無い正しいメルアドをしぶしぶ
入力して再度ラベルを叩くと、今度はデーターが正しいので
「登録しますか?」などと余計なメッセージが出て、「いいえ」
を選択すると、テキストは自動的にクリアーされるが、
再度ラベルを叩くと..... (^^;
プログラムはマスタ画面です。
入力するテキストがいくつかあり、登録・中止・終了の機能を持たせたラベルを
張っています。コマンドボタンは基本的に使いません。
登録ラベルをクリックしたときは入力項目の再チェックを行いますが、
中止・終了ラベルをクリックした場合は何もチェックしません。
また、できるだけマウスを使わないようにするため、ファンクションキー
を押すことでラベルをクリックしたときと同じ動きをさせてます。
その際、ファンクションを押したときとマウスでクリックしたときで動きが
違うことがあり、今回のValidateの変な動きを知りました。
コマンドボタンを使わない理由も上記と同じで、できるだけキーボードのみで
入力できるようにするためです。
あなた考える仕様では
例えばテキストボックス1にデータを入力して
登録ラベルをクリックするとテキストボックス1のValidateイベントの
チェック処理は走らずに登録ラベルクリックのチェック処理だけ走ること
になりますが、そういう仕様でいいのでしょうか?
であれば、テキストボックス1のValidateイベントのチェック処理は
いらないんじゃないかと。
たとえば1〜3までの値しか入力できないテキストがあった場合、
仮に4と入力して別のテキストに移動しようとすると
(もしくは登録ラベルをクリックしようとすると)
テキストのValidateイベントで
「1〜3までの値を入力してください」
とメッセージを出し、移動はキャンセルされます。
ただ、中止ラベル(画面をクリアする)・終了ラベル(画面を閉じる)
をクリックした場合はチェックはもちろん不要なので、
Validateイベントは起こしたくありません。
また、これとは別に、登録ラベルを押した後にもテキストの内容の
チェックをしています。
万が一に備え、Validate時と登録時で2回チェックを行っています。
>たとえば1〜3までの値しか入力できないテキストがあった場合、
>仮に4と入力して別のテキストに移動しようとすると
>「1〜3までの値を入力してください」
>とメッセージを出し、移動はキャンセルされます。
LostFocus時にチェックして無効な値だったらSetFocusでフォーカスを
戻してメッセージを出すとか
>(もしくは登録ラベルをクリックしようとすると)
ラベルクリック時にチェックして無効な値だったらメッセージを出すとか
どうしてもValidateイベントを発生させないようにしたいとなれば
マイクロソフトにかけあってみるとか
>万が一に備え、Validate時と登録時で2回チェックを行っています。
一回で良いんじゃないかな、整合性のチェックを同じルーチンで
やってるなら意味は無いし、かえってバグの元だと思いますが。
ケットシー さん こんにちは。
本質的な方法じゃありませんが・・・
単純に、ラベルのEnabledをFalseにしてしまうとかじゃ駄目なんでしょうか?
#淡色表示がまずいなら、ラベルをコンテナに載せて、コンテナのEnabledをFalseに・・・
我龍院忠太さんの言うように2回チェックする必要はないと思います。
登録時だけでいいならValidateイベントではチェックしないように
すればいいと思いますが。
Validateイベントを発生させない方法ですが、ユーザーコントロールに
ラベルを貼り付けてユーザーコントロールのCanGetFocusをFalseに設定すれば
Validateイベントは発生しませんでした。
ユーザーコントロールの方法ですが、テストの方法が悪かったみたいでした。
Validateイベントは発生します。
すみませんでした。
CanGetFocusをfalseにしてもClickイベントをはずしてもやはりValidate
は起こるみたいです・・・
とりあえずフォームのラベルのMouseMoveでフラグをたててやってみます
ありがとうでした。
ツイート | ![]() |