Clipper On Line • Ver Tópico - Controles automaticos

Controles automaticos

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Controles automaticos

Mensagempor Paulo_CPV » 21 Mar 2014 23:40

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
Paulo_CPV
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 178
Data de registro: 07 Mar 2013 10:27
Cidade/Estado: Jacarei/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Controles automaticos

Mensagempor Toledo » 22 Mar 2014 10:02

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

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

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Controles automaticos

Mensagempor Pablo César » 22 Mar 2014 11:14

Muito bem elaborado, Toledo.
Fiz baseado na sua indicação para trabalhar em HMG também:
#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.
Avatar de usuário

Pablo César
Usuário Nível 7

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

Controles automaticos

Mensagempor Paulo_CPV » 22 Mar 2014 15:53

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:

LOCAL nDigitado  := LEN( ALLTRIM( cCampo ) )


Para:
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
Paulo_CPV
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 178
Data de registro: 07 Mar 2013 10:27
Cidade/Estado: Jacarei/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Controles automaticos

Mensagempor Pablo César » 22 Mar 2014 20:20

Oi Paulo, tente substituindo com:

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

Pablo César
Usuário Nível 7

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

Controles automaticos

Mensagempor Pablo César » 22 Mar 2014 20:29

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:
#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:
#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.
Avatar de usuário

Pablo César
Usuário Nível 7

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

Controles automaticos

Mensagempor Paulo_CPV » 23 Mar 2014 00:55

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
Data de registro: 07 Mar 2013 10:27
Cidade/Estado: Jacarei/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Controles automaticos

Mensagempor Paulo_CPV » 24 Mar 2014 11:46

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
Paulo_CPV
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 178
Data de registro: 07 Mar 2013 10:27
Cidade/Estado: Jacarei/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Controles automaticos

Mensagempor Toledo » 24 Mar 2014 12:00

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

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Controles automaticos

Mensagempor Pablo César » 24 Mar 2014 16:08

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

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.
Avatar de usuário

Pablo César
Usuário Nível 7

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

Controles automaticos

Mensagempor Paulo_CPV » 24 Mar 2014 20:56

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
Paulo_CPV
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 178
Data de registro: 07 Mar 2013 10:27
Cidade/Estado: Jacarei/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Controles automaticos

Mensagempor Toledo » 25 Mar 2014 08:11

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

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Controles automaticos

Mensagempor Paulo_CPV » 25 Mar 2014 11:33

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
Paulo_CPV
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 178
Data de registro: 07 Mar 2013 10:27
Cidade/Estado: Jacarei/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Controles automaticos

Mensagempor Toledo » 25 Mar 2014 12:00

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

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Controles automaticos

Mensagempor Paulo_CPV » 25 Mar 2014 14:33

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:

       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
Paulo_CPV
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 178
Data de registro: 07 Mar 2013 10:27
Cidade/Estado: Jacarei/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Próximo



Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


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