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

投稿時間:2004/04/12(Mon) 13:40
投稿者名:サム
Eメール:
URL :
タイトル:
Validateイベントの回避
VB6.0です。
フォームにテキストボックスと保存、終了ボタンがあります。
Private Sub Text1_Validate(Cancel As Boolean)
の中で入力チェックを行いますが、
終了ボタンは、CausesValidationプロパティをFalseに設定して
ウインドウを閉じるようにしています。

ただText1が変更されているときは、
msgbox("変更されています。終了しますか?",vbOKCancel)
などでCancelが押された場合には、
上記のText1_Validate内での入力チェックを行いたいのですが
うまくいきません。
Text1にフォーカスを戻すだけでもいいのですが、
前にどのコントロールにいたのかがわかりません。
どのようにすればよいのでしょうか。

投稿時間:2004/04/16(Fri) 10:50
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re: Validateイベントの回避
日本語も微妙に変だし、どううまくいかないか全然分かりません。
> 終了ボタンは、CausesValidationプロパティをFalseに設定して
> …
> 上記のText1_Validate内での入力チェックを行いたいのですが
CausesValidation プロパティを True に戻せば?
…別に Text1_Validate を関数として直接呼んでもいいわけだし…
> Text1にフォーカスを戻すだけでもいいのですが、
> 前にどのコントロールにいたのかがわかりません。
フォーカス移動で必要ですか?必要ないと思いますけど、必要なら
フォーカス移動するたびにそのコントロールを覚えておくようにすれば
できると思います。

投稿時間:2004/04/16(Fri) 11:08
投稿者名:GOD
URL :
タイトル:
Re^2: Validateイベントの回避
Text1_Validateを使用しているために処理が破綻しているような気がします。
データの整合性チェックをText1_Validateで行わずに保存関数内でデータの整合性チェックと保存を行うように
すればすっきりするのではないでしょうか。
終了する時にも"変更されています。保存して終了しますか。"みたいなメッセージに切り替えてYes/No/Cancel
を表示させてYesなら保存関数を呼び出し、Noならそのまま終了、キャンセルなら何もしないでいいと思います
よ。

投稿時間:2004/04/16(Fri) 11:54
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: Validateイベントの回避
すみません。質問の意味が、あまり理解できませんでした。
タイトルにあるように、「Validateイベントの発生を回避させたい」のでしょうか。
それとも、
> 上記のText1_Validate内での入力チェックを行いたいのですが
にあるように、「Validateイベントのチェックを行いたい」のでしょうか?


> 前にどのコントロールにいたのかがわかりません。
直前にいたコントロールのValidateイベントを発生させるには、
FormオブジェクトのValidateControlsメソッドを呼び出せばOKです。

投稿時間:2004/04/19(Mon) 10:02
投稿者名:サム
Eメール:
URL :
タイトル:
Re: Validateイベントの回避
みなさん、ありがとうございます。
返信がなかったので諦めていたのですが、意味がわからなかったのですね。
文章ヘタですみません。

やりたいことは、
・Validateイベントで入力チェック
・終了ボタンだけは、CausesValidation=Falseにして回避
・「終了しますか?OK/Cancel」などのメッセージを表示する。

なのですが、Cancelボタンが押されると入力チェックが回避されているため
入力エラーが放置されてしまいます。
これをどうすればいいかという質問でした。(まだわかりにくいかと思いますが)
対策として、元のTextBoxにフォーカスを戻せば
また入力チェックが行われるのでいいかと思ったのですが。

GODさんの言われるとおり、Validateでチェックすることに
無理があるかもしれません。
保存前にチェックの方向で、もう一度処理を見直してみます。
ありがとうございました。

投稿時間:2004/04/19(Mon) 14:33
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^2: Validateイベントの回避
> なのですが、Cancelボタンが押されると入力チェックが回避されているため
> 入力エラーが放置されてしまいます。
> これをどうすればいいかという質問でした。(まだわかりにくいかと思いますが)

そういう時には、『ValidateControlsメソッド』を呼び出せば、
入力エラーチェック処理(Validateイベント)を呼び出す事ができます。


……という意味の回答を(No.8699に)書いたつもりだったのですが、
すみません。あの回答では、ちょっと分かりにくかったかもしれませんね。(^^;

投稿時間:2004/04/19(Mon) 16:03
投稿者名:サム
Eメール:
URL :
タイトル:
Re^3: Validateイベントの回避
> ……という意味の回答を(No.8699に)書いたつもりだったのですが、
> すみません。あの回答では、ちょっと分かりにくかったかもしれませんね。(^^;
>
いえいえ、意味は分かったのですが、使い方がいまいちだったので。

Private Sub Command1_Click()  '終了ボタン
Res = MsgBox("データが更新されています。終了してよろしいですか?", vbOKCancel)
If (Rei = vbOK) Then
  Unload Me
Else
  Form1.ValidateControls
End If
としておくと、確かにValidateイベントが発生するのですが、

Private Sub Text1_Validate(Cancel As Boolean)
  If (CInt(Text1.Text) < -30) Or (CInt(Text1.Text) > 30) Then
    MsgBox ("ダメ!")
    Cancel = True
  End If
End Sub
とすると、Cancel後また
Form1.ValidateControls
の行に復帰し、今度はイベントが処理済みだからか
「プロパティの値が不正です。」のエラーになってしまいます。
Command1_Click()内に
On Error Resume Nextを書いておけば回避できるのですが、
こんな使い方でよいのでしょうか。

投稿時間:2004/04/19(Mon) 18:18
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: Validateイベントの回避
> の行に復帰し、今度はイベントが処理済みだからか
> 「プロパティの値が不正です。」のエラーになってしまいます。
> Command1_Click()内に
> On Error Resume Nextを書いておけば回避できるのですが、
> こんな使い方でよいのでしょうか。

OKですよ。Validateイベントの処理で検証が失敗した(引数にTrueが指定された)場合には、
フォームのValidateControlsメソッド実行時に、エラーが返される仕様となっています。


余談ですが、このVB6の「データの検証のために、エラートラップが必要」という(奇妙な)仕様は、
VB.NETでは廃止されました。VB.NET(のValidateメソッド)では、エラーではなくTrue/Falseを返します。

投稿時間:2004/04/19(Mon) 18:40
投稿者名:サム
Eメール:
URL :
タイトル:
Re^5: Validateイベントの回避
> 余談ですが、このVB6の「データの検証のために、エラートラップが必要」という(奇妙な)仕様は、
> VB.NETでは廃止されました。VB.NET(のValidateメソッド)では、エラーではなくTrue/Falseを返します。
>
Validateイベントでチェックする項目と、保存時にチェックする項目を
もう一度整理して、なんとかうまくできそうです。
エラートラップは美しくないですが、仕様ならばしようがありません。(^^;
ありがとうございました。