gibaf Posted January 9, 2015 Report Share Posted January 9, 2015 ola a todos !!! fiz um demo (abaixo) para melhor explicar um problema q estou tendo: o problema esta na dialog em negrito, onde, nesse dialog, tem um get, com um valid, mas o valid nao esta executando... pq ? e, principalmente, como fazer pra resulver ? #Include "FiveWin.ch" #Include "\Sistemas\Include\VGet.ch" *-------------- Function Main() *-------------- Private oFonGet := TFont():New("Ms Sans Serif",06,07 ,,.F.,,,,,,,,,,,,) Private oDlgMain DEFINE DIALOG oDlgMain From 00,00 to 540,795 TITLE "Teste." PIXEL COLORS CLR_WHITE,CLR_WHITE STYLE nOr(DS_MODALFRAME) @ 10,10 BUTTON "Faz Get" OF oDlgMain SIZE 100,30 PIXEL ACTION FazGet() ACTIVATE DIALOG oDlgMain Return(Nil) *----------------------- Static Function FazGet() *----------------------- Local oFonGet := TFont():New("Ms Sans Serif",06,07 ,,.F.,,,,,,,,,,,,) Private oDlg,oGet Private wVar := Space(15) , lCloseGet := .F. DEFINE DIALOG oDlg FROM 200,100 TO 300,400 PIXEL STYLE nOr( WS_POPUP, WS_VISIBLE ) OF oDlgMain @ 05,05 GET oGet VAR wVar OF oDlg PIXEL SIZE 140,40 COLOR CLR_BLACK,CLR_WHITE FONT oFonGet VALID ValidaGet() ACTIVATE DIALOG oDlg ON INIT oDlg:oClient:=oGet VALID lCloseGet oFonSay:End() ; oFonGet:End() ; oGet:End() Return(Nil) *-------------------------- Static Function ValidaGet() *-------------------------- Local lRet := .T. // Faz a Validacao e retorna .T. ou .F. MsgAlert( iif( lRet , "Valido" , "Invalido" ) ) If lCloseGet oDlg:End() Endif Return(lRet) desde ja agradeco a ajuda de todos: MUITO OBRIGADO !!!! Ronaldbuch and EdwardPluh 2 Quote Link to comment Share on other sites More sharing options...
Marca Posted January 9, 2015 Report Share Posted January 9, 2015 Já tive este problema Isso acontece pq. tem somente um get na dialog Esperimente colocar um buttom ou outro get sendo q. fora da area da dialog p. exemplo @ 500,500 GET oGet VAR wVar2 OF oDlg PIXEL SIZE 140,40 COLOR CLR_BLACK,CLR_WHITE FONT oFonGet Teste e diga Quote Link to comment Share on other sites More sharing options...
gibaf Posted January 9, 2015 Author Report Share Posted January 9, 2015 entao... eu ja sabia q se conter um segundo componente (get, botao, combobox, etc) o valid vai executar... mas a questao eh q nao nao posso ter esse segundo, somente o get mesmo... como ter a solucao ?? obs: obrigado por responder Quote Link to comment Share on other sites More sharing options...
kapiaba Posted January 9, 2015 Report Share Posted January 9, 2015 #Include "FiveWin.ch" #Include "\Sistemas\Include\VGet.ch" STATIC lCloseGet := .F. *-------------- Function Main() LOCAL oDlgMain DEFINE DIALOG oDlgMain From 00,00 to 540,795 ; TITLE "VALIDANDO UM GET SOZINHO" PIXEL COLORS CLR_WHITE,CLR_WHITE ; STYLE nOr(DS_MODALFRAME) TRANSPARENT @ 10,10 BUTTON "Faz Get" OF oDlgMain SIZE 100,30 PIXEL ; ACTION( FazGet() ) @ 50,10 BUTTON "Saida" OF oDlgMain SIZE 030,10 PIXEL ; ACTION( oDlgMain:End() ) CANCEL ACTIVATE DIALOG oDlgMain CENTERED Return Nil Function FazGet() Local oFonSay Local oFonGet // := TFont():New("Ms Sans Serif",06,07 ,,.F.,,,,,,,,,,,,) Local oDlg, oGet, wVar := Space(15) Local oGetHide, wVarHide := "." DEFINE FONT oFonGet NAME "Ms Sans Serif" SIZE 00, -14 BOLD DEFINE DIALOG oDlg FROM 200,120 TO 300,400 PIXEL ; STYLE nOr( WS_POPUP, WS_VISIBLE ) OF oDlg ; COLOR CLR_BLACK, CLR_WHITE TRANSPARENT Set( _SET_INSERT, ! Set( _SET_INSERT ) ) @ 05,10 GET oGet VAR wVar OF oDlg PIXEL SIZE 140,40 ; COLOR CLR_BLACK,CLR_WHITE FONT oFonGet ; VALID ValidaGet( oDlg ) // Get Invisivel para ativar o VALID do Primeiro GET @ 150,10 GET oGetHide VAR wVarHide OF oDlg PIXEL SIZE 000,00 ; COLOR CLR_BLACK,CLR_WHITE ACTIVATE DIALOG oDlg CENTERED ; ON INIT( oDlg:oClient := oGet ) ; VALID( lCloseGet ) Set( _SET_INSERT, ! Set( _SET_INSERT ) ) // oFonSay:End() // Fonte nao definidda oFonGet:End() // oGet:End() // nao precisa disto em Objeto GET lCloseGet := .F. Return Nil Function ValidaGet( oDlg ) Local lRet := .T. // Faz a Validacao e retorna .T. ou .F. MsgAlert( iif( lRet , "Valido" , "Invalido" ) ) lCloseGet := .T. If lCloseGet ? "I am the best!" oDlg:End() Endif Return( lRet ) // End of program abs, Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted January 9, 2015 Report Share Posted January 9, 2015 Colega cria um simples group em volta de seu get, e na propriedade dele dentro do resource na opção TAbcoloca YES que ira resolver seu problema... Luiz Fernando Quote Link to comment Share on other sites More sharing options...
gibaf Posted January 9, 2015 Author Report Share Posted January 9, 2015 Luiz Fernando ? e como fazer isso usando @ lin, col bla..bla..bla (nao estou usando resource) ?? obrigado por responder Quote Link to comment Share on other sites More sharing options...
Valdir Posted January 9, 2015 Report Share Posted January 9, 2015 Luiz Fernando ? e como fazer isso usando @ lin, col bla..bla..bla (nao estou usando resource) ?? obrigado por responder Olá Giba... Faça o que o Luiz Fernando sugeriu e infome a linha e coluna fora do tamanho da sua dialogs. Isso deve resolver um abraço Quote Link to comment Share on other sites More sharing options...
Marca Posted January 9, 2015 Report Share Posted January 9, 2015 Tanto faz um goup ou um get ou um say sendo que tem que ter mais que um elemento na dialog. Pq. disso ? Sinceramente tbem gostaria de saber . @ 007,010 GROUP To 070,157 Label " sua informação caso queira " OF oDlgImp Pixel FONT oPub:oFontNor COLOR CLR_BLUE Quote Link to comment Share on other sites More sharing options...
gibaf Posted January 9, 2015 Author Report Share Posted January 9, 2015 a explicacao q eu tive, eh q o valid soh executa no evento bLostFocus (ao perder o foco) e por isso me disseram q precisa um outro componente (pra poder perder o foco)... mas eh o (pip) mesmo ter q fazer "gambe" pra uma coisa tao simples... ainda tenho esperanca de alguem dar uma solucao...hehe Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 9, 2015 Report Share Posted January 9, 2015 Porque não utiliza bChange ou bKeyDown no lugar do Valid? Quote Link to comment Share on other sites More sharing options...
gibaf Posted January 9, 2015 Author Report Share Posted January 9, 2015 se eu nao me engano o bChange executa a cada digito lancado no get (dae nao me serve) vou tentar com o bKeyDown ps: obrigado pela resposta Quote Link to comment Share on other sites More sharing options...
gibaf Posted January 9, 2015 Author Report Share Posted January 9, 2015 o bKeyDown tambem nao da pra usar, igual o CHANGE, ou seja, executa a cada digito escrito no get. Quote Link to comment Share on other sites More sharing options...
rochinha Posted January 10, 2015 Report Share Posted January 10, 2015 Amiguinhos, Olhei o codigo e o trecho que o Kapiaba manipulou e não ví coerência na função ValidaGet() Function ValidaGet( oDlg ) Local lRet := .T. // Faz a Validacao e retorna .T. ou .F. MsgAlert( iif( lRet , "Valido" , "Invalido" ) ) lCloseGet := .T. If lCloseGet ? "I am the best!" oDlg:End() Endif Return( lRet ) A variavel lREt foi definida como verdadeira, mas nunca será modificada, pois sendo local só será visível dentro da função ValidaGet(). O iif( lRet, ... ) perde o sentido. o lCloseGet:=.t. faz o if lCloseGet perde a critica pois sempre será verdadeiro, fechando a janela. Geralmente quando eu uso GET com alguma função no Valid, no ultimo parâmetro passado eu sempre comando um .T., exemplo ... @ GET ... VALID ( FazGet(), .t. ) ... Quote Link to comment Share on other sites More sharing options...
gibaf Posted January 12, 2015 Author Report Share Posted January 12, 2015 Porque não utiliza bChange ou bKeyDown no lugar do Valid? ola.. acho q posso usar, sim, com o bKeyDown, validando quando o nKey = 9 (tab) e/ou quando for 13 (enter), e entao, fazer executar o valid (e nao executar o valid a cada caracter digitado)... penso q tem tudo para dar certo, sim.... soh nao vou conseguir fazer esse teste essa semana... stou esperancoso q funcione.... obrigado Quote Link to comment Share on other sites More sharing options...
aferra Posted January 12, 2015 Report Share Posted January 12, 2015 Hummmm, se entendi corretamente, talvez desse certo se usasse o ON PAINT Quote Link to comment Share on other sites More sharing options...
gibaf Posted January 12, 2015 Author Report Share Posted January 12, 2015 Hummmm, se entendi corretamente, talvez desse certo se usasse o ON PAINT hummm..... no ON PAINT ??? como assim ??? Quote Link to comment Share on other sites More sharing options...
mkyx Posted January 12, 2015 Report Share Posted January 12, 2015 Eu faço assim, quando uso apenas um get na dialog ou window: soma:=0 l_digi:="" PSW:=SPACE(13) @ 72,65 GET OGZZ VAR PSW PASSWORD PICTURE "XXXXXXXXXXXXX" SIZE 103,20 FONT OFNT4 OF ODLG00 PIXEL on change _ogzzz(ogzz:nlastkey) OGZZ:BKEYDOWN:={|NKEY|if(nKey=13,_OGZZ(NKEY),)} OGZZ:LTRANSPARENT:=.T. ..... return .t. function _ogzz(nkey) soma:=soma+1 if soma=2 soma:=0 ? l_digi .... .... .... // aqui colocar os comandos, manipulando a variavel l_digi, pois é nela que é armazenado os dados digitados... endif return .t. * * FUNCTION _OGZZZ(nKey0) NKEY0:=IF(NKEY0>=96,NKEY0-48,NKEY0) if nkey0=8 .or. nkey0=46 l_digi:=if(len(l_digi)>1,left(l_digi,len(l_digi)-1),"") elseif nkey0>32 .and. len(l_digi)<13 l_digi:=ALLTRIM(l_digi)+chr(nkey0) endif return .t. * Quem puder melhorar, favor fazê-lo, e depois postar as correções. Pompeo Guaratinguetá - SP Quote Link to comment Share on other sites More sharing options...
emotta Posted January 12, 2015 Report Share Posted January 12, 2015 Gibaf passei por este problema a muitos anos atrás quando desenvolvi o dicionário de dados e a função para criação dos campos na DIALOG automaticamente através da leitura do dicionario... Faz o seguinte: Execute a função BtnBaca(oDlg) logo após a criação da DIALOG ou se for FOLDER faça um FOR para todas as DIALOGS do folder colocando BtnBaca(oFolder:aDialogs[nX]) onde NX é a variavel do FOR NX := 1 TO LEN(AFOLDER:ADIALOGS] A função BtnBaca é esta: Function BtnBaca(oDlg) oBtnBaca := TButton():New( 100000, 10000000, "Ok" , oDlg,{||oDlg:GoNextControl()}, 50, 12,,, .F., .T., .F.,, .F.,,, .F. )oBtnBaca:bGotFocus := {||oCodFun:SetFocus()} Return .t. ps: Eu vi que disse que não pode criar botão, mas este botão fica fora da área da DIALOG, portanto, é invisivel e também ele não recebe o FOCO por TAB... Então acredito que resolva seu problema, pra mim resolveu (e resolve) muito bem o problema a MUITOS anos.... Quote Link to comment Share on other sites More sharing options...
emotta Posted January 12, 2015 Report Share Posted January 12, 2015 Corrigindo meu post.... Coloque logo acima do ACTIVATE DIALOG e não do DEFINE DIALOG abraços Quote Link to comment Share on other sites More sharing options...
Eduardo Bilato Posted January 12, 2015 Report Share Posted January 12, 2015 Olá GIbaf Não sei para o que você está usando essa tela com um get somente, mas você também pode testar o tamanho da sua string no bKeyDown ou bChange caso ela tenha um tamanho determinado que você possa usar. PS: nunca usei o método LimitText(), encontrei ele agora olhando a classe tget, só usei como exemplo pra ilustrar o que quero dizer Seria algo parecido com isso: @ 01,01 GET oGet var WGET OF oDLG oGet:bChange := {|| Valida_Get( ::LimitText() ) } //------------ Function Valida_Get( xTam ) local lRet := .t. if xTam lRet := ( validação == verdadeiro ) endif Return lRet Quote Link to comment Share on other sites More sharing options...
Eduardo Bilato Posted January 12, 2015 Report Share Posted January 12, 2015 Ou também você pode testar num WHILE Ex: while .t. //declaração da tela DEFINE DIALOG oDLG bla bla bla //declaração do get @ 01,01 GET oGet var WGET OF oDLG valid( if( oGet:LimitText(),oDLG:End(),.t. ) ) ACTIVATE DIALOG oDLG CENTER //testar aqui suas validações if correto exit endif enddo Quote Link to comment Share on other sites More sharing options...
sambomb Posted January 12, 2015 Report Share Posted January 12, 2015 Você pode por um Say para ganhar o foco tb e no bOnGetFocus jogar o foco de volta para Get Quote Link to comment Share on other sites More sharing options...
gibaf Posted January 12, 2015 Author Report Share Posted January 12, 2015 Olá GIbaf Não sei para o que você está usando essa tela com um get somente, mas você também pode testar o tamanho da sua string no bKeyDown ou bChange caso ela tenha um tamanho determinado que você possa usar. PS: nunca usei o método LimitText(), encontrei ele agora olhando a classe tget, só usei como exemplo pra ilustrar o que quero dizer Seria algo parecido com isso: @ 01,01 GET oGet var WGET OF oDLG oGet:bChange := {|| Valida_Get( ::LimitText() ) } //------------ Function Valida_Get( xTam ) local lRet := .t. if xTam lRet := ( validação == verdadeiro ) endif Return lRet ola obrigado por responder... acho q usar esse nao daria certo, quando eh saido do get sem ter preenchido totalmente..... tipo, nome por exemplo, com um tamanho de 40.. nem sempre soh sai do campo quando escrever 40 caracteres... sae com o enter, (ou tab tambem) obrigado pela resposta. Quote Link to comment Share on other sites More sharing options...
aferra Posted January 13, 2015 Report Share Posted January 13, 2015 Olá Giba. faça assim, acredito que vá dar certo...ainda não entendi muito bem...(sem tempo de ler com calma) o que vc precisa. ACTIVATE DIALOG oDlg ON PAIMT ValidaGet() VALID lCloseGet Quote Link to comment Share on other sites More sharing options...
Eduardo Bilato Posted January 13, 2015 Report Share Posted January 13, 2015 Olá GIbaf Não sei para o que você está usando essa tela com um get somente, mas você também pode testar o tamanho da sua string no bKeyDown ou bChange caso ela tenha um tamanho determinado que você possa usar. PS: nunca usei o método LimitText(), encontrei ele agora olhando a classe tget, só usei como exemplo pra ilustrar o que quero dizer Seria algo parecido com isso: @ 01,01 GET oGet var WGET OF oDLG oGet:bChange := {|| Valida_Get( ::LimitText() ) } //------------ Function Valida_Get( xTam ) local lRet := .t. if xTam lRet := ( validação == verdadeiro ) endif Return lRet ola obrigado por responder... acho q usar esse nao daria certo, quando eh saido do get sem ter preenchido totalmente..... tipo, nome por exemplo, com um tamanho de 40.. nem sempre soh sai do campo quando escrever 40 caracteres... sae com o enter, (ou tab tambem) obrigado pela resposta. Bom dia Gibaf Então basta fazer o seguinte: @ 01,01 GET oGet var WGET OF oDLG oGet:bKeyDown := {|nKey| if( nKey == K_ENTER, Valida_Get(),.t. ) } //------------ Function Valida_Get() local lRet := .t. if validação ok lRet := .t. else lRet := .f. endif Return lRet Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.