Tecla Esc
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
E no OnExit do meu TcxLookupComboBopx eu coloquei
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.
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
Curtidas 0
Respostas
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
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
14/02/2008
Coloque True no KeyPreview do Form.
GOSTEI 0
Paulo
14/02/2008
Este é meu OnExit
E Este é meu OnKeyPress
Simplesmente se eu der ESC, o OnExit será executado, e não deveria. A Variavel Fechar vem False na primeira vez.
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
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.
Blz.
GOSTEI 0
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.
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
14/02/2008
Desde que o KeyPreview esteja habilitado.
Paulo, você habilitou o KeyPreview do Form?
Paulo, você habilitou o KeyPreview do Form?
GOSTEI 0
Paulo
14/02/2008
está habilitado sim. Tá estranho aqui. Vou ver minha lógica amanhã e posto a vocês.
GOSTEI 0
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.
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
14/02/2008
Mas tem algo interessante: Se eu der SHIFT+TAB, ele volta sem problemas, sem executar o OnExit.
GOSTEI 0
Paulo
14/02/2008
Tem como capturar o Shift+Tab e simular teclando ESC ou to sonhando demais?
GOSTEI 0
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:
Isso resolveu todo minha dúvida deste post. valeu a todos.
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