LOST_FOCUSを発動させたくない

解決


XYZ  2005-07-05 06:21:27  No: 123251

はじめまして、いい方法がないか教えて下さい。
よろしくお願いします。
あるAというテキストボックスのLOST_FOCUSにエラーチェックをかけて、
エラーになった場合、そのAにSETFOCUSするように記述したのですが、
次のフォーカス先のBというテキストボックスのLOST_FOCUSが発動されてしまいます。
これを避けるには、どういう記述が一番いいでしょうか。
AのLOST_FOCUSにVALIDATEを書いても同じ結果になりました。
どなたか、いいアドバイスがあれば教えて下さい。


id_rsa+  2005-07-05 10:23:07  No: 123252

>次のフォーカス先の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

って事かな?


あ〜  2005-07-06 21:44:30  No: 123253

テキストボックス「B」でもチェックが走ってしまうということでしょうか?

だとすると、チェック中を表すフラグを持つのはどうでしょう。
テキストボックス「A」のロストフォーカス時にフラグをTRUEにして、
チェック処理が終わった後にフラグをFalseにする。

チェック処理中のA.SetFocusでBのロストフォーカスが走っていると思われますので、
BのロストフォーカスではフラグがTRUEなら処理しないようにすれば良いと思います。


いな  2005-07-07 00:39:56  No: 123254

>エラーになった場合、そのAにSETFOCUSするように記述したのですが

これがいやな表現だよね?
SetFocus??? ん〜〜〜なぜここでセットフォーカスの文字が...
となってしまう。

エラーになった場合、Validateでイベントでキャンセルするように記述
って書くべきなんだと思うけど、


いな  2005-07-07 00:41:16  No: 123255

既に解決して、このスレ自体放置の予感がするけれどな


いな  2005-07-07 00:41:17  No: 123256

既に解決して、このスレ自体放置の予感がするけれどな


XYZ  2005-07-07 07:27:32  No: 123257

返事が遅くなりましてすいません。
いろいろ返答ありがとうございます。
環境はVB6で行っています。
VALIDATEはTABキーを使用した場合は、イベントをキャンセルすれば、
BというテキストボックスのLOST_FOCUSは発動しないのですが、
Enterキーを押すと発動してしまいます。
多分、あ〜さんが書いた内容通りの動きです。
フラグを作成する事も考えたのですが、画面にあるテキストボックス
全てにこれを記述するのは、抵抗がありました。
何かいい方法がありますでしょうか?


id_rsa+  2005-07-07 08:46:45  No: 123258

そーゆー事か・・・
ごめん。やっと理解できた。

でも、
>Enterキーを押すと発動してしまいます。

って、Enterでフォーカス動くの?


36NET  2005-07-08 20:18:23  No: 123259

クラスと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


XYZ  2005-07-11 08:51:55  No: 123260

返事が遅くなりましてすいません。
id_rsa+さんへ、
Enterキーは、作動できるように作成しています。
(本当はしたくないのですが、仕様なのです。)
普通は作動しないと思います。
36NETさんへ、私にとって難しい内容でしたが、
理解して、少し手を加えましたが、この方法で行ってみます。
ありがとうございました。


id_rsa+  2005-07-11 12:12:02  No: 123261

解決しちゃったけど・・・

>Enterキーは、作動できるように作成しています。

多分、KeyDownかなんかのイベントにSetFocusのコード書いちゃってるんだよね。。

それよりもやっぱり、
Enterキーをフックして、TABキーに置き換え

Validateイベントでエラーチェック(キャンセル)

って流れが理想的だと思う・・・


XYZ  2005-07-12 07:19:04  No: 123262

id_rsa+さんへ
返答ありがとうございます。

>Enterキーをフックして、TABキーに置き換え
 +
 Validateイベントでエラーチェック(キャンセル)

とは、Enterキーを押された時に、いかにもTABキーが押されたように
置き換えるという意味でしょうか。
もし、私の言っている意味でしたら、ぜひそのやり方を教えていただけない
でしょうか。
よろしくお願いします。


id_rsa+  2005-07-12 07:35:20  No: 123263

http://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips110.htm

これで・・・


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




  


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