Controles automaticos

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Controles automaticos

Mensagem por Paulo_CPV »

Boa noite!

Gostaria de saber dos colegas do grupo se é possível fazer uma função para quando eu digitar num controle TextBox no termino do mesmo eu não precisasse pressionar o ENTER ou TAB para ir para o próximo controle. Será que é realmente possível fazer isto na Minigui Extend 2.3.2?

Desde já agradeço a atenção dos colegas e espero que alguém possa me dar uma ajuda sobre o assunto.

Abraços,

Paulo - Jacareí/SP
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Controles automaticos

Mensagem por Toledo »

Amigo, segue abaixo um exemplo de como simular o SET CONFIRM OFF em um TextBox:

Código: Selecionar todos

#include "minigui.ch"

Function Main()

SET NAVIGATION EXTENDED

   DEFINE WINDOW Form_1 ;
      AT 0,0 ;
      WIDTH 400 HEIGHT 300 ;
      TITLE 'Simulando SET CONFIRM OFF em TextBox' ;
      MAIN

      DEFINE LABEL Label_1
        ROW	10
        COL	10
        WIDTH	60
        VALUE 'Campo 1:'
      END LABEL

      DEFINE TEXTBOX Text_1
        ROW	10
        COL	70
        WIDTH	180
        MAXLENGTH 20
        ON CHANGE {|| SetConfOFF(This.Value) }
      END TEXTBOX

      DEFINE LABEL Label_2
        ROW	38
        COL	10
        WIDTH	60
        VALUE 'Campo 2:'
      END LABEL

      DEFINE TEXTBOX Text_2
        ROW	38
        COL	70
        WIDTH	180
        MAXLENGTH 10
        ON CHANGE {|| SetConfOFF(This.Value) }
      END TEXTBOX

      DEFINE LABEL Label_3
        ROW	66
        COL	10
        WIDTH	60
        VALUE 'Campo 3:'
      END LABEL

      DEFINE TEXTBOX Text_3
        ROW	66
        COL	70
        WIDTH	180
        INPUTMASK "999.999.999-99"
        ON CHANGE {|| SetConfOFF(This.Value) }
      END TEXTBOX

   END WINDOW

   Form_1.Center
   Form_1.Activate

Return Nil

************************************
FUNCTION SetConfOFF( cCampo )
LOCAL cFrmName   := thiswindow.name
LOCAL cCmpName   := this.focusedcontrol
LOCAL nDigitado  := len(alltrim( cCampo ))
LOCAL x := GetControlIndex(cCmpName,cFrmName)
LOCAL nMaxLength := _HMG_aControlRangeMax[x]
LOCAL nInputMask := Len(_HMG_aControlInputMask[x])
IF nInputMask > 0
 nMaxLength := nInputMask
ENDIF
IF nDigitado == nMaxLength
 InsertTab()
ENDIF
RETURN Nil
ATENÇÃO: para que a função SetConfOFF() funcione corretamente, você tem que informar no TextBox o parâmetro MAXLENGTH ou INPUTMASK. E é claro, chamar a função SetConfOFF(This.Value) no parâmetro ON CHANGE.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Controles automaticos

Mensagem por Pablo César »

Muito bem elaborado, Toledo.
Fiz baseado na sua indicação para trabalhar em HMG também:

Código: Selecionar todos

#include <hmg.ch>

Function Main()
SET NAVIGATION EXTENDED

DEFINE WINDOW Form_1 ;
    AT 0,0 ;
    WIDTH 400 HEIGHT 300 ;
    TITLE 'Simulando SET CONFIRM OFF em TextBox' ;
    MAIN

    DEFINE LABEL Label_1
    	ROW   10
        COL   10
        WIDTH   60
        VALUE 'Campo 1:'
    END LABEL

    DEFINE TEXTBOX Text_1
        ROW   10
        COL   70
        WIDTH   180
        MAXLENGTH 20
        ON CHANGE {|| SetConfOFF(This.Value,20,0) }
    END TEXTBOX

    DEFINE LABEL Label_2
        ROW   38
        COL   10
        WIDTH   60
        VALUE 'Campo 2:'
    END LABEL

    DEFINE TEXTBOX Text_2
        ROW   38
        COL   70
        WIDTH   180
        MAXLENGTH 10
        ON CHANGE {|| SetConfOFF(This.Value,10,0) }
    END TEXTBOX

    DEFINE LABEL Label_3
        ROW   66
        COL   10
        WIDTH   60
        VALUE 'Campo 3:'
    END LABEL

    DEFINE TEXTBOX Text_3
        ROW   66
        COL   70
        WIDTH   180
        INPUTMASK "999.999.999-99"
        ON CHANGE {|| SetConfOFF(This.Value,0,Len("999.999.999-99")) }
    END TEXTBOX

END WINDOW
Form_1.Center
Form_1.Activate
Return Nil

Function SetConfOFF( cCampo, nMaxLength, nInputMask )
Local nDigitado  := Len(AllTrim( cCampo ))

If nInputMask > 0
   nMaxLength := nInputMask
Endif
If nDigitado == nMaxLength
   InsertTab()
Endif
Return Nil
Fiz deste jeito porque HMG não consegue ler as propriedades: MaxLength e InputMask. Ai o jeito é forçar com parâmetros.

Valeu !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Controles automaticos

Mensagem por Paulo_CPV »

Boa tarde!

Caros Toledo e Pablo obrigado pela suas dicas. Fiz o que vocês me mostraram aqui deu certo sem problemas, mas somente para campos que são tipo alfanuméricos os de tipo Data, na minha primeira tentativa deu erro e depois fiz uma alteração na seguinte linha:

Código: Selecionar todos

LOCAL nDigitado  := LEN( ALLTRIM( cCampo ) )
Para:

Código: Selecionar todos

LOCAL nDigitado  := LEN( IF( VALTYPE( cCampo ) = "D" , ALLTRIM( DTOC( cCampo ) ) , ALLTRIM( cCampo ) ) )
Mas depois desta alteração eu não consigo digitar o ano pois ele vai direto para o próximo TEXTBOX quando digito o mês. Será que tem como contornar isto?

Abraços,

Paulo - Jacareí/SP
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Controles automaticos

Mensagem por Pablo César »

Oi Paulo, tente substituindo com:

Código: Selecionar todos

Local nDigitado := If( ValType( cCampo ) = "D" , Form_1.Text_2.CaretPos , Len( AllTrim( cCampo ) ) )
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Controles automaticos

Mensagem por Pablo César »

Aliás, fiz desta forma mais genérica. Observe que não é mais necessário passar o cCampo como argumento na função SetConfOFF:

Para HMG:

Código: Selecionar todos

#include <hmg.ch>

Function Main()
SET NAVIGATION EXTENDED
SET DATE TO BRITISH
SET CENTURY ON

DEFINE WINDOW Form_1 ;
    AT 0,0 ;
    WIDTH 400 HEIGHT 150 ;
    TITLE 'Simulating SET CONFIRM OFF at TextBox' ;
    MAIN

    DEFINE LABEL Label_1
    	ROW   20
        COL   30
        WIDTH 160
        VALUE 'Field 1 (Length 10):'
		FONTBOLD .T.
    END LABEL

    DEFINE TEXTBOX Text_1
        ROW       20
        COL       160
        WIDTH     180
        MAXLENGTH 10
        ON CHANGE {|| SetConfOFF(10,0) }
    END TEXTBOX

    DEFINE LABEL Label_2
        ROW    48
        COL    30
        WIDTH  160
        VALUE 'Field 2 (Length 10):'
		FONTBOLD .T.
    END LABEL

    DEFINE TEXTBOX Text_2
        ROW   48
        COL   160
        WIDTH   180
        MAXLENGTH 10
		DATE .T.
        ON CHANGE {|| SetConfOFF(10,0) }
    END TEXTBOX

    DEFINE LABEL Label_3
        ROW   76
        COL   30
        WIDTH 160
        VALUE 'Field 3 (Length 14):'
		FONTBOLD .T.
    END LABEL

    DEFINE TEXTBOX Text_3
        ROW     76
        COL     160
        WIDTH   180
        INPUTMASK "999.999.999-99"
        ON CHANGE {|| SetConfOFF(0,Len("999.999.999-99")) }
    END TEXTBOX

END WINDOW
Form_1.Center
Form_1.Activate
Return Nil

Function SetConfOFF( nMaxLength, nInputMask )
Local cFrmName   := ThisWindow.Name
Local cCmpName   := This.FocusedControl

If nInputMask > 0
   nMaxLength := nInputMask
Endif
If !Empty(cCmpName)
   If nMaxLength == GetProperty(cFrmName,cCmpName,"CaretPos")
      InsertTab()
   Endif
Endif
Return Nil
E para MiniGui Extended:

Código: Selecionar todos

#include "minigui.ch"

Function Main()
SET NAVIGATION EXTENDED
SET DATE TO BRITISH
SET CENTURY ON

DEFINE WINDOW Form_1 ;
    AT 0,0 ;
    WIDTH 400 HEIGHT 150 ;
    TITLE 'Simulating SET CONFIRM OFF at TextBox' ;
    MAIN

    DEFINE LABEL Label_1
    	ROW   20
        COL   30
        WIDTH 160
        VALUE 'Field 1 (Length 10):'
		FONTBOLD .T.
    END LABEL

    DEFINE TEXTBOX Text_1
        ROW       20
        COL       160
        WIDTH     180
        MAXLENGTH 10
        ON CHANGE {|| SetConfOFF() }
    END TEXTBOX

    DEFINE LABEL Label_2
        ROW    48
        COL    30
        WIDTH  160
        VALUE 'Field 2 (Length 10):'
		FONTBOLD .T.
    END LABEL

    DEFINE TEXTBOX Text_2
        ROW   48
        COL   160
        WIDTH   180
        MAXLENGTH 10
		DATE .T.
        ON CHANGE {|| SetConfOFF() }
    END TEXTBOX

    DEFINE LABEL Label_3
        ROW   76
        COL   30
        WIDTH 160
        VALUE 'Field 3 (Length 14):'
		FONTBOLD .T.
    END LABEL

    DEFINE TEXTBOX Text_3
        ROW     76
        COL     160
        WIDTH   180
        INPUTMASK "999.999.999-99"
        ON CHANGE {|| SetConfOFF() }
    END TEXTBOX

END WINDOW
Form_1.Center
Form_1.Activate
Return Nil

Function SetConfOFF()
Local cFrmName   := ThisWindow.Name
Local cCmpName   := This.FocusedControl
Local x := GetControlIndex(cCmpName, cFrmName)
Local nMaxLength := _HMG_aControlRangeMax[x]
Local nInputMask := Len(_HMG_aControlInputMask[x])

If nInputMask > 0
   nMaxLength := nInputMask
Endif
If !Empty(cCmpName)
   If nMaxLength == GetProperty(cFrmName,cCmpName,"CaretPos")
      InsertTab()
   Endif
Endif
Return Nil
Toledo, espero que não se importe de eu ter postado no fórum oficial HMG adicionando a edição de sobre-escrito no TextBox. Agradeço desde já.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Controles automaticos

Mensagem por Paulo_CPV »

Bom dia!

Caros Toledo e Pablo muito obrigado pela ajuda que vocês me deram, foi de grande ajuda está funcionando 100% vocês são os mestres.

Abraços,

Paulo - Jacareí/SP
Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Controles automaticos

Mensagem por Paulo_CPV »

Bom dia!

Caros amigos eu estava fazendo uns testes com a função que vocês postaram aqui está funcionando, mas quando eu ponho está função em um TEXTBOX que tem uma validação de dados como por exemplo: Quando digito um número de CPF, CEP ou etc...errado ele sempre vai para o próximo TEXTBOX ao invés de ficar no TEXTBOX que o dado está incorreto, a função de validação que eu criei está no ONENTER, será que tem haver.

O que pode ser feito para resolver este problema? Desde já agradeço as dicas dos colegas deste grupo.

Abraços,

Paulo - Jacareí/SP
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Controles automaticos

Mensagem por Toledo »

Amigo, tente mudar a sua função de validação de ON ENTER para ON LOSTFOCUS.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Controles automaticos

Mensagem por Pablo César »

Eu aconselho você chamar a função que valida o CPF na linha anterior do InsertTab()

Código: Selecionar todos

If CPF_OK()=.T.
   InsertTab()
Else
   MsgStop("CPF errado !")
Endif
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Controles automaticos

Mensagem por Paulo_CPV »

Boa noite!

Aos mestres deste grupo, agora estou com uma dúvida cruel, a função que vocês postaram no post está funcionando perfeitamente, mas agora quando eu coloco a função junto com uma função de validação de campo não está focando no Textbox quando eu digito o valor que não corresponde a validação e vai para o próximo Textbos.

Isto está ocorrendo quando eu faço uma validação do campo NOME que não pode ficar em branco, já fiz o ajuste que o amigo Toledo me diz, funcionou para os campos que tem validação para CPF, e DATA e NUMÉRICO, mas eu estou com problemas com campos tipo CARÁCTER, o que eu estou fazendo errado?

Abraços,

Paulo - Jacareí/SP
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Controles automaticos

Mensagem por Toledo »

Amigo, volte a função de validação para ON ENTER, pois fiz alguns teste aqui e as duas funções funcionam certinho.

Se o seu código não funcionar, mostre como você está montando o TEXTBOX e como está as funções de validação e SetConfOFF.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Controles automaticos

Mensagem por Paulo_CPV »

Bom dia!

Será que é possível me passar um exemplo de como eu coloco corretamente uma função de validação (Carácter, Data e Numérico) com a função SetConfoof(), pois estou apanhando um pouco para ajustar a função.

Quem puder me passar ficarei grato.

Abraços,

Paulo - Jacareí/SP
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Controles automaticos

Mensagem por Toledo »

Toledo escreveu:mostre como você está montando o TEXTBOX e como está as funções de validação e SetConfOFF
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Paulo_CPV
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 07 Mar 2013 10:27
Localização: Jacarei/SP

Controles automaticos

Mensagem por Paulo_CPV »

Boa tarde!

Toledo ainda está dando erro, quando a validação e .F. ele não fica no TEXTBOX e mostra mensagem de erro, segue o trecho de como eu estou colocando as funções:

Código: Selecionar todos

       DEFINE TEXTBOX text_3

         ROW      96
         COL      180
         WIDTH    120
         HEIGHT   20
         FONTNAME "Arial"
         FONTSIZE 9
         FONTBOLD .T.
         FONTCOLOR {0,0,0}
         DATE .T.
         BACKCOLOR {245,222,179}
         ONLOSTFOCUS { || IF( ::ValidarData( This.Value ) = .F. , Janela10.text_3.SetFocus , Janela10.Text_4.SetFocus ) }
         ONCHANGE	   { || SetConfOFF() }
		 
       END TEXTBOX
*******************************************
Function ValidarData( cData )

   LOCAL nAno , nMes , nDia  , nBissesto , nRet , lRet

   nDia  := DAY( cData )
   nMes  := MONTH( cData )
   nAno  := YEAR( cData )

   nBissesto := INT( nAno / 4 )
   
   IF nMes = 2
   
      nRet := IF( nBissesto = 0 , 29 , 28 )
         
      IF nRet > nDia

        MSG_ERRO("Data digitada incorreta ! Por favor digite novamente.")
        lRet := .F.         
      
      ENDIF
         
      IF nDia > 30 .OR. nDia > 31

         MSG_ERRO("Data digitada incorreta ! Por favor digite novamente.")      
         lRet := .F.
         
      ELSE
      
         lRet := .T.
         
      ENDIF
   
   ENDIF

RETURN(lRet)
Abraços,

Paulo - Jacareí/SP
Responder