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