有三个输入日期的文本框,在每一个失去焦点的时候(lostFocus)判断它的日期是否大于前面的,小于后面的,如果判断不符合,就把焦点设到那个文本框上.
我在多的时候让他分别和他前面的比较,与后面的比较,但是出现了死循环, 如三个文本框1,2,3依此输入8.5 ,8.6,8.7,然后我在把中间那个日期改为8.8,这时,2号和3号会不断因为触发lostFocus事件而发生死循环。
    寻求一个合理的实现验证三个文本框输入的日期从小到大,即1号日起<2号<3号日期

解决方案 »

  1.   

    最好不要在失去焦點時再給本控件加焦點
    你可以入在Text1_Change或是Text1_KeyDown來判斷
      

  2.   

    '在自己的丢失焦点事件中,在获得自己的焦点 就不会死循环了
    Private Sub Text1_LostFocus()
        If Text1.Text > Text2.Text Then
            Text1.SetFocus
        End If
    End Sub
    Private Sub Text2_LostFocus()
        If Text1.Text > Text2.Text Or Text2.Text < Text2.Text Then
            Text2.SetFocus
        End If
    End Sub
    Private Sub Text2_LostFocus()
        If Text2.Text < Text2.Text Then
            Text3.SetFocus
        End If
    End Sub
      

  3.   

    事件搞錯了,樓主。Validate事件
    在焦点转换到一个(第二个)控件之前发生,此时该控件的 CausesValidation 属性值设置为True。语法
    Private Sub object_Validate(KeepFocus As Boolean)Validate事件语法包含下面几部分:部分       描述 
    object     一个对象表达式,其值为“应用于”列表中的一个对象。 
    KeepFocus  确定控件是否失去焦点的值。KeepFocus设置为True时,控件保持焦点。 
    说明
    Validate 事件和CausesValidation 属性协同工怍,防止控件失去焦点直到满足确定的准则。重点   只有在即将获得焦点的控件的CausesValidation属性值设置为True时,Validate事件才发生。
      

  4.   

    用 onchange 
    是不是好点?
      

  5.   

    在大家的提示下,我解决了上述问题,主要是用Text的Validate函数代替lostFocus,利用Validate参数中的Cancel= true,可以在别的控件得到焦点前取消失去焦点,就不会触发别的控件的事件了。
    现在把我侧使用的代码贴出来共享以下:
         Private Sub Text1_Validate(Cancel As Boolean)
        If Text1.Text = "" Or Text2.Text = "" Then
            Exit Sub
        End If    If CDate(Text1.Text) > CDate(Text2.Text) Then
            MsgBox ("The First")
            Cancel = True
        End IfEnd SubPrivate Sub Text2_Validate(Cancel As Boolean)
    If Text1.Text = "" Or Text2.Text = "" Then
            Exit Sub
        End If    If CDate(Text1.Text) > CDate(Text2.Text) Then
            MsgBox ("The Second")
    '        Text2.SetFocus
            Cancel = True
        End If
        
        If Text3.Text = "" Then
            Exit Sub
        End If
        
        If CDate(Text2.Text) > CDate(Text3.Text) Then
            MsgBox ("The Second > The Third")
    '        Text2.SetFocus
            Cancel = True
        End If
    End Sub
    Private Sub Text3_Validate(Cancel As Boolean)
        If Text2.Text = "" Or Text3.Text = "" Then
            Exit Sub
        End If
         If CDate(Text2.Text) > CDate(Text3.Text) Then
            MsgBox ("The Second > The Third")
    '        Text2.SetFocus
            Cancel = True
        End If
    End Sub