Jump to content
Fivewin Brasil

Alguém pode me ajudar nisso, por favor ???


gibaf

Recommended Posts

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 !!!!

Link to comment
Share on other sites


#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,


Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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. )
...
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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....

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...