Clipper On Line • Ver Tópico - Sintaxe do TEXTBOX CONTROL

Sintaxe do TEXTBOX CONTROL

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Sintaxe do TEXTBOX CONTROL

Mensagempor billy1943 » 25 Jun 2013 11:49

Como esse componente é muito utilizado, precisaria saber como checar a informação nele inserida, de forma similar à clausula
VALID do Clipper, de modo a consistir por meio de função própria dentro dessa estrutura se o dado será aceito ou não.

No HMG Reference está dessa forma, mas não consegui saber onde encaixaria o VALID desejado:

Standard Syntax (xBase Style):


      @ <nRow> ,<nCol>
            TEXTBOX <ControlName>
            [ OF | PARENT <ParentWindowName> ]
            [ HEIGHT <nHeight> ]
            [ FIELD <FieldName> ]
            [ VALUE <nValue> ]
            [ READONLY ]
            [ WIDTH <nWidth> ]
            [ NUMERIC ] [ INPUTMASK <cMask> ]
            [ FORMAT <cFormat> ] | PASSWORD ]
            [ FONT <cFontName> SIZE <nFontSize> ]
            [ BOLD ] [ ITALIC ] [ UNDERLINE ] [ STRIKEOUT ]
            [ TOOLTIP <cToolTipText> ]
            [ BACKCOLOR <aBackColor> ]
            [ FONTCOLOR <aFontColor> ]
            [ DISABLEDBACKCOLOR <aDisabledBackColor> ]
            [ DISABLEDFONTCOLOR <aDisabledFontColor> ]
            [ DATE ]
            [ MAXLENGTH <nInputLength> ]
            [ UPPERCASE | LOWERCASE ]
            [ ON GOTFOCUS <OnGotFocusProcedur> | <bBlock> ]
            [ ON CHANGE <OnChangeProcedure> | <bBlock> ]
            [ ON LOSTFOCUS <OnLostFocusProcedure> | <bBlock> ]
            [ ON ENTER <OnEnterProcedure> | <bBlock> ]
            [ RIGHTALIGN ]
            [ INVISIBLE ]
            [ NOTABSTOP ]
            [ HELPID <nHelpId> ]

 
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar de usuário

billy1943
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 574
Data de registro: 12 Mai 2009 17:33
Cidade/Estado: Bauru-SP
Curtiu: 1 vez
Mens.Curtidas: 18 vezes

Sintaxe do TEXTBOX CONTROL

Mensagempor Pablo César » 25 Jun 2013 12:40

Oi Billy, em programação GUI (em modo gráfico), você entende tudo de forma individual, tudo é objeto. E o tratamento de cada componente não é como era no Clipper de forma processual e sim por eventos e propriedades. O que você quer está vinculado com a propriedade do TextBox e tomar uma ação que deve ser engatilhada com algum evento.

Para esse seu caso, ver o conteúdo de um TextBox (propriedades do elemento) tem duas formas:

- Forma simples, exemplo: Form_1.Text_1.Value atribua isto que está em negrito a uma variável e você terá o conteúdo numa variável.
- Outra forma é GetProperty("Form_1","Text_1","Value")atribua isto que está em negrito a uma variável e você terá o conteúdo numa variável.

Agora quando é que você pode acessar o que o usuário digitou ? Eis os eventos:

- [ON GOTFOCUS <OnGotFocusProcedur> | <bBlock> ]
- [ ON CHANGE <OnChangeProcedure> | <bBlock> ]
- [ ON LOSTFOCUS <OnLostFocusProcedure> | <bBlock> ]
- [ ON ENTER <OnEnterProcedure> | <bBlock> ]

Aqui vai precisar criar uma função que trate aquela propriedade acima. Entendeu ?
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 de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5539
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 151 vezes

Sintaxe do TEXTBOX CONTROL

Mensagempor billy1943 » 26 Jun 2013 10:16

Oi, Pablo César

Está quase funcionando, mas ainda tem um pequeno problema.
No TEXTBOX abaixo feito de acordo com as suas instruções anteriores, existe a chamada à função "conf_cnpj_cpf" que envia como parâmetro o valor de Novo_Cliente.TxtCNPJ_CPF.

Se for validado passa para o próximo campo de TxtNOME, e, em caso contrário volta o foco para o mesmo campo.

A dúvida é que parece que o sistema não está indo para a função pois coloquei várias mensagens nela e o sistema não está mesmo
a conhecendo.

Será por causa do LOSTFOCUS(CriaMascara) anterior ?
O TxtBOX está gravando o que for digitado, certo ou errado.

Abaixo o trecho em questão:

@ 020,310 TEXTBOX TxtCNPJ_CPF;
HEIGHT 25 ;
WIDTH 130 ;
FONT 'ARIAL' SIZE 9;
TOOLTIP "Digite o CNPJ ou CPF do Cliente";
MAXLENGTH 20 ;
ON LOSTFOCUS CriaMascara();
ON ENTER Iif (conf_cnpj_cpf(Novo_Cliente.TxtCNPJ_CPF.Value ), Novo_Cliente.TxtNOME.SetFocus,;
Novo_Cliente.TxtCNPJ_CPF.SetFocus)
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar de usuário

billy1943
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 574
Data de registro: 12 Mai 2009 17:33
Cidade/Estado: Bauru-SP
Curtiu: 1 vez
Mens.Curtidas: 18 vezes

Sintaxe do TEXTBOX CONTROL

Mensagempor Pablo César » 26 Jun 2013 11:08

Suponho que a função conf_cnpj_cpf (você não disponibilizou)... retorne um valor lógico. Mas no evento ON ENTER você SEMPRE está fazendo SetFocus, em uma das opção deve ser Nil.

Quanto CriaMascara(), não sei pois você novamente não disponibilizou o código.

Fica muito dificil dar um diagnóstico quando é omitido o código ou o resto que compõe para o bom entendimento.
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 de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5539
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 151 vezes

Sintaxe do TEXTBOX CONTROL

Mensagempor billy1943 » 27 Jun 2013 11:13

Oi, Pablo César,

Resolvido !

Peço desculpas por não colocado antes as funções necessárias a checagem do CNPJ ou CPF inseridos.
Coloco novamente o trecho alterado com a colocação do NIL conforme você sugeriu.
Incluo agora as funções que consistem o CNPJ/CPF pois podem ser úteis a colegas que trabalham com sistemas administrativos.

Informo que o programa agora está conferindo o valor informado, tanto em registro novo como em alteração de já existente.

O trecho do programa onde a variável TxtCGC_CPF é inserida/alterada está desta forma:

   @030,250 LABEL Lb_CGC_CPF; 
         VALUE 'CNPJ/CPF'   ;
         WIDTH 60   ;
         HEIGHT 30   ;
         FONT 'ARIAL' SIZE 9         

      @ 020,310 TEXTBOX TxtCGC_CPF;
         HEIGHT 25 ;
         WIDTH 130 ;
         FONT 'ARIAL' SIZE 9;
         TOOLTIP "Digite o CNPJ ou CPF do Cliente";
         MAXLENGTH 20 ;
               ON LOSTFOCUS CriaMascara();
                        ON ENTER Iif (conf_CGC_CPF(Novo_Cliente.TxtCGC_CPF.Value ), Novo_Cliente.TxtNOME.SetFocus,;
                                  NIL)


onde: TxtNOME é o próximo campo a ser inserido/editado.

As função (CriaMascara) exigida no caso de LOSTFOCUS é esta:

/*

   Funcão que cria máscara para CNPJ e CPF e atualiza TextBox

*/
FUNCTION CriaMascara()   
Local i          := 0
Local cCGC        := AllTrim( Novo_Cliente.TxtCGC_CPF.Value )  && Pega dados digitados no TextBox sem nenhum espaço
Local cNewCGC   := ""

*** Entra no contador de 1 até o Tamanho da varivel cCGC

For i := 1    To Len( cCGC ) 

   *** Acumula na Variável cNewCGC apenas os Digitos de  0 - 9
   cNewCGC += Iif(  IsDigit( Substr( cCGC , i , 1 ) )  , Substr( cCGC , i , 1 ) , ""  )

Next

*** Se Cliente for pessoa Juridica coloca máscara para CGC
If Novo_Cliente.Pessoa_Juridica.Value

   Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 99.999.999/9999-99" ) )

Else
      
   *** Caso contrário, coloca máscara para CPF
   Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 999.999.999-99" ) )

EndIf

Return Nil


Já a função (Conf_CGC_CPF) da cláusula ON ENTER está assim criada:

FUNCTION conf_CGC_CPF
Local i          := 0
Local cCGC        := AllTrim( Novo_Cliente.TxtCGC_CPF.Value )  && Pega dados digitados no TextBox sem nenhum espaço
Local cNewCGC       := ""

*** Entra no contador de 1 até o Tamanho da variável cCGC

For i := 1    To Len( cCGC ) 

   *** Acumula na Variável cNewCGC apenas os Dígitos de  0 - 9
   cNewCGC += Iif(  IsDigit( Substr( cCGC , i , 1 ) )  , Substr( cCGC , i , 1 ) , ""  )

Next

*** Se Cliente for pessoa Jurídica coloca máscara para CGC
If Novo_Cliente.Pessoa_Juridica.Value

   Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 99.999.999/9999-99" ) )

Else
      
   *** Caso contrário, coloca máscara para CPF
   Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 999.999.999-99" ) )

EndIf

if len(cNewCGC) == 0  // aceita digitação vazia para casos que não se conhece o CNPJ ou o CPF
   return .t.
endif

if len(cNewCGC) > 0 .and. len(cNewCGC) < 12  // tratamento para CPF
         
   if (! cic(cNewCGC))
      msgstop("C.P.F. inválido ! ")
      return .f.
   endif
   
else

   if (! cic(cNewCGC))
      msgstop("C.N.P.J. inválido ! ")
      return .f.
   endif
   
endif

return nil


A função auxiliar (CIC) que realmente confere os dois últimos algarismos de um CNPJ ou CPF está assim:

FUNCTION cic()    // função que confere os dois últimos algarismos do número informado
PARAMETER c_ic
LOCAL d_1, d_2, x_x, con_ta, digito, res_to

d_1 := 0
d_2 := 0
x_x := 1

for con_ta := 1 TO len(c_ic) - 2
   if at(subs(c_ic,con_ta,1),"/-.") == 0
      d_1 := d_1+(11-x_x) * val(substr(c_ic,con_ta,1))
      d_2 := d_2+(12-x_x) * val(substr(c_ic,con_ta,1))
      x_x := x_x + 1
   endif
next

res_to  := d_1 - (int(d_1/11)*11)
dig_ito := iif(res_to < 2,0,11-res_to)
d_2     := d_2 + 2 * dig_ito
res_to  := d_2 - (int(d_2/11) * 11)
dig_ito := val(str(dig_ito,1) + str(iif(res_to < 2,0,11-res_to),1))

if dig_ito <> val(substr(c_ic,len(c_ic)-1,2))
   msgstop("CNPJ/CPF não conferiu")
   return .f.
else
   msgstop("CNPJ/CPF conferiu")
   return nil
endif

return nil
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar de usuário

billy1943
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 574
Data de registro: 12 Mai 2009 17:33
Cidade/Estado: Bauru-SP
Curtiu: 1 vez
Mens.Curtidas: 18 vezes

Sintaxe do TEXTBOX CONTROL

Mensagempor Pablo César » 27 Jun 2013 13:10

Quê bom que resolveu ! Parabéns também pela sua contribuição, isso pode ajudar a muitos colegas. Eu não testei mas parece ser bem completo e funcional.

Obrigado Billy por compartilhar conosco !

:-Y
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 de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5539
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 151 vezes

Sintaxe do TEXTBOX CONTROL

Mensagempor billy1943 » 28 Jun 2013 11:03

Oi, Pablo César:

Como eu só estava testando CPF´s não havia incluido a função para consistir CNPJ´s, também necessária, o que faço agora, bem como o modo de utilizá-la:

Função conf_CGC_CPF

*** recebe como parametro o conteúdo do TXTBOX Novo_Cliente.TxtCGC_CPF.Value

FUNCTION conf_CGC_CPF
Local i          := 0
Local cCGC        := AllTrim( Novo_Cliente.TxtCGC_CPF.Value )  && Pega dados digitados no TextBox sem nenhum espaço
Local cNewCGC   := ""

*** Entra no contador de 1 até o Tamanho da variável cCGC

For i := 1    To Len( cCGC ) 
   *** Acumula na Variável cNewCGC apenas os Dígitos de  0 - 9
   cNewCGC += Iif(  IsDigit( Substr( cCGC , i , 1 ) )  , Substr( cCGC , i , 1 ) , ""  )
Next

*** Se Cliente for pessoa Jurídica coloca máscara para CGC

If cNewCGC <> ""
   If Novo_Cliente.Pessoa_Juridica.Value // campo lógico do arquivo de Clientes
      Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 99.999.999/9999-99" ) )
   Else
       *** Caso contrário, coloca máscara para CPF
     Novo_Cliente.TxtCGC_CPF.Value := AllTrim( TransForm( cNewCGC , "@R 999.999.999-99" ) )
   endif
EndIf

if len(cNewCGC) == 0  // aceita digitação vazia para casos que não se conhece o CNPJ ou o CPF
   return .t.
endif

if len(cNewCGC) > 0 .and. len(cNewCGC) < 12  // tratamento para CPF

  ret_cic := cic(cNewCGC)
   
   if ret_cic
      return .t.
    else
      return .f.    
   endif
   
else // para CNPJ

   ret_cgc := cgc(cNewCGC)
   
   if ret_cgc
      return .t.
    else
      return .f.    
   endif
   
endif

return nil



Função Cgc

*** Confere apenas os dois últimos algarismos do CNPJ

FUNCTION cgc()   // Função que confere os dois últimos algarismos do CNPJ
PARAMETER c_gc
LOCAL d_1, d_4, x_x, con_ta, dig_ito, res_to
d_1  := 0
d_4  := 0
x_x  := 1

for con_ta := 1 to len(c_gc) - 2
   if at(subs(c_gc,con_ta,1),"/-.")=0
      d_1 := d_1 + val(substr(c_gc,con_ta,1))*(iif(x_x<5,6,14)-x_x)
      d_4 := d_4 + val(substr(c_gc,con_ta,1))*(iif(x_x<6,7,15)-x_x)
      x_x := x_x + 1
   endif
next

res_to  := d_1-(int(d_1/11)*11)
dig_ito := iif(res_to < 2,0, 11 - res_to)
d_4     := d_4 + 2 * dig_ito
res_to  := d_4 - (int(d_4 / 11)* 11)
dig_ito := val(str(dig_ito,1) + str(iif(res_to < 2, 0, 11 - res_to),1))

if dig_ito <> val(substr(c_gc,len(c_gc)-1,2))
   msgstop("CNPJ não conferiu")
   return .F.
else
   return .T.
endif

FUNCTION cic()    // função que confere os dois últimos algarismos do número informado
PARAMETER c_ic
LOCAL d_1, d_2, x_x, con_ta, digito, res_to

d_1 := 0
d_2 := 0
x_x := 1

for con_ta := 1 TO len(c_ic) - 2
   if at(subs(c_ic,con_ta,1),"/-.") == 0
      d_1 := d_1 + (11-x_x) * val(substr(c_ic,con_ta,1))
      d_2 := d_2 + (12-x_x) * val(substr(c_ic,con_ta,1))
      x_x := x_x + 1
   endif
next

res_to  := d_1 - (int(d_1/11)*11)
dig_ito := iif(res_to < 2, 0, 11-res_to)
d_2     := d_2 + 2 * dig_ito
res_to  := d_2 - (int(d_2/11) * 11)
dig_ito := val(str(dig_ito,1) + str(iif(res_to < 2, 0, 11 - res_to),1))

if dig_ito <> val(substr(c_ic,len(c_ic)-1,2))
   msgstop("CPF não conferiu")
   return .F.
else
   return .T.
endif

return nil


Essa estrutura foi compilada em cima do exemplo do HMG\Samples\Control_Financiero, do Humberto Fornazier, constante da documentação do HMG, onde estou buscando o meu aprendizado.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar de usuário

billy1943
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 574
Data de registro: 12 Mai 2009 17:33
Cidade/Estado: Bauru-SP
Curtiu: 1 vez
Mens.Curtidas: 18 vezes

Sintaxe do TEXTBOX CONTROL

Mensagempor Claudio Soto » 07 Jul 2013 22:36

Simulación de la clausula Valid y When en un TextBox: http://hmgforum.com/viewtopic.php?p=8932#p8932
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 466
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 33 vezes
Mens.Curtidas: 133 vezes

Sintaxe do TEXTBOX CONTROL

Mensagempor billy1943 » 08 Jul 2013 11:37

Olá Claudio Soto, do Uruguay
Permita-me responder à sua sugestão, em português, que presumo, entenderá:

Transcrevo novamente o trecho onde estou a checar o CNPJ ou CPF do cliente:

 
      @030,250 LABEL Lb_CGC_CPF;
         VALUE 'CNPJ/CPF'   ;
         WIDTH 60   ;
         HEIGHT 30   ;
         FONT 'ARIAL' SIZE 9         

      @ 020,310 TEXTBOX TxtCGC_CPF;
         HEIGHT 25 ;
         WIDTH 130 ;
         FONT 'ARIAL' SIZE 9;
         TOOLTIP "Digite o CNPJ ou CPF do Cliente";
         MAXLENGTH 20 ;
          ON LOSTFOCUS CriaMascara();
            ON ENTER    Iif (conf_CGC_CPF(Novo_Cliente.TxtCGC_CPF.Value ), Novo_Cliente.TxtNOME.SetFocus, NIL)
      


O problema é que a rotina somente checa o valor digitado se terminar com a tecla <ENTER>;
Se passar para o próximo campo, no caso TxtNOME, teclando <TAB> ele aceita qualquer valor para o campo TxtCGC_CPF.
Como já tem um teste LOSTFOCUS que executará a função CRIAMASCARA, somente o teste ON ENTER é que está sendo feito, estou correto ?

Como checar as outras formas de terminar a digitação, que no caso do nosso velho e estimado Clipper, a cláusula VALID "brecava" qualquer informação indevida, consistindo perfeitamente qualquer entrada.

Na sua sugestão que testei, o foco passa para o TXT_03 se digitarmos uma letra que deve estar em "SNFGH", não importando como
terminemos a digitação, além do <ENTER> ou <TAB> usuais.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar de usuário

billy1943
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 574
Data de registro: 12 Mai 2009 17:33
Cidade/Estado: Bauru-SP
Curtiu: 1 vez
Mens.Curtidas: 18 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro