はじめまして、いい方法がないか教えて下さい。
よろしくお願いします。
あるAというテキストボックスのLOST_FOCUSにエラーチェックをかけて、
エラーになった場合、そのAにSETFOCUSするように記述したのですが、
次のフォーカス先のBというテキストボックスのLOST_FOCUSが発動されてしまいます。
これを避けるには、どういう記述が一番いいでしょうか。
AのLOST_FOCUSにVALIDATEを書いても同じ結果になりました。
どなたか、いいアドバイスがあれば教えて下さい。
>次のフォーカス先のBというテキストボックスのLOST_FOCUSが発動されてしまいます。
これって、ありえなくないですか??
LOST_FOCUSだから、イベントが発生するのって、フォーカスを失った時ですよね?
VB6なら
Private Sub Text1_Validate(Cancel As Boolean)
Cancel = True
End Sub
.Netなら
Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
e.Cancel = True
End Sub
って事かな?
テキストボックス「B」でもチェックが走ってしまうということでしょうか?
だとすると、チェック中を表すフラグを持つのはどうでしょう。
テキストボックス「A」のロストフォーカス時にフラグをTRUEにして、
チェック処理が終わった後にフラグをFalseにする。
チェック処理中のA.SetFocusでBのロストフォーカスが走っていると思われますので、
BのロストフォーカスではフラグがTRUEなら処理しないようにすれば良いと思います。
>エラーになった場合、そのAにSETFOCUSするように記述したのですが
これがいやな表現だよね?
SetFocus??? ん〜〜〜なぜここでセットフォーカスの文字が...
となってしまう。
エラーになった場合、Validateでイベントでキャンセルするように記述
って書くべきなんだと思うけど、
既に解決して、このスレ自体放置の予感がするけれどな
既に解決して、このスレ自体放置の予感がするけれどな
返事が遅くなりましてすいません。
いろいろ返答ありがとうございます。
環境はVB6で行っています。
VALIDATEはTABキーを使用した場合は、イベントをキャンセルすれば、
BというテキストボックスのLOST_FOCUSは発動しないのですが、
Enterキーを押すと発動してしまいます。
多分、あ〜さんが書いた内容通りの動きです。
フラグを作成する事も考えたのですが、画面にあるテキストボックス
全てにこれを記述するのは、抵抗がありました。
何かいい方法がありますでしょうか?
そーゆー事か・・・
ごめん。やっと理解できた。
でも、
>Enterキーを押すと発動してしまいます。
って、Enterでフォーカス動くの?
クラスとWithEventsを使って共通関数みたいにしてみるとかは?
以下例(動作保証無し)
Private objTxtCls() As ClsTxt
Private Sub Form_Load()
Dim lngFor As Long
Dim lngCount As Long
lngCount = 0
For lngFor = 0 To Me.Controls.Count - 1
If Left(Me.Controls(lngFor).Name, 4) = "Text" Then
lngCount = lngCount + 1
ReDim Preserve objTxtCls(1 To lngCount)
Set objTxtCls(lngCount) = New ClsTxt
Call objTxtCls(lngCount).GetBtnObj(Me.Controls(lngFor))
End If
Next
End Sub
Private Function chkTxt(objTxt As TextBox) As Boolean
Dim lngFor As Long
chkTxt = True
For lngFor = 1 To UBound(objTxtCls)
If objTxtCls(lngFor).objTxt = objTxt Then
If objTxtCls(lngFor).lngID = 0 Then
chkTxt = False
End If
End If
Next
End Function
Private Sub Text1_LostFocus()
If Not chkTxt(Text1) Then
Exit Sub
End If
If Text1.Text = "test" Then
Text1.SetFocus
End If
End Sub
Private Sub Text2_LostFocus()
If Not chkTxt(Text2) Then
Exit Sub
End If
'= 処理
End Sub
--- ClsTxt.cls -----------------------------------
Public WithEvents objTxt As TextBox
Public lngID As Long
Public Sub GetBtnObj(objBuf As TextBox)
Set objTxt = objBuf
lngID = 0
End Sub
Private Sub objTxt_GotFocus()
If objTxt.Parent.ActiveControl = objTxt Then
lngID = 1
End If
End Sub
Private Sub objTxt_LostFocus()
lngID = 0
End Sub
返事が遅くなりましてすいません。
id_rsa+さんへ、
Enterキーは、作動できるように作成しています。
(本当はしたくないのですが、仕様なのです。)
普通は作動しないと思います。
36NETさんへ、私にとって難しい内容でしたが、
理解して、少し手を加えましたが、この方法で行ってみます。
ありがとうございました。
解決しちゃったけど・・・
>Enterキーは、作動できるように作成しています。
多分、KeyDownかなんかのイベントにSetFocusのコード書いちゃってるんだよね。。
それよりもやっぱり、
Enterキーをフックして、TABキーに置き換え
+
Validateイベントでエラーチェック(キャンセル)
って流れが理想的だと思う・・・
id_rsa+さんへ
返答ありがとうございます。
>Enterキーをフックして、TABキーに置き換え
+
Validateイベントでエラーチェック(キャンセル)
とは、Enterキーを押された時に、いかにもTABキーが押されたように
置き換えるという意味でしょうか。
もし、私の言っている意味でしたら、ぜひそのやり方を教えていただけない
でしょうか。
よろしくお願いします。
http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips110.htm
↑
これで・・・
ツイート | ![]() |