Cancelar Operação

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Cancelar Operação

Mensagem 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!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
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 »

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)
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 »

Dúvida:

Vai colocar em todos os READ as chamadas ReadExit( .T. ) e ReadExit( .F. ) ?
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 »

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

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.
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/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Cancelar Operação

Mensagem 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. :))
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Cancelar Operação

Mensagem 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!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
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 »

Estou desconfiado de algo, então vamos a outra pergunta:

Porque colocou ReadExit(.T.) e ReadExit(.F.)
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/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Cancelar Operação

Mensagem 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!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Cancelar Operação

Mensagem 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...
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 o aplicativo inteiro é assim?
Ou só alguns Gets?
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,

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

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

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

►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 »

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