Auto preenchimento

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

wagnerjsc
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 24 Jan 2014 09:11
Localização: limeira sp

Auto preenchimento

Mensagem por wagnerjsc »

Bom dia amigos!

Alguem conhece uma forma de fazer com que o espaço vazio de uma textbox seja preenchido com zeros.

Por ex: em uma textbox o usuário teria a opção de digitar 6 digitos tipo: 000001
ou digitar apenas 1 e desse enter a textbox preencheria os digitos vazios com zero ficando 00001

Desculpa por pertubarlos com mais essa duvida, más ja agradeço se alguem puder me dar uma dica.

Abraço,

wagner
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á

Auto preenchimento

Mensagem por Pablo César »

Oi Wagner,

Após a digitação no TextBox, você precisaria acionar uma função que prencha os zeros que você quer. Pode ser através do evento OnLostFocus.

O seu TextBox precisaria ser do tipo Texto para que você consiga dar o efeito de zeros preenchidos, senão os zeros irão desaparecer ao ser exibidos como numéricos. Dai você poderia utilizar a função StrZero().

Código: Selecionar todos

Function PutZeros()
Local cValor:=GetProperty("Form_1","Text_1","Value")

cValor:=StrZero(Val(cValor),6,0)
SetProperty("Form_1","Text_1","Value",cValor)
Return Nil
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.
wagnerjsc
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 24 Jan 2014 09:11
Localização: limeira sp

Auto preenchimento

Mensagem por wagnerjsc »

Muito obrigado Pablo pela ajuda e atenção!

Abraço,

wagner
Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

Auto preenchimento

Mensagem por Paulao »

Ola Pablo, boa tarde, interessante esta função, era exatamente o que eu precisava, mas gostaria de tornar-la uma função genérica, que eu pudesse chamar quando necessário, eu passaria os parâmetros e a função completasse o textbox correspondente, fiz alguns teste aqui mas não consegui torna-la genérica, poderia me dar uma força? Obrigado
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á

Auto preenchimento

Mensagem por Pablo César »

Paulao escreveu:fiz alguns teste aqui mas não consegui torna-la genérica, poderia me dar uma força?
Sim, claro. Eu teria gostado de ter visto o código da sua tentativa.

Então baseemos-nos no meu exemplo postado. Veja quantos dados são variáveis nessa função ? Seriam:
  • * Form_1
    * Text_1
    * Value
    * 6
    (quantidade de zeros)

Código: Selecionar todos

Function PutZeros ( cForm, cComp, cVal, nTam )
Local cValor:=GetProperty(cForm,cComp,cVal)

cValor:=StrZero(Val(cVal),nTam,0)
SetProperty(cForm,cComp,cVal,cValor)
Return Nil
Daí você vai ter que passar esses 4 parâmetros sempre para que funcione.
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.
Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

Auto preenchimento

Mensagem por Paulao »

Boa noite Pablo, obrigado pela força, eu havia feito assim mesmo, mas estou com me embaralhando nos paramentros, veja meu textbox

Código: Selecionar todos

    DEFINE TEXTBOX oGet_nfre_nfe
        ROW    020
        COL    150
        WIDTH  080
        HEIGHT 020
        FONTNAME "Tahoma"
        FONTSIZE 10
        TOOLTIP "Digite o numero da NF-e Referenciada"
        VALUE x_nfre_nfe
        ON LOSTFOCUS completa("form_fin","oGet_nfre_nfe","value",9)
    END TEXTBOX
Agora a função, mudei o nome apenas porque ja estou acostumado.

Código: Selecionar todos

*_______________________________________________________________________________
Function Completa( cForm, cComp, cVal, nTam )
Local cValor:=GetProperty(cForm,cComp,cVal)

cValor:=StrZero(Val(cVal),nTam,0)
SetProperty(cForm,cComp,cVal,cValor)
Return Nil
Ja tirei as aspas ja coloquei, mas mesmo assim ainda não funcionou, do jeito que ta agora ele retorna 9 zeros pro textbox.

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

Auto preenchimento

Mensagem por Toledo »

Amigos, segue um pequeno exemplo, reduzindo o número de parâmetros:

Código: Selecionar todos

#include "minigui.ch"

Function Main()

x_nfre_nfe:=""
SET NAVIGATION EXTENDED

   DEFINE WINDOW form_fin ;
      AT 0,0 ;
      WIDTH 400 HEIGHT 300 ;
      TITLE 'STRZero em TextBox' ;
      MAIN

      DEFINE LABEL Label_1
        ROW	20
        COL	10
        WIDTH	130
        VALUE 'NF-e Refer.:'
      END LABEL

      DEFINE TEXTBOX oGet_nfre_nfe
        ROW    020
        COL    150
        WIDTH  080
        HEIGHT 020
        FONTNAME "Tahoma"
        FONTSIZE 10
        TOOLTIP "Digite o numero da NF-e Referenciada"
        VALUE x_nfre_nfe
        ON LOSTFOCUS completa("oGet_nfre_nfe",9)
      END TEXTBOX

      DEFINE LABEL Label_2
        ROW	50
        COL	10
        WIDTH	120
        VALUE 'Outro campo'
      END LABEL

      DEFINE TEXTBOX Text_2
        ROW	50
        COL	150
        WIDTH	100
        MAXLENGTH 10
        TOOLTIP "Outro campo qualquer"
      END TEXTBOX

   END WINDOW

   form_fin.Center
   form_fin.Activate

Return Nil

************************************
Function completa(cComp,nTam)
Local cFrmName   := ThisWindow.Name
Local cVal := STRZero(Val(GetProperty(cFrmName,cComp,"Value")),nTam)
SetProperty(cFrmName,cComp,"Value",cVal)
Return Nil
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á

Auto preenchimento

Mensagem por Pablo César »

Bom eu tinha feito o demo, mas vi que o Toledo disponibilizou outro quase com o mesmo conteúdo. A diferença está em que o Toledo utilizou o ThisWindow.Name eliminando a necessidade do parâmetro do cForm e o de cValue, mas esqueceu de colocar no evento OnEnter, pois alguns usuários ainda utilizam essa prática para mudar de campo (vicio do antigo sist. Clipper).

Paulo, analise as funções do Toledo e minha (estas ultimas) e verá onde você errou. Lembre, em GUI são objetos, não são variáveis. O teu erro estava no terceiro parâmetro (no primeiro exemplo que postei). Observe o SET NAVIGATION EXTENDED pois ele dará o efeito de mudar de campo.

De todas formas disponibilizo o demo que tinha preparado.

Código: Selecionar todos

#include "hmg.ch"

Function Main()
SET NAVIGATION EXTENDED
DEFINE WINDOW Form_1 AT 219 , 253 WIDTH 458 HEIGHT 246 ;
	TITLE "Auto prenchimento de zeros" ICON NIL MAIN
	
	DEFINE TEXTBOX Text_1
	    ROW    50
	    COL    130
	    WIDTH  120
	    HEIGHT 24
	    FONTNAME "Arial"
	    FONTSIZE 9
	    TOOLTIP ""
	    ONCHANGE Nil
	    ONGOTFOCUS Nil
	    ONLOSTFOCUS Completa(ThisWindow.Name,This.Name,This.Value,9)
	    ONENTER Completa(ThisWindow.Name,This.Name,This.Value,9)
	    INPUTMASK "999999999"
	    FORMAT Nil
	    VALUE ""
	END TEXTBOX
	
	DEFINE TEXTBOX Text_2
	    ROW    150
	    COL    130
	    WIDTH  120
	    HEIGHT 24
	    FONTNAME "Arial"
	    FONTSIZE 9
	    TOOLTIP ""
	    ONCHANGE Nil
	    ONGOTFOCUS Nil
	    ONLOSTFOCUS Completa(ThisWindow.Name,This.Name,This.Value,9)
	    ONENTER Completa(ThisWindow.Name,This.Name,This.Value,9)
	    INPUTMASK "999999999"
	    FORMAT Nil
	    VALUE ""
	END TEXTBOX

END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return Nil

Function Completa( cForm, cComp, cVal, nTam )
Local cValor:=GetProperty(cForm,cComp,cVal)

cValor:=StrZero(Val(cVal),nTam,0)
SetProperty(cForm,cComp,"Value",cValor)
Return Nil
De fato é bom a diversidade de exemplos, pois cada um tem o seu jeito. Eu preferi manter a lógica inicial para que o aprendizado servisse o bom entendimento. Pois colocando os campos como parâmetro, você consegue entender melhor.
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
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Auto preenchimento

Mensagem por Toledo »

Pablo César escreveu:mas esqueceu de colocar no evento OnEnter
Bom, na verdade eu não esqueci, só procurei manter o uso dos mesmos controles que está no exemplo do Paulão, assim como ele, usando apenas o ON LOSTFOCUS.

E também usar a mesma função em ON ENTER e ON LOSTFOCUS ocorre um duplicidade no uso da função Controle(). Neste caso, quando se pressionar o ENTER neste TextBox, será executado a função Controle(), e consequentemente também vai sair o foco do textbox, assim será executado novamente a função Controle() por causa do ON LOSTFOCUS. Bastaria então usar a função Controle() no ON ENTER ou no ON LOSTFOCUS.

Eu optaria pelo uso da função no ON LOSTFOCUS, pois as funções usadas em ON ENTER só são executadas se o usuário pressionar a tecla ENTER. Se o usuário tiver o costume de pressionar TAB (costume adquirido pelo uso de formulários em páginas da Internet, que só muda de campo pressionando TAB) para mudar de campo, então a função não será executada no ON ENTER.
Pablo César escreveu:Local cValor:=GetProperty(cForm,cComp,cVal)
Esta linha do seu exemplo pode ser retirada, não tem efeito nenhum.

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á

Auto preenchimento

Mensagem por Pablo César »

Toledo escreveu:usar a mesma função em ON ENTER e ON LOSTFOCUS ocorre um duplicidade no uso da função
Você está certo, Toledo.
Toledo escreveu:Eu optaria pelo uso da função no ON LOSTFOCUS
Com certeza.
Toledo escreveu:Local cValor:=GetProperty(cForm,cComp,cVal)

Esta linha do seu exemplo pode ser retirada, não tem efeito nenhum.
Você tem razão. Acabou ficando o código de antes. Imagem

Quem sabe, sabe. Obrigado Toledo pelos esclarecimentos. :)Pos
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.
Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

Auto preenchimento

Mensagem por Paulao »

Obrigado Toledo, era isto mesmo que eu precisava, boa semana pra vc e todos os amigos do forum
Responder