Página 2 de 5

Cancelar Operação

Enviado: 28 Dez 2015 18:29
por microvolution
Prezado professor JQuintas, do seu código funcionou (em parte), mas, em algum momento o cancelamento acontece, e, então, vou estudá-lo melhor pois me parece ser mais prático. Enquanto não consigo melhorá-lo voltei para o meu.
Por hora, fico ainda tentando usar o meu, que dá alguns desconfortos mas, está funcionando.
Bom, pessoal, observem minha imagem abaixo:
ESC com funcionalidades estranhas.
ESC com funcionalidades estranhas.
Então é o seguinte, para os GETs estão funcionando corretamente.
Só que observem que esta imagem o usuário está no cadastro de orçamentos (pci10001).
Mas, num determinado momento ele pressionou (dentro de um dos GETs) a função F2 para usar a CALCULADORA ou CALENDÁRIO ou qualquer outra opção disponível no sub-menu UTILITÁRIOS.
Então ao sair da CALCULADORA, etc, ele pressionou ESC e até aí funcionou sem nenhum problema. Agora ao pressionar a tecla ESC novamente para sair do sub menu UTILITÁRIOS, o sistema interpretou que deveria perguntar se realmente era pra sair com a mensagem:
TECLA <ESC> FOI PRESSIONADA ???
? DESEJA REALMENTE CANCELAR SEM CONCLUIR
<SIM> <NÃO>
Então, nem se pressionar SIM ou NÃO, o sistema fica em loop e não "sai de jeito nenhum"!
Ops, só sai se clicar no <X> da janela que está programado para fazer outra pergunta e se confirmada com <SIM> aí o sistema é fechado completamente.
Mas, isso pra nós não é constrangimento algum. Agora para o usuário que está fazendo um orçamento e de repente o sistema não vai nem pra frente e nem para trás, ele(a) vai nos mandar pra tudo quanto é lugar, e, isso pode dar um desgaste com o nosso cliente que nos paga para o sistema funcionar "tinindo".
O estranho e, que não consigo compreender que o código está assim:

Código: Selecionar todos

... diversos GETs
...
                  bOldBlock := SetKey( K_ESC, {|| escape_or_stay() } )
                  readexit (.t.)
                  read
                  // MyRead() // acrescentado temporariamente como sugestão do JQuintas/pctoledo 28/12/15w. // eliminado temporariamente 28/12/15w.
                  readexit (.f.)
                  SetKey( K_ESC, bOldBlock )
A função SETKEY() já postei anteriormente...
Então, para entrar nesse sub-menu UTILITÁRIOS o usuário pressiona F2, ou seja, pelas linhas:

Código: Selecionar todos

...
     set key TECLA_UTIL to UTIL_PROG
function UTIL_PROG (PROGRAMA,LINHA,VARIAVEL)
     aadd (MATRIZ,{'Dos               ',{|| DOS ()}})
     aadd (MATRIZ,{'Calend rio        ',{|| CALENDARIO (VARIAVEL)}})
     aadd (MATRIZ,{'Calculadora       ',{|| CALCULADORA (VARIAVEL)}})
     aadd (MATRIZ,{'Tabela ASCII      ',{|| TAB_ASCII (VARIAVEL)}})
     aadd (MATRIZ,{'Impressora        ',{|| IMPRESSORA ()}}) // mudado de IMPRESSO para IMPRESSORA 28/2/15w para poder compilar em Harbour
     aadd (MATRIZ,{'Editor            ',{|| EDITOR ()}})
...
Enfim este código acima, não importa, o que importa é que no momento em que o usuário tecla "ESC" no lugar de sair e voltar ao GET o sistema entende que está num dos GETs e não sai, mas, sim abre a pergunta se é pra sair sem concluir, e, aí, entra em loop e não sai... só fica por aí...
Noutros lugares acontecem o mesmo.
Alguém tem alguma ideia de como resolver?
Abraços!

Cancelar Operação

Enviado: 28 Dez 2015 20:09
por JoséQuintas
Nota: Nessa parte de fonte cria o array, mas não é aí que executa.

Ficar alterando tecla padrão é problema.

Mas moleza... em partes...

Seu próprio fonte já tem a resposta.
No READ, transforma ESC na pergunta.

Ao acionar os utilitários, que antes saía com ESC, agora não sai, porque ESC ficou configurado pra fazer a pergunta, por isso não consegue sair mais.

Solução: salvar/desativar/restaurar a ação de ESC quando entrar/sair na rotina (é bom revisar todos os locais aonde usou SetKey, e todas as teclas configuradas com SetKey)

Código: Selecionar todos

PROCEDURE utilitários
   LOCAL bSetKey
   bSetKey := Setkey( K_ESC, NIL ) // isto salva a configuração do ESC e volta o ESC ao normal
   ...
   SetKey( K_ESC, bSetKey ) // isto devolve a configuração do ESC que estava antes
   RETURN
É isso.

Nota:
Usar SET KEY tem que ser com cuidado.
Não está alterando um único módulo, mas sim o aplicativo inteiro.
Por isso o lugar mais seguro seria dentro da GETSYS, pra ter certeza de que somente os GETs seriam alterados.
De qualquer forma, esqueci desse "efeito colateral", que durante os GETs podem ser acionadas outras funções, e TODAS elas são afetadas.

Nota2:
De repente agora pode se interessar pela GETSYS.
Melhor alterar um único fonte do que vários no aplicativo.
Nem precisaria mais do SET KEY em nenhum lugar (para o ESC do READ)

Cancelar Operação

Enviado: 28 Dez 2015 20:22
por JoséQuintas
Dúvida:

Vai colocar em todos os READ as chamadas ReadExit( .T. ) e ReadExit( .F. ) ?

Cancelar Operação

Enviado: 29 Dez 2015 04:46
por Jairo Maia
José, porque você não considera a redefinição de comando usando um arquivo head que tenha nos PRGs com READ, como o inkey.ch por exemplo. Preferencialmente fazendo uma cópia para a pasta do projeto mantendo o original do Harbour e alterando a cópia. Exemplo:

Código: Selecionar todos

#command READ                                         ;
         => SetKey( K_ESC, { || escape_or_stay() } )  ;;
            SetKey( K_PGUP, { || Nil } )              ;;
            SetKey( K_PGDN, { || Nil } )              ;;
            ReadModal(GetList)                        ;;
            GetList := {}                             ;;
            ( GetList )                               ;;
            SetKey( K_ESC, K_ESC )                    ;;
            SetKey( K_PGUP, K_PGUP  )                 ;;
            SetKey( K_PGDN, K_PGDN  )
Nota: ReadExit() acho que não precisa, mas se necessária é só acrescentar. Não pode ser uma opção a alterar o GETSYS?

Nota1: Também pelas imagens, está sendo usado PTISO mas não está sendo desabilitado COMPATBUFFER.

Cancelar Operação

Enviado: 29 Dez 2015 08:45
por JoséQuintas
Trocar READ por MyRead() seria mais interessante.
Talvez isso pelo #command.

Usando #command, com toda configuração, todas as linhas do READ serão multiplicadas na compilação e dentro EXE.
Dependendo da quantidade de READs, isso pode ser muito.

Cancelar Operação

Enviado: 29 Dez 2015 11:04
por microvolution
Srs. bom dia!
tô gostando de ver a discussão entre os 2 "dinossauros/titãs" do clipper/harbour...
estou no win xp 32 bits e aqui não está dando certo minha configuração de compilação. Vou testar as orientações sugeridas pelo professor JQuintas - no win 10 64 bits, e, em breve posto o resultado. :))

Cancelar Operação

Enviado: 29 Dez 2015 14:01
por microvolution
JoséQuintas escreveu:Solução: salvar/desativar/restaurar a ação de ESC quando entrar/sair na rotina (é bom revisar todos os locais aonde usou SetKey, e todas as teclas configuradas com SetKey)
Mais uma vez professor, as suas informações funcionaram perfeitamente.
Agora, o código (aparentemente) ficou top d++++++.

Toda vez que eu quiser implantar o tratamento do ESC com o setkey ficou bom; não, digo, muito BOM!
JoséQuintas escreveu:Vai colocar em todos os READ as chamadas ReadExit( .T. ) e ReadExit( .F. ) ?
Vou implantar o tratamento do ESC somente em 2 lugares do sistema (por enquanto):
- no orçamento
- no clientes
São os 2 lugares de maior complexidade de dados; sem esquecer do cadastro de produtos, mas, ainda não o farei.
Abraços!

Cancelar Operação

Enviado: 30 Dez 2015 11:23
por JoséQuintas
Estou desconfiado de algo, então vamos a outra pergunta:

Porque colocou ReadExit(.T.) e ReadExit(.F.)

Cancelar Operação

Enviado: 05 Jan 2016 19:39
por microvolution
JoséQuintas escreveu: Por que colocou ReadExit(.T.) e ReadExit(.F.)?
Simples e elementar:
Os gets, só são encerrados ou com ESC ou com ENTER, e com o ReadExit em .t. podemos movimentar entre eles com seta para cima/baixo.
Ok?
vlw pela pergunta!

Cancelar Operação

Enviado: 05 Jan 2016 21:45
por Eolo
Simples e elementar:
Os gets, só são encerrados ou com ESC ou com ENTER, e com o ReadExit em .t. podemos movimentar entre eles com seta para cima/baixo.
Ok?
vlw pela pergunta!
Humm...

Cancelar Operação

Enviado: 05 Jan 2016 22:33
por JoséQuintas
E o aplicativo inteiro é assim?
Ou só alguns Gets?

Cancelar Operação

Enviado: 06 Jan 2016 08:07
por Jairo Maia
Olá Pessoal,

Apenas esclarecimentos:

Me parece que está se confundindo sair do Get com Sair do READ.
microvolution escreveu:Os gets, só são encerrados ou com ESC ou com ENTER
Os Gets são encerrados com ENTER, Seta acima e Seta abaixo. Inclusive quando setado Set Confirm ON. A navegação entre os Gets com as setas independe do estado de ReadExit() e também do estado de Set Confirm ON/OFF.

Já a saida do READ, pode ser com ESC, Page Down, Page Up ou ENTER (no ultimo Get). Também encerra o READ se estiver no primeiro Get e pressionar Seta acima, e se estiver no último Get pode pressionar Seta abaixo que também encerra o READ.

Setando ReadExit( .f. ), impede APENAS a saída do READ com as setas respectivamente quando estiver no primeiro ou último Get. Não inibe as demais teclas, somente as setas.

Exemplo:

Código: Selecionar todos

//Function Main()

  Local cTeste1:=cTeste2:=cTeste3:=Space(10)
  Local lOldRead:=ReadExit( .f. )  // se for .t. permite sair do READ com as setas

  Clear Screen
  Set Confirm ON

  @ 10, 30 Say "Digite algo " GET cTeste1 Pict "@!"
  @ 11, 30 Say "Digite algo " GET cTeste2 Pict "@!"
  @ 12, 30 Say "Digite algo " GET cTeste3 Pict "@!"
  READ

  ReadExit( lOldRead )

//Return Nil

Cancelar Operação

Enviado: 06 Jan 2016 10:06
por JoséQuintas
Mais que isso.
Permite navegar pelos gets com a seta.
O efeito colateral que é sair quando está no primeiro ou último. (que poderia ter sido previsto na getsys).

Só que não precisa ativar a cada GET, pode fazer uma única vez.

Cancelar Operação

Enviado: 06 Jan 2016 10:26
por asimoes
Vejam um pequeno exemplo considerando uma validação no get para retornar a um get anterior usando seta para cima

Código: Selecionar todos


@ aCoord1[1]+04,aCoord1[2]+19       GET   cProtItbi                                                     ;
                                          PICT "@KR !999999"                                            ;
                                          VALID IF(LASTKEY()=K_UP, .T.,                                 ;
                                          ZeroAntes(@cProtItbi)     .AND.                               ;
                                          BuscaDados(cProtItbi,"1") .AND.                               ;
                                          !EMPTY(cProtItbi)         .AND.                               ;
                                          cProtItbi<>"0000000"      )                                   ;
                                          WHEN cOperacao == "I"

READ


Cancelar Operação

Enviado: 06 Jan 2016 11:11
por asimoes
Trabalhando com VALID E WHEN

Código: Selecionar todos

    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" VALID {||IF(LastKey()=K_UP, .T., IF(cConvenio="S", !Empty(dData),.T.))}  WHEN {|| IF(cConvenio = "N", dData:=CTOD(""),.T.), .T. }
       ReadExit(.T.)
       READ