LOOP SEM SAIDA - COMO RESOLVER ESSA SITUACAO

USUARIO.EXCLUIDOS 08/06/2007 13:37:23
#220380
Galera opa.

Nesse form estou numa situação que simplesmente não tenho ideia o que eu posso fazer.

Começo a preencher tudo normal ,na tela eu tenho um limpa tela ,onde esse limpa tela fica presso.

Coloquei um loop em cada campo de data que não deixa eu sair em quanto a data não for preenchida ,mas como existem dois campos de datas e derepente quando preciso apagar e eu preenchi tudo menos a ultima data ,que ela esta branca a menssagem informe data aparece direto por causa do loop que nao deixa o cursor sair em quanto o campo data nao tiver nada.

Alguem sabe como posso abrir uma exessão para essas situações ?



Private Sub bot_limpar_Click()
'Funcao Limpar
TB_nom.Text = ""
ob_ets.Value = False
ob_spl.Value = False
ob_crc.Value = False


If Fu_limpa_data(tb_dt) = False Then
'Chamando a funcao limpa data tb_dt em module1.bas
MsgBox "TESTE"
Exit Sub
End If

tb_dv.PromptInclude = False
'Limpa o campo documento versao
tb_dv.Mask = "##/####"
tb_dv.Text = ""
tb_dv.PromptInclude = True

tb_vrs.PromptInclude = False
'Limpa o campo Versao
tb_vrs.Mask = "#.#"
tb_vrs.Text = ""
tb_vrs.PromptInclude = True


End Sub


Private Sub bot_voltar_Click()
Unload Me
End Sub



Private Sub tb_dt_KeyPress(KeyAscii As Integer)
'Funcao- Quando chegar no 10 digito ,mudara de campo
If tb_dt.SelStart = 9 Then
SendKeys "{TAB}"

End If

End Sub


Private Sub TextBox1_LostFocus()

If Fu_Checa_Data(TextBox1.Text) = False Then
TextBox1.SetFocus
End If



End Sub



Private Sub tb_dt_LostFocus()
' Se o tamanho do campo for igual a 0 ,ele retorna ate o preenchimento correto
If Len(tb_dt.ClipText) < 8 And Len(tb_dt.ClipText) = 0 Then
MsgBox "Informe a data.", vbExclamation, "ATENÇÃO"
tb_dt.SetFocus
Exit Sub
End If
If tb_dt.ClipText <> "" Then
' Se o valor digitado for diferente de branco ele entra na funcao FU_Checa
If Not Fu_Checa_Data(CStr(tb_dt.Text)) Then
MsgBox "DATA INVALIDA", vbExclamation, "ATENÇÃO"
'Limpa campo apos o retorno do foco
tb_dt.Text = "__/__/____"
tb_dt.SetFocus
Exit Sub
End If
End If
End Sub



Private Sub tb_dv_KeyPress(KeyAscii As Integer)
'Funcao- Quando chegar no 10 digito ,mudara de campo
If tb_dv.SelStart = 6 Then
SendKeys "{TAB}"

End If

End Sub



Private Sub tb_dv_LostFocus()
' Se o tamanho do campo menor que 6 ou igual a 0 ,ele retorna ate o preenchimento correto
If Len(tb_dv.ClipText) < 6 And Len(tb_dv.ClipText) = 0 Then
MsgBox "Informe a data.", vbExclamation, "ATENÇÃO"
tb_dv.SetFocus
Exit Sub
End If
If tb_dv.ClipText <> "" Then
' Se o valor digitado for diferente de branco ele entra na funcao FU_Checa
If Not Fu_Checa_Data_Documentacao(CStr(tb_dv.Text)) Then
MsgBox "DATA INVALIDA", vbExclamation, "ATENÇÃO"
tb_dv.Text = "__/____"
tb_dv.SetFocus
Exit Sub
End If
End If
End Sub




Private Sub TB_nom_Change()
'Verifica no campo nome ,que seja digitado somente letras com numeros
If IsNumeric(TB_nom) = True Then
MsgBox "VERIFIQUE INFORMAÇÃO DIGITADA"
TB_nom.Text = ""
TB_nom.SetFocus
Exit Sub
End If

'Data da maquina no rodapé
pd3d_status(1).Caption = Date

End Sub




Private Sub tb_vrs_KeyPress(KeyAscii As Integer)
'Permite somente número no campo
On Error Resume Next
'KeyAscii = SoNumeros(KeyAscii)
Call SU_Permite_Numero_versao(KeyAscii)


'Funcao- Quando chegar no 02 digito ,mudara de campo
If tb_vrs.SelStart = 2 Then
SendKeys "{TAB}"
End If


End Sub

ALMARTI 08/06/2007 14:36:13
#220398
tb_dv.Text = "__/____"


Isto vai sempre caracterizar uma data inválida. Troque por um maskedbox e coloque uma máscara. Uma outra dica. Calgumas validações (como a que vpoce precisa) não devem ser feitas em lost focus, ainda mais com loop. Voce pode nunca mais sair dai. O melhor a fazer é uma validação quando da insersão dos dados, ou seja, lá quando for salvar, so salve se a data não for nula, ou que voce precisar validar.
USUARIO.EXCLUIDOS 08/06/2007 14:57:55
#220403
Vou analisar e respondo.

Vouy ver se consigo.
USUARIO.EXCLUIDOS 08/06/2007 15:42:19
#220406
ALMARTI e analisei e realmente vc está certo nunca irá sair do loop.

Mas vc pode me explicar atraves de codigos.

Porqwe o novato aqui esta aprendendo do zero ,e muitas coisas da sintac do vb e complicado
ALMARTI 08/06/2007 16:33:42
#220416
Passe a expressaão

If Not Fu_Checa_Data(CStr(tb_dt.Text)) Then
MsgBox "DATA INVALIDA", vbExclamation, "ATENÇÃO"
'Limpa campo apos o retorno do foco
tb_dt.Text = "__/__/____"
tb_dt.SetFocus
Exit Sub
End If

Para o seu botão de salvar
USUARIO.EXCLUIDOS 08/06/2007 16:50:14
#220418
Botão de salvar não tenho ,mas tenho o botaão de mudança de tela pode ser ?
USUARIO.EXCLUIDOS 08/06/2007 17:33:24
#220429
Fera, pode fazer o seguinte

com um MaskEdBox (supondo que ele se chame mskData) com a propriedade Mask = "99/99/9999"

No evento Validate desse Mask

with MskData
if .Text <> "__/__/____" then 'Para o caso de vc precisar dele em branco
.Cancel = True
End If
End With

USUARIO.EXCLUIDOS 08/06/2007 18:25:51
#220436
Resposta escolhida
Amigao, muda a descrição do tópico por favor ... senão vc perde a visita de muitos usuários que poderiam te ajudar.
Já imaginou entrar em todos os tópicos para saber do que se trata ?

Honestamente vc faz isso ?

Ajuda que nós o ajudaremos mais e melhor ...

Quando mudar a descrição do tópico eu leio o problema e tento te ajudar.

Abraço.
USUARIO.EXCLUIDOS 09/06/2007 17:06:24
#220492
Up

De acordo com a opinião do nosso colega alterei o titulo para ajuda e compreenção de todos.
USUARIO.EXCLUIDOS 09/06/2007 22:41:38
#220515
Realmente sugiro que vc retire a validação de data do evento lostfocus ou validate e somente quando o usuário clicar OK vc verifica se as datas são válidas.

Caso queira mesmo continuar com seu processo (usuário pode não saber o que fazer caso queira simplesmente encerrar o programa estando com o cursor neste campo) vamos lá

Como vc andou estudando variáveis vamos por em prática uma de suas funcionalidades:

1º - Criamos uma variável mblnLimpar Boolean que possa ser vista pelo LimpaTela e pelo nosso Form.

2º - Dentro do LimpaTela a gente atribui mblnLimpar = True

3º - Dentro do nosso Evento que trava e não impede a gente coloca um if

Private Sub TextBox1_LostFocus()
if Not mblnLimpar = True then
If Fu_Checa_Data(TextBox1.Text) = False Then
TextBox1.SetFocus
End If

end if

'Voltamos o valor da variável para ela continuar verificando
mblnLimpar = False

End Sub

Tópico encerrado , respostas não são mais permitidas