Tecla Esc

Delphi

14/02/2008

Primeiro uma pergunta: O que vem primeiro: O evento OnKeyPress do Form ou o OnExit de um componente, quando eu clico ESC? Apoergunta é por causa do seguinte.
No OnKeyPres do Form e u fiz
if Key = #27 then Fechar := True;

E no OnExit do meu TcxLookupComboBopx eu coloquei
if Fechar then begin Fechar := False; Exit; end;

Acontece que quando eu clico ESC, a variável vem False, então executa o restante do evento. Coloquei um break no OnExit e no OnKeyPress, e percebi que após o OnExit, ele(OnKeyPress) é chamado. Na minha opinião, os eventos do Form teriam prioridade. Tô certo? Grato e como resolver isso? Ou seja, ao clicar em ESC, sair sem executar o OnExit de qualquer componente.


Paulo

Paulo

Curtidas 0

Respostas

Rodrigoprado

Rodrigoprado

14/02/2008

testei o código e funcionou.

Veja se a propriedade do form keyPreview esta true e a variavel declare ela na seção private. ou public como desejar melhor.

flw


GOSTEI 0
Rodc

Rodc

14/02/2008

Coloque True no KeyPreview do Form.


GOSTEI 0
Paulo

Paulo

14/02/2008

Este é meu OnExit
procedure TfrmPDV.EDT_TotPagExit(Sender: TObject); var i:Integer; sTotal: Real; begin if Fechar then begin Fechar := False; Exit; end; if (EDT_TotPag.Text = ´´) or (EDT_TotPag.Text = ´0´) then Exit; sTotal := EDT_TotPag.Value; if VerificaCodPlano(EDT_CPagto.Text) then begin descacre := 0; LBL_TotCalc.Caption := LBL_SubTotal.Caption; descacre := stotal-(SubTotal); SubTotal := sTotal; if descacre < 0 then begin LBL_DescAcre.Style.Color := clRed; LBL_DescAcre.Caption := FormatFloat(´-0.00´, descacre); end else if descacre > 0 then begin LBL_DescAcre.Style.Color := clBlue; LBL_DescAcre.Caption := FormatFloat(´0.00´, descacre); end else begin LBL_DescAcre.Caption := ´0,00´; LBL_DescAcre.Style.Color := clGreen; end; EDT_VPagto.EditValue := EDT_TotPag.EditValue; geraforma := -1; end; end;


E Este é meu OnKeyPress
procedure TfrmPDV.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #27 then Fechar := True; if key = 13 then begin key := 0; Perform(CM_DIALOGKEY, VK_TAB, 0); end; end;


Simplesmente se eu der ESC, o OnExit será executado, e não deveria. A Variavel Fechar vem False na primeira vez.


GOSTEI 0
Onjahyr

Onjahyr

14/02/2008

Tem uns artigos aqui na ClubeDelphi para tomar cuidado com o evento onExit, procura por eles (são 3 artigos de um só autor) e veja se vc está fazendo alguma coisa de errado.... é só pesquisar aqui na ClubeDelphi.

Blz.


GOSTEI 0
Rodrigoprado

Rodrigoprado

14/02/2008

if Key = #27 then
begin
key := 0; // ao clicar sempre deixe key ocmo 0
Fechar := True;
end;

if key = 13 then
begin
key := 0; // OK correto
Perform(CM_DIALOGKEY, VK_TAB, 0);
end;

{{Simplesmente se eu der ESC, o OnExit será executado, e não deveria. A Variavel Fechar vem False na primeira vez.}}

Este esc eh do form idependente se estiver em qualquer edit ou outro componente com foco eh global para a tela, se der esc entao a var vai receber true sim. esta correto.


GOSTEI 0
Rodc

Rodc

14/02/2008

Desde que o KeyPreview esteja habilitado.
Paulo, você habilitou o KeyPreview do Form?


GOSTEI 0
Paulo

Paulo

14/02/2008

está habilitado sim. Tá estranho aqui. Vou ver minha lógica amanhã e posto a vocês.


GOSTEI 0
Paulo

Paulo

14/02/2008

Deixa eu tentar explicar melhor o q ta acontecendo:

Tenho um Edit, com códigos no OnExit, conforme coloquei acima. Quando estou neste componente e Teclo <ESC>, ele sai do Edit e executa o código do OnExit, ou seja, a variável Fechar vem [color=red:fcf34415fb]False[/color:fcf34415fb]. Logo em seguida dou um <ENTER> e caio novamente no Edit. Dou um <ESC> e não executa o Código do OnExit, porque a variável Fechar vem [color=green:fcf34415fb]True[/color:fcf34415fb]. Esse é o pau que está dando aqui, é questão de lógica eu sei, mas não consegui ainda fazer o certo.


GOSTEI 0
Paulo

Paulo

14/02/2008

Mas tem algo interessante: Se eu der SHIFT+TAB, ele volta sem problemas, sem executar o OnExit.


GOSTEI 0
Paulo

Paulo

14/02/2008

Tem como capturar o Shift+Tab e simular teclando ESC ou to sonhando demais?


GOSTEI 0
Paulo

Paulo

14/02/2008

Pessoal, resolve meu problema. Após quebrar a cabeça, fiz o seguinte e muito fácil,ehehehehehe.

Peguei o ActiveControl no teclar o <ESC>, e fiz:
If activecontrol.name = ´Nome_do_componente_anterior´ then Exit;


Isso resolveu todo minha dúvida deste post. valeu a todos.


GOSTEI 0
POSTAR