MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]Combinar AfterUpdate com KeyPress

    Compartilhe

    clustermage
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3
    Registrado : 21/09/2012

    [Resolvido]Combinar AfterUpdate com KeyPress

    Mensagem  clustermage em Qui 05 Out 2017, 06:29

    Olá senhores, espero que possam me ajudar. Eu estou começando a aprender então por enquanto coisas simples são um verdadeiro desafio para mim.

    A minha duvida é se tem como combinar essas duas ações, AfterUpdate e KeyPress numa mesma Caixa de Texto.
    Eu tentei mas acaba criando um loop.
    Caixa_1 [Caixa de combinação - a tabela não é fixa ela pode ser alterada, quando o registro é salvo o novo nome é adicionado à tabela]
    Caixa_2 [Caixa simples]

    O que eu queria fazer era o seguinte:
    Se a Caixa_1 estiver em branco ou for apagada e em seguida for pressionado Enter (vbKeyReturn), aparece uma mensagem de alerta avisando que está em branco.
    Se a Caixa_1 estiver em branco ou for apagada e em seguida perder o foco (LostFocus), não deve acontecer nada, inclusive o foco deve acompanhar.
    Se a Caixa_1 for escrita ou alterada e em seguida for pressionado Enter (vbKeyReturn), muda o foco para a Caixa_2
    Se a Caixa_1 for selecionado um nome diferente ou o mesmo muda o foco para Caixa_2
    A mesma coisa ocorreria na Caixa_2, só que ao invés de mudar o foco quando fosse escrito algo, ele verificaria se as duas caixas estão escritas e então perguntaria se quer salvar vbYesNo.
    Um outro detalhe, ele só permitiria salvar se ambas as Caixas estiverem escritas.

    O código que eu tentei fazer ficou assim.

    Private Sub Caixa_1_KeyPress(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
    If IsNull(Me.Caixa_1) Or Me.Caixa_1 = "" Then
    MsgBox "Escreva um texto"
    Me.Caixa_1.SetFocus
    Else
    Me.Caixa_2.SetFocus
    End If
    End If
    End Sub

    Private Sub Caixa_1_AfterUpdate()
    If IsNull(Me.Caixa_1) Or Me.Caixa_1.text = "" Then
    MsgBox "Escreva um texto"
    Me.Caixa_1.SetFocus
    Else
    Me.Caixa_2.SetFocus
    End If
    End Sub

    Private Sub Caixa_2_KeyPress(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
    If IsNull(Me.Caixa_2) Or Me.Caixa_2 = "" Then
    MsgBox "Escreva um texto"
    Me.Caixa_2.SetFocus
    Else
    If IsNull(Me.Caixa_1) Or Me.Caixa_1.text = "" Then
    MsgBox "Caixa_1 e Caixa_2 Escritos para Salvar"
    Me.Caixa_1.SetFocus
    Else
    MsgBox "Mensagem para salvar"
    End If
    End If
    End If
    End Sub

    Private Sub Caixa_2_AfterUpdate()
    If IsNull(Me.Caixa_2) Or Me.Caixa_2.text = "" Then
    MsgBox "Escreva um texto"
    Me.Caixa_2.SetFocus
    Else
    If IsNull(Me.Caixa_1) Or Me.Caixa_1.text = "" Then
    MsgBox "Caixa_1 e Caixa_2 Escritos para Salvar"
    Me.Caixa_1.SetFocus
    Else
    MsgBox "Mensagem para salvar"
    End If
    End If
    End Sub

    O que que acontece, quando é feita alguma alteração apertando Enter ele executa tanto o AfterUpdate como o KeyPress, inclusive estendendo a ação para a próxima sub.
    Em um form novo se na Caixa_1 for escrito um texto e apertar Enter, o que se esperaria é que o foco parasse em Caixa_2, mas as vezes acontece de parecer que Enter foi acionado também em Caixa_2, como essa está em branco aparece a mensagem para escrever um texto. Ou se for o caso de Caixa_2 contiver um texto ai a ação é a segunda mensagem [que seria o comando para salvar].

    Mais uma vez agradeço bastante quem puder ajudar nessa duvida =D.
    avatar
    CassioFabre
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 524
    Registrado : 18/01/2013

    Re: [Resolvido]Combinar AfterUpdate com KeyPress

    Mensagem  CassioFabre em Qui 05 Out 2017, 13:30

    Bom dia,

    Por padrão a tecla Enter em campos texto de formulários tem a função de mudar o foco para o próximo campo da tabulação. Isso pode ser alterado na aba "Outra" das propriedades de cada caixa de texto. Vou considerar aqui que você está usando a função padrão da tecla.

    Neste caso, não faz muito sentido voce interceptar a tecla [enter] e não a tecla [tab], por exemplo, porque ambas vão funcionar exatamente da mesma maneira, como descrito acima. O que EU faria é colocar todo o código no AfterUpdate do campo2: caso o campo1 seja preenchido, perguntar se quer salvar, caso não, informar que o campo1 não está preenchido. Então, no evento AfterUpdate do campo2 eu colocaria:
    Código:
    If IsNull(campo1) = False Then
        If Msgbox("Deseja salvar o registro?", vbQuestion + vbYesNO, "Salvar?") = vbYes Then
            'procedimento de gravação do registro
        End if
    End if

    Eu não colocaria nenhuma mensagem pro usuário caso o campo1 esteja vazio, é chato demais toda hora ficar aparecendo mensagem informando coisas que nao vão fazer diferença naquele exato momento. Deixa pra informar pro usuário quando ele for gravar o registro.

    Abraço.


    .................................................................................
    Só não tem código pra morte!

    clustermage
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3
    Registrado : 21/09/2012

    Re: [Resolvido]Combinar AfterUpdate com KeyPress

    Mensagem  clustermage em Qui 05 Out 2017, 22:27

    Agradeço por ter respondido =D.

    Como eu sou novo nisso, provavelmente eu não estou explicando bem o que eu quero fazer.

    A minha duvida é que quero que em uma caixa de texto (essa é a caixa de combinação), após digitar e apertar enter ou selecionar um dos nomes carregue alguns dados no formulário (como se fosse uma pesquisa - isso tá ok), após isso o foco muda para a segunda caixa de texto, que deve fazer algo parecido, a diferença é que essa caixa não é de combinação. Dai coloca-se um dado aperta enter novamente e carrega mais alguns dados e pula para as próximas caixas.

    Então o que tentei não dá muito certo, eu quero que essas duas caixas mostrem uma mensagem de "erro", seria mais um aviso informando que a caixa não pode ficar em branco, e essa mensagem só aparecerá se a caixa em branco estiver com o foco ativo e a pessoa apertar Enter. Se a caixa estiver em branco e por algum motivo a pessoa mudar o foco, saindo dela e clicando em outro campo do formulário, a mensagem não irá aparecer.


    Se eu faço o KeyPress, quando o foco muda da primeira para a segunda caixa da um erro parecendo que a pessoa apertou Enter novamente, tipo um loop na action da Caixa_2_KeyPress.
    Na primeira caixa, se eu coloco o afterupdate para fazer funcionar a ação de escolher um nome da lista vai certinho, mas se escrever e apertar Enter ele faz as duas ações, do keypress e do afterupdate.

    Eu estou todo embananado nesse negocio e certamente fazendo tudo errado  Sad  Sad  Sad .

    Se tiver como fazer isso será maravilhoso aprender, as dicas aqui são muito boas, aos poucos a gente evolui aqui.
    Obrigado pela paciência galera.
    avatar
    CassioFabre
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 524
    Registrado : 18/01/2013

    Re: [Resolvido]Combinar AfterUpdate com KeyPress

    Mensagem  CassioFabre em Sex 06 Out 2017, 12:17

    Bom dia,

    Então amigo, nesse caso, não se foque na tecla que dispara o evento. Se foque no evento. Tanto as textbox quanto as combobox tem diversos eventos tais como "Após atualizar", "Ao sair" etc etc... No seu caso voce poderia usar basicamente esses dois eventos que citei. Mas entenda a diferença: O evento "Ao sair" é disparado toda vez que voce sai do campo (obviamente) independente do que voce tenha feito nele, ou seja, passou pelo campo dando 'tab' por exemplo, ele é disparado. O evento "Após atualizar" só é disparado quando há alguma alteração no campo, ou seja, só quando voce muda algum dado contido nele. Fica a seu critério.

    Porém, reitero o que eu disse acima, será extremamente desgastante ao usuário esse tipo de situação. É muito mais interessante voce fazer toda essa verificação no clique do botão salvar. Acredito que seja como (quase) todo mundo faz. Mas se de todo modo é isso que voce quer mesmo, no evento ao sair de ambos os campos coloque:
    Código:
    If IsNull(nomeCampo) = true Then
        msgbox "Este está vazio, isso impossibilitará a gravação do registro!", vbExclamation, "Aviso"
    End if

    Substitua "nomeCampo" pelo nome do campo que estiver usando o "ao sair".

    Abraço.


    .................................................................................
    Só não tem código pra morte!

    clustermage
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3
    Registrado : 21/09/2012

    Re: [Resolvido]Combinar AfterUpdate com KeyPress

    Mensagem  clustermage em Sex 06 Out 2017, 14:00

    Rapaz, obrigado =D
    Agora entendi e funcionou certinho.

      Data/hora atual: Sab 18 Nov 2017, 08:23