Open rpsilveira opened 7 years ago
Um problema chato na abordagem TDI usando Delphi é que o evento OnKeyPress não é disparado nos forms criados nas abas. Isso ocorre porque quando o form possui parent (
Form.Parent := PageControl.ActivePage
), o Delphi busca o form no topo da cadeia (no caso, o form principal) para invocar o evento.Isso pode impedir, por exemplo, simular tab ao pressionar enter (seja via evento ou algum componente).
Uma saída seria sobrescrever o metodo
TWinControl.DoKeyPress(var Message: TWMKey)
, mas ainda não consegui nada satisfatório.Para mais detalhes: http://stackoverflow.com/questions/42459722/onkeypress-event-ist-fired-when-form-has-a-parent
Bom dia rpsilveira, você conseguiu alguma solução viável para a questão da teclas no componente? Sucesso.
Bom dia rpsilveira, você conseguiu alguma solução viável para a questão da teclas no componente? Sucesso.
JRAVILES infelizmente não. Como eu utilizo o evento OnKeyPress somente para pular campos com enter, a solução alternativa foi replicar o evento para o form principal. Ainda não testei na versão mais recente do Delphi, mas acredito que deva estar do mesmo jeito.
Eu consegui uma solução para quem ainda estive procurando, no formulário principal é só repassar o evento para o form ativo no tabsheet, lembrando que a propriedade KeyPreview do form principal deve estar setada como true.
Coloque isso no evento KeyPress do form principal:
procedure TFormPrincipal.FormKeyPress(Sender: TObject; var Key: Char); begin if FTDI.PageControl.PageCount>0 then FTDI.Formulario(FTDI.PageControl.ActivePageIndex).OnKeyPress(Sender, Key); end;
Lembrando que isso pode ser feito com outros eventos que não funcionam.
Atualização, é necessário verificar se o evento OnKeyPress está setado no form carregado no tabsheet, abaixo segue o código corrigido, do contrário gera uma violação de acesso.
procedure TfrmMain.FormKeyPress(Sender: TObject; var Key: Char); begin if FTDI.PageControl.PageCount>0 then if Assigned(FTDI.Formulario(FTDI.PageControl.ActivePageIndex).OnKeyPress) then FTDI.Formulario(FTDI.PageControl.ActivePageIndex).OnKeyPress(Sender, Key); end;
Boa noite, Geovane! @geovanevdm Estou a criar um novo projeto e estou abrindo os formulários dentro de um TPanel. Estava com problemas justamente com os eventos OnKeyDown e OnKeyPress -> o primeiro já resolvi basicamente seguindo está sua dica, já o segundo mesmo o evento ocorrendo a navegação entre os controles não ocorre com a tecla enter [ Perform(Wm_NextDlgCtl,0,0); ] ... Estou a buscar na net alguma solução mais até o presente momento não obtive sucesso. Meu ambiente: Windows 11, Delphi 10.3.3 - o amigo poderia dar uma força???
Estou com o mesmo problema mas é no evento on create, mais precisamente o constructor, ele não excuta meu create e sim o do formulario.
Um problema chato na abordagem TDI usando Delphi é que o evento OnKeyPress não é disparado nos forms criados nas abas. Isso ocorre porque quando o form possui parent (
Form.Parent := PageControl.ActivePage
), o Delphi busca o form no topo da cadeia (no caso, o form principal) para invocar o evento.Isso pode impedir, por exemplo, simular tab ao pressionar enter (seja via evento ou algum componente).
Uma saída seria sobrescrever o metodo
TWinControl.DoKeyPress(var Message: TWMKey)
, mas ainda não consegui nada satisfatório.Para mais detalhes: http://stackoverflow.com/questions/42459722/onkeypress-event-ist-fired-when-form-has-a-parent