Aparente erro na lastkey()

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Aparente erro na lastkey()

Mensagem por cjp »

Código: Selecionar todos

...
               @ 0,5 BUTTON "Finalizar (Esc)" SIZE 140,50 ON CLICK {||ConfirmarFechar()}
			   
               @ 170,5 BUTTON "Consultar" SIZE 140,50 ;
                 ON CLICK {||consulta()}

               @ 340,5 BUTTON "Cadastrar" SIZE 140,50 ;
                 ON CLICK {||cadastro()}
     
               @ 510,5 BUTTON "Manutenção" SIZE 140,50 ;
                 ON CLICK {||manutencao()}

			   @ 5,540 SAY oSAY3 CAPTION "Pensamento do dia: "+cTxt SIZE 590, 170
			   
			endif

            ACTIVATE DIALOG oDlg

			if lastkey()=27
			   if confirmarfechar()="S"
			      return .f.
			   else
			      loop
			   endif
			else
               hwg_Msginfo( "Não entrou no lastkey=27: "+alltrim(str(lastkey())), "Message" )
			endif
Nesta versão da hwgui 2.23, estou tendo um problema com a lastkey(). Ao teclar ESC, ele não entra na if lastkey()=27. Coloquei a msginfo pra testar, está retornando 0 (zero).

Alguém pode me explicar? Teria alguma alternativa?
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Aparente erro na lastkey()

Mensagem por Itamar M. Lins Jr. »

Olá!
Mude sua forma de testar as saídas/encerramento das DIALOGS.
Crie uma variável para isso.

Código: Selecionar todos

Local lEsc := .F.
...
@ 0,5 BUTTON "Finalizar (Esc)" SIZE 140,50 ON CLICK {||lEsc := ConfirmarFechar(), iif(lEsc, hwg_EndDialog(), .T. /*Desistiu de fechar*/) }
Evite ficar tratando do teclado quando for encerrar(fechar uma dialog) fecha com ALT+F4, Com Botão, teclando no [X]...
Não precisa do DO WHILE... DIALOG TEM -> NOEXIT e NOEXITESC não sai da DIALOG TECLANDO ESC.

Isso aqui abaixo é código sem necessidade.

Código: Selecionar todos

 if lastkey()=27
            if confirmarfechar()="S"
               return .f.
            else
               loop
            endif
         else
               hwg_Msginfo( "Não entrou no lastkey=27: "+alltrim(str(lastkey())), "Message" )
         endif
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Aparente erro na lastkey()

Mensagem por JoséQuintas »

Isso já foi visto quando criou o primeiro menu.
Não existe Lastkey() em GUI.
GUI não é console.

Quando está DEFININDO a dialog, ela ainda não existe.
Ela só vai existir no ACTIVATE.
A partir do ACTIVATE é que o usuário vai exergar alguma coisa.
E só volta para o programa quando o usuário encerrar, fechar a diálog.

ANTES DO ACTIVATE, o usuário não enxergou nada, não tem que ficar perguntando nada.
DEPOIS DO ACTIVATE, o usuário já fechou tudo, não tem que perguntar se quer fechar.
Tudo que quiser fazer, vai ter que definir na DIALOG, nos eventos da dialog e nos eventos do conteúdo.
São eventos FUTUROS, não é igual console que dá pra ir fazendo desvios no fonte durante o uso da tela.
Se o usuário clicar no button, vai executar o que colocou no evento do button.
Se o usuário clicar no sair, vai executar o que colocou no evento de sair.
E assim por diante.
TUDO é definido ANTES DO ACTIVATE.
E tudo vai acontecer a partir do ACTIVATE, depende de onde o usuário clicar, e do evento associado ao usuário clicar em algum lugar.

Neste ponto, talvez tenha que rever suas rotinas, porque agrupou parte genérica com não genérica, e criou filtros/desvios diferentes, que dá pra fazer em console mas não em gui, pelo menos não da mesma forma.
Se não analisar direito, pode precisar 1000 dialogs ao invés de 1.
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
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Aparente erro na lastkey()

Mensagem por Itamar M. Lins Jr. »

Olá!
Como venho dizendo pra vc Inácio.
Tem diversas formas de fazer.
Tem essa que fiz, tem da forma que vc faz, abrindo e fechado a DIALOG dentro do DO WHILE .T.
Tem mais essa aqui: -> ON EXIT {||} no DIALOG veja código abaixo.
Screenshot_20240320_134649.png

Código: Selecionar todos

...
Function consultar
Local oDlg,oFont, cTitle := "Menu Consultar"
PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -16
INIT DIALOG oDlg CLIPPER NOEXIT TITLE cTitle Font oFont AT 0,0 SIZE 380,450 ON EXIT {|| hwg_MsgYesNo("Deseja encerrar ?") } ; 
                                                       STYLE  WS_POPUP+WS_VISIBLE+WS_CAPTION+WS_SYSMENU+DS_CENTER

@ 10,010 BUTTON "Finalizar"                               SIZE 350,30 On Click {||hwg_EndDialog()}
Então vc pode chamar o que desejar ao fechar cada JANELA DIALOG, pois o CODEBOCK ON EXIT {||} não tem limites.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Aparente erro na lastkey()

Mensagem por sygecom »

Talvez ajude usando GETKEYSTATE()
Ou coloque dentro da FUNCTION ConfirmarFechar
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Aparente erro na lastkey()

Mensagem por cjp »

@ 0,5 BUTTON "Finalizar (Esc)" SIZE 140,50 ON CLICK {||lEsc := ConfirmarFechar(), iif(lEsc, hwg_EndDialog(), .T. /*Desistiu de fechar*/) }
Desta forma não funcionou. Ao teclar ESC, não está pedindo confirmação, nem fechando diretamente, está voltando à tela normal.

Talvez ajude usando GETKEYSTATE()
Também não funcionou. Está dando erro na compilação, diz que não existe essa função.

Ou coloque dentro da FUNCTION ConfirmarFechar
Não sei se entendi. Se eu colocar a verificação dentro da confirmarfechar(), como ele vai chamar essa função? Atualmente, ao sair da ACTIVATE DIALOG oDlg, ele verifica a lastkey(). Se for 27 (ESC), daí ele abre a confirmarfechar(). Confirmando, sai. Não confirmando, volta à tela. Isso funcionava na versão 2.17, mas não está funcionando na 2.23, já que a lastkey() não está retornando 27, nem mesmo quando tecla ESC.


Isso já foi visto quando criou o primeiro menu.
Não existe Lastkey() em GUI.
GUI não é console.

Quando está DEFININDO a dialog, ela ainda não existe.
Ela só vai existir no ACTIVATE.
A partir do ACTIVATE é que o usuário vai exergar alguma coisa.
E só volta para o programa quando o usuário encerrar, fechar a diálog.

ANTES DO ACTIVATE, o usuário não enxergou nada, não tem que ficar perguntando nada.
DEPOIS DO ACTIVATE, o usuário já fechou tudo, não tem que perguntar se quer fechar.
Tudo que quiser fazer, vai ter que definir na DIALOG, nos eventos da dialog e nos eventos do conteúdo.
São eventos FUTUROS, não é igual console que dá pra ir fazendo desvios no fonte durante o uso da tela.
Se o usuário clicar no button, vai executar o que colocou no evento do button.
Se o usuário clicar no sair, vai executar o que colocou no evento de sair.
E assim por diante.
TUDO é definido ANTES DO ACTIVATE.
E tudo vai acontecer a partir do ACTIVATE, depende de onde o usuário clicar, e do evento associado ao usuário clicar em algum lugar.

Neste ponto, talvez tenha que rever suas rotinas, porque agrupou parte genérica com não genérica, e criou filtros/desvios diferentes, que dá pra fazer em console mas não em gui, pelo menos não da mesma forma.
Se não analisar direito, pode precisar 1000 dialogs ao invés de 1.
Entendi a teoria. Mas não estou sabendo fazer na prática (embora já tivesse feito, e estava funcionando na 2.17).
Tudo que eu queria é que a tecla ESC funcionasse da mesma forma que teclar no botão Finalizar, qual seja: pedir a confirmação do usuário se ele quer mesmo fechar. Com o botão, está funcionando bem. Com a tecla ESC não.

...
Function consultar
Local oDlg,oFont, cTitle := "Menu Consultar"
PREPARE FONT oFont NAME "MS Sans Serif" WIDTH 0 HEIGHT -16
INIT DIALOG oDlg CLIPPER NOEXIT TITLE cTitle Font oFont AT 0,0 SIZE 380,450 ON EXIT {|| hwg_MsgYesNo("Deseja encerrar ?") } ;
STYLE WS_POPUP+WS_VISIBLE+WS_CAPTION+WS_SYSMENU+DS_CENTER

@ 10,010 BUTTON "Finalizar" SIZE 350,30 On Click {||hwg_EndDialog()}
Assim funcionou. Tirando o do while, não preciso mais da função confirmarfechar().

Muito obrigado a todos.
Inacio de Carvalho Neto
Responder