Problema com Get e comando VALID

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Sim. É só isso mesmo. Você poderia só acrescentar o switch /L na compilação, pra remover os números das linhas. Isso deixa o objeto um pouco menor. Se bem que não é algo crítico.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
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á

Re: Agradecimento

Mensagem por Pablo César »

pjtb escreveu:Blz Pablo, ja esta funcionando...
Que bom ! Fico feliz saber que resolveu e praticamente sozinho. Você utilizou TBROWSE mesmo ? Se for isso acrescerá um conhecimento extra em teus desenvolvimentos.
Maligno escreveu:mas não mexeria na GETSYS apenas para resolver esse problema
Ademir escreveu:Entendí o que quer dizer. Mas mesmo nas funções queria tirar a comparação de toda a hora
Eu entendo também e que a sua situação venha ser ecepcional sair do GET quando setinha pra cima for acionada. Mas lembre que esse tipo de mudança é uma forma muito radical e que poderá trazer algumas consequências. Lembre que todo o seu sistema de GETs passa por o GETSYS e que você poderá ter alguns inconvenientes como:

1. Seguindo o seu exemplo:

Código: Selecionar todos

@ 10,20 get var1 
@ 12,20 get var2 valid var2 > 9 
@ 14,20 get var3 
read
2. Digamos que caso você queira ainda fazer esse controle pelo GETSYS e digite no segundo GET na var2 um número 3 (que esse número não seria aceitável, segundo seu exemplo de valid) e nesse momento o usuário em vez de pressionar o ENTER pressiona a SET-PRA-CIMA, daí então seu GET se tornará válido (por causa do seu GETSYS alterado), não é mesmo ?

Por isso o colega Maligno, desestimulou você a alterar o GETSYS e fazer a sua própria função para esse caso específico. Eu faria assim:

Código: Selecionar todos

@ 10,20 get var1 
@ 12,20 get var2 valid MYFUN(var2)
@ 14,20 get var3 
read

FUNCTION MYFUN(var2)
IF LASTKEY()=5 .AND. VAR2=0
    RETURN .T.
ENDIF
IF var2 > 9 
    RETURN .T.
ELSE
    RETURN .F.
ENDIF
Será que isso não resolveria seu caso Ademir ?. re-avalie essa questão pois imagino que você poderá ter outros GETs no seu sistema e se eles tem alguma condição declarada simplesmente irá ser ignorada quando o GETSYS sair com retorno .T.
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
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

e nesse momento o usuário em vez de pressionar o ENTER pressiona a SET-PRA-CIMA...
... e estando no primeiro campo, aciona o comando de gravação. Daí fica bem fácil visualizar que seria mais prático ter uma função externa de validação, que seria tanto utilizada pelo VALID quanto por uma eventual função de checagem de consistência pré-gravação. Mata-se dois coelhos com uma só caixa d'àgua. :)))
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

Boa tarde Pablo ! Td bom ?

Eu acho que vc não entendeu o que quero fazer. Não quero sair do get teclando setinha pra cima. O que eu quero é me movimentar nos gets para cima e para baixo. Para baixo utilizando ENTER e para cima, setinha pra cima. O problema é que em toda função do usuario que valida os gets eu tenho que verificar se foi pressionada a tecla da setinha pra cima ou seja LASTKEY()=5. O exemplo da alteração que fiz no GetSys foi na função GetPostValidate(). Ela ja verifica se foi pressionado ESC (oGet:exitState==GE_ESCAPE). Apenas implementei, com a verificação de que se tentou retornar ao GET anterior (oGet:exitState==GE_UP). A unica coisa que faltou no exemplo que postei e que já corrigi na minha GETSYS foi dar um oGet:assign() para não perder o que foi digitado quando teclar a setinha pra cima.
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

Pablo. No exemplo 2 que vc postou, o Get nao se tornara valido. O que irá acontecer é que o foco passará para var1. O valid dos gets nao é ignorado devido ao retorno .t. da GetPostValidate().

Desculpe, posso até estar errado, mas pelos testes que fiz, funciona perfeitamente.
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á

Mensagem por Pablo César »

Oi Ademir, tudo bem. Realmente o meu exemplo de 27 Set 2007 13:51, não está como deveria, tem furo. Refiz este outro exemplo, sugiro que pegue o exemplo a seguir e compile (mas não inclua seu GETSYS) e veja se é isso que você quer.

Código: Selecionar todos

CLS
var1:=0
var2:=0
var3:=0
DO WHILE .T.
   @ 10,20 get var1
   @ 12,20 get var2 valid MYFUN(var2)
   @ 14,20 get var3
   READ
   IF LASTKEY()=27
      IF ALERT("Deseja sair sem gravar ?",{"Nao","Sim"})=2
         RETURN NIL
      ENDIF
   ENDIF
   IF VAR2<=9
      ALERT("O valor deve ser maior que 9 (mensagem no looping)")
      KEYBOARD CHR(24)
   ELSE
      EXIT
   ENDIF
ENDDO
? VAR1
? VAR2
? VAR3


FUNCTION MYFUN(var2) 
IF VAR2=0
   RETURN .T.
ENDIF
IF (LASTKEY()=5 .OR. LASTKEY()=24)
   RETURN .T.
ENDIF 
IF var2 > 9 
   RETURN .T.
ELSE 
   ALERT("O valor deve ser maior que 9 (mensagem na funcao)")
   RETURN .F.
ENDIF 
Entendí que você queria navegar entre os GETs (eu não tinha incluirdo a opção de setinha pra baixo), mas de todas as formas a idéia que queria passar é que você alterando o GETSYS estaria isentando SEMPRE a qualquer tipo de validação, me corrija se eu estiver errado.

Desculpe Ademir, mas eu ainda não entendí qual seria a vantagem de fazer essa alteração no GETSYS. Para poder entender melhor, poderias postar o seu exemplo com GETSYS alterado ? E assim eu poder testar na prática ?
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.
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

Pablo. Na verdade a vantagem está no fato de não precisar configurar a setinha para cima em mais nenhuma função que valide gets. Na verdade, eu queria mesmo era tentar entender um pouco do GETSYS. Os testes que fiz deram certo, mas por via das duvidas, voltei a trabalhar no modo antigo que não é tão ruim assim e já funciona e bem ha muito tempo. Vou tentar me aprofundar um pouco mais na GETSYS, pois ví que atraves dela, podemos melhorar em muito alguns recursos de sistema. Mesmo assim valeu. É assim, trocando informações, que conseguimos aprimorar nosso trabalho. Acho que é esse o intuito desse forum.
Um grande abraço.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Se você pretende continuar com Clipper ainda por um bom tempo, sim, é uma ótima idéia alterar o GETSYS e implementar novos recursos. Mas vai precisar dispor de um bom tempo pra isso. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
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á

Mensagem por Pablo César »

Ademir escreveu:Vou tentar me aprofundar um pouco mais na GETSYS, pois ví que atraves dela, podemos melhorar em muito alguns recursos de sistema.
É isso mesmo !. Faz bem você em meter as caras com o intuito de aprender. Realmente tem muitos recursos que poderia ser tratados através do GETSYS. Você já viu estes tópicos, irão aflorar idéias nas mais inusitados recursos do GETSYS:

https://pctoledo.org/forum/viewto ... 59&start=0
https://pctoledo.org/forum/viewto ... 25&start=0
https://pctoledo.org/forum/viewto ... ght=getsys
É assim, trocando informações, que conseguimos aprimorar nosso trabalho. Acho que é esse o intuito desse forum.
Com certeza colega !. Foi por isso que eu estava curioso para ver seu GETSYS. Mas acredito que você conseguiu boas experiências expandindo seu conhecimento.
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.
Ademir
Usuário Nível 3
Usuário Nível 3
Mensagens: 170
Registrado em: 31 Jul 2007 16:28
Localização: Porto Ferreira-SP

Mensagem por Ademir »

Bom dia Pablo !

Desculpe não ter enviado a alteração que fiz na GetSys. A correria tá enorme. Lá vai a alteração. Alterei apenas a GetPostValidate.


/***
*
* GetPostValidate( <oGet>, <aMsg> ) --> lValid
*
* Test exit condition (VALID clause) for a GET
*
* NOTE: Bad dates are rejected in such a way as to preserve edit buffer
*
***/
FUNCTION GetPostValidate( oGet, aMsg )

LOCAL lSavUpdated
LOCAL lValid := .T.
LOCAL nCursor // Added.

IF ( oGet:exitState == GE_ESCAPE )
RETURN ( .T. )
ENDIF

// IF ( oGet:exitState == GE_UP ) // alteração
// oGet:assign() // alteração
// RETURN ( .T. ) // alteração
// ENDIF // alteração

IF ( oGet:badDate() )
oGet:Home()
DateMsg()
ShowScoreboard()
RETURN ( .F. )
ENDIF

// If editing occurred, assign the new value to the variable
IF ( oGet:changed )
oGet:assign()
saStatics[ SLUPDATED ] := .T.
ENDIF

// Reform edit buffer, set cursor to home position, redisplay
nCursor := SETCURSOR() // Added.
oGet:reset()
SETCURSOR( nCursor ) // Added.

// Check VALID condition if specified
IF !( oGet:postBlock == NIL )

lSavUpdated := saStatics[ SLUPDATED ]

// S'87 compatibility
IF VALTYPE( oGet:Buffer ) == "C"
SETPOS( oGet:row, oGet:Col + LEN( oGet:Buffer ) )
ENDIF

lValid := EVAL( oGet:postBlock, oGet, aMsg )

// Reset S'87 compatibility cursor position
SETPOS( oGet:row, oGet:Col )

ShowScoreBoard()
oGet:updateBuffer()

saStatics[ SLUPDATED ] := IIF( oGet:changed, .T., lSavUpdated )

IF ( saStatics[ SLKILLREAD ] )
oGet:exitState := GE_ESCAPE // Provokes ReadModal() exit
lValid := .T.

ENDIF
ENDIF

RETURN ( lValid )
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Mensagem por clodoaldomonteiro »

Vocês usam hints (box com memssagems) nos get´s dos campos?
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Meu GETSYS é modificado pra incluir não os hints propriamentes (balões), mas mensagens que são apresentadas na barra de auxílio (última linha do vídeo). Isso é bem simples de fazer. Você só precisa modificar o comando GET para aceitar mais uma cláusula, que agiria de forma combinada com o comando WHEN.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Responder