Cancelar Operação

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

Não entendi porque os codeblocks.
Aqui criei uma função só pra deixar esse tipo de coisa mais legível, apesar que dependendo do caso, faria diferente.
E minha GetSys alterada atualiza a tela mesmo em WHEN .F.

Código: Selecionar todos

   ReadExit(.T.)
   cConvenio:=" "
   dData  :=CTOD("06/01/2016")
   @ 10,00 SAY "Convenio:" GET cConvenio PICTURE "!" VALID cConvenio $ "SN" COLOR "GR+/B,B/W*"
   @ 11,00 SAY "Data  :" GET dData  PICTURE "@D" ;
      WHEN ReturnValue( .T., dData := iif(cConvenio = "N", Ctod(""), dData ) .AND. cConvenio == "S"
      VALID LastKey() == K_UP .OR. .NOT. Empty( dData )
   READ

FUNCTION ReturnValue( xValue, ... )
   RETURN xValue
Importante:
No WHEN, cConvenio == "S" precisa estar em segundo lugar, senão a otimização pula o cálculo.
No VALID dispensa a checagem de cConvenio, porque quando não precisa data já é resolvido pelo WHEN
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

Ou numa variação:

Código: Selecionar todos

ReadExit(.T.)
 cConvenio:=" "
 dData :=CTOD("06/01/2016")
 @ 10,00 SAY "Convenio:" GET cConvenio PICTURE "!" COLOR "GR+/B,B/W*" ;
   VALID ReturnValue( cConvenio $ "SN" , dData := iif( cConvenio == "N", Ctod( "" ), dData ) )
 @ 11,00 SAY "Data :" GET dData PICTURE "@D" WHEN cConvenio == "S"
   VALID LastKey() == K_UP .OR. .NOT. Empty( dData )
 READ

FUNCTION ReturnValue( xValue, ... )
 RETURN xValue
Já que é o GET do convênio que causa mudança da data, talvez seja mais interessante deixar nele.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

E numa última variação:

Código: Selecionar todos

 @ 10,00 SAY "Convenio:" GET cConvenio PICTURE "!" COLOR "GR+/B,B/W*" VALID ConvenioValid( cConvenio, @dData )
 @ 11,00 SAY "Data :" GET dData PICTURE "@D" WHEN cConvenio == "S"  VALID LastKey() == K_UP .OR. .NOT. Empty( dData )
 READ

STATIC FUNCTION ConvenioValid( cConvenio, @dData )
   IF cConvenio == "N"
      dData := Ctod("")
   ENDIF
   RETURN cConvenio $ "SN"
A linha fica bem legível.
E a declaração STATIC FUNCTION impede que outra função com mesmo nome altere o resultado.

Lembrando:
O fonte não é para o compilador, é pra nós.
Deu problema em validar o convênio... ok... só olhar a rotina ConvenioValid(), tá ali a rotina pequeninha, fácil de entender, e fácil de alterar.
Mais fácil do que complicar mais ainda o codeblock com exceções (pra outros casos).

"Dividir um problema grande em problemas pequenos. Acaba tudo resumido a resolver problemas pequenos".

Lógico... sem criar dependências, pra não criar infinitos probleminhas....
Nesse caso a função ConvenioValid() tem exatamente tudo que precisa pra funcionar, não depende de nada PRIVATE ou PUBLIC.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Cancelar Operação

Mensagem por asimoes »

Quintas,

Eu até tentei testar o seu exemplo, mas como o seu getsys está customizado, não deu, dá erro.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

A getsys alterada é só pra questão de atualizar tela.

Se deu erro é porque digitei errado.
Digitei direto no post.
Vou testar as três.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

Foi questão de faltar fechar parêntesis e faltar ponto e vírgula pra continuação.
O curioso foi acusar erro em codeblock sem ter codeblock.... rs

As três juntas, passando na compilação, liquedição e execução.
Sem a getsys alterada, é provável que o campo dData não seja atualizado na tela, apesar de ter seu conteúdo atualizado.
(algo como oGet:Display() na getsys).
No teste nem vai dar pra perceber, porque a data é o último campo, e a atualização não faz falta.

Código: Selecionar todos

#include "inkey.ch"

PROCEDURE Main
   ReadExit( .T. )
   DO Teste1
   DO Teste2
   DO Teste3
   RETURN


PROCEDURE Teste1
   LOCAL cConvenio := " ", dData := Date(), GetList := {}
   cConvenio:=" "
   dData :=CTOD("06/01/2016")
   @ 10,00 SAY "Convenio:" GET cConvenio PICTURE "!" VALID cConvenio $ "SN" COLOR "GR+/B,B/W*"
   @ 11,00 SAY "Data :" GET dData PICTURE "@D" ;
      WHEN ReturnValue( .T., dData := iif(cConvenio = "N", Ctod(""), dData ) ) .AND. cConvenio == "S" ;
      VALID LastKey() == K_UP .OR. .NOT. Empty( dData )
   READ
   RETURN

PROCEDURE Teste2
   LOCAL cConvenio := " ", dData := Date(), GetList := {}
   cConvenio:=" "
   dData :=CTOD("06/01/2016")
   @ 10,00 SAY "Convenio:" GET cConvenio PICTURE "!" COLOR "GR+/B,B/W*" ;
      VALID ReturnValue( cConvenio $ "SN" , dData := iif( cConvenio == "N", Ctod( "" ), dData ) )
   @ 11,00 SAY "Data :" GET dData PICTURE "@D" WHEN cConvenio == "S" ;
      VALID LastKey() == K_UP .OR. .NOT. Empty( dData )
   READ
   RETURN

PROCEDURE Teste3
   LOCAL cConvenio := " ", dData := Date(), GetList := {}
   @ 10,00 SAY "Convenio:" GET cConvenio PICTURE "!" COLOR "GR+/B,B/W*" VALID ConvenioValid( cConvenio, @dData )
   @ 11,00 SAY "Data :" GET dData PICTURE "@D" WHEN cConvenio == "S" VALID LastKey() == K_UP .OR. .NOT. Empty( dData )
   READ
   RETURN

STATIC FUNCTION ConvenioValid( cConvenio, dData )
   IF cConvenio == "N"
      dData := Ctod("")
    ENDIF
    RETURN cConvenio $ "SN"

FUNCTION ReturnValue( xValue, ... )
   RETURN xValue
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

Só comentário adicional...

Numa das tentativas antigas de atualização, criei GetDisabled()
Algo deste tipo:

Código: Selecionar todos

@ 1, 0 GET campo1
@ 2, 0 GET campo2 WHEN GetDisabled()
@ 3, 0 GET campo3 WHEN GetDisabled()
@ 4, 0 GET campo4 
READ

FUNCTION GetDisabled()
   IF LastKey() == K_UP
      KEYBOARD Chr( K_UP )
   ELSE
     KEYBOARD Chr( K_DOWN )
   ENDIF
   RETURN .T.
O WHEN apenas envia comandos pra pular o campo, assim a atualização de tela acontece.
Mas isso foi antes de mexer na getsys e resolver de vez.
Dependendo da validação do campo, isso não resolvia.

Nota:
Se o usuário está indo em frente - down, se está voltando up. segue a sequência e apenas pula o campo.

Nota2:
Com certeza essa saída aumentava e complicava mais os fontes.
Revisar o que já foi feito ajuda a melhorar o que vém pela frente.
Isso vale pra todo mundo, e sempre.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

Minhas duas versões de alteração na getsys pra isso:

Código: Selecionar todos

   WHILE !( nPos == 0 )
       // novo parte 1 - salva conteúdo antes do get
        aVarGet := Array( Len( GetList ) )
        FOR nCont = 1 TO Len( GetList )
           aVarGet[ nCont ] := GetList[ nCont ]:VarGet()
        NEXT
//      DispBegin()
//      FOR nCont = 1 TO Len( GetList ) // by JPA, atualizar Gets na tela
//         GetList[ nCont ]:Display()     // by JPA, atualizar Gets na tela
//      NEXT
//      DispEnd()

      PostActiveGet( oGet := GetList[ nPos ] )

      IF ( VALTYPE( oGet:reader ) == "B" )
         EVAL( oGet:reader, oGet )    // Use custom reader block
      ELSE
         GetReader( oGet, lIsMouse )            // Use standard reader
      ENDIF
// novo parte 2 - atualiza só o que teve conteúdo alterado
      FOR nCont = 1 TO Len( GetList )
         IF aVarGet[ nCont ] != GetList[ nCont ]:VarGet()
            GetList[ nCont ]:Display()
         ENDIF
      NEXT
      nPos := Settle( GetList, nPos )

   ENDDO
A primeira está comentada: atualizava sempre tudo.
A segunda, já atualiza somente aonde o conteúdo se modificou.
No when não dá certo, senão só atualiza os campos aonde tem when, e somente quando passar no when.
Isso eliminou muitos GetDisabled() que eu usava antes, e já resolveu pra gets ativos, que o GetDisabled() não resolvia.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Cancelar Operação

Mensagem por asimoes »

Quintas,

Estou habilitando o mouse no teste, só que quando vai para o foco do campo pega o conteúdo de outro?
Tem que fazer alguma coisa para fazer o mouse funcionar corretamente com get..read ?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Cancelar Operação

Mensagem por asimoes »

O que eu não estou entendendo é o seguinte:

Vou simplificar o que está acontecendo:

Quando pega foco no campo cConvenio o readvar() mostra CCONVENIO quando muda o foco com o mouse para o campo dData e volto o foco para o campo cConvenio com o mouse a função VerGet mostra DDATA, isso não ocorre com o uso do teclado, o readvar() mostra corretamente.

Código: Selecionar todos

Set( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE )
cConvenio:=Space(1)
dData:=CTOD("")

@ 10,00 SAY "Convenio" GET cConvenio WHEN VerGet()
@ 11,01 SAY "Data"      GET dData
READ

FUNCTION VerGet
   Alert(ReadVar())
RETURN .T.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

Interessante.

Está com o foco em cConvenio, clicou com o mouse, mostra cConvenio.

Está com o foco em dData, clicou com o mouse em cConvenio e.......

Primeiro verifica WHEN, pra ver se deixa ou não entrar em cConvenio.
O retorno está correto, porque ainda não saiu de dData.

Mas na hora da programação, é uma boa pegadinha.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Cancelar Operação

Mensagem por Jairo Maia »

Olá Pessoal,
JoséQuintas escreveu:O retorno está correto, porque ainda não saiu de dData.
Não, Não! Saiu sim... :?

Concordo com o Alexandre. Com o teclado funciona OK! O problema está com o mouse. Então José, que tal colocar o exemplo do Alexandre no Harbour Developers que inclusive o Viktor sempre lhe dá atenção?

PS: Caso a sugestão for aceita, precisa acrescentar a linha #include "inkey.ch" no inicio do exemplo.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

A primeira coisa é aquela pergunta: é assim no Clipper? se for... vai continuar.

Mas à primeira vista, o WHEN é antes de chegar no get.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Cancelar Operação

Mensagem por JoséQuintas »

Minha getsys é do tempo do clipper:

Código: Selecionar todos

  IF ( GetPreValidate( oGet ) )

      // Activate the GET for reading
      oGet:setFocus()
Primeiro executa WHEN() e dependendo do resultado, o get entra em foco. oGet:SetFocus()
Então o WHEN é antes de chegar no get.

A não ser que no Clipper 5.3 fosse diferente, mas acho difícil.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Cancelar Operação

Mensagem por asimoes »

Quintas,

O primeiro foco é em cConvenio (não tem teclado ou mouse ainda) depois é que começa o problema ao usar o mouse, com teclado funciona normal.
Parece que com o mouse o último foco do mouse é que fica com o valor do GetActive() ou ReadVar()
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder