stavarengo / delphi-tdi

Delphi class to create applications that work with tabs similar to what we see in browsers.
http://www.devmedia.com.br/artigo-clube-delphi-110-formularios-em-abas/14379
37 stars 23 forks source link

Evento OnKeyPress não é disparado nos forms dentro das abas #5

Open rpsilveira opened 7 years ago

rpsilveira commented 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

REDIDSOFT commented 5 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.

rpsilveira commented 5 years ago

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.

geovanevdm commented 4 years ago

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.

geovanevdm commented 4 years ago

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;

helio65 commented 4 months ago

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???

RobertoCarlosAlcedoGarcia commented 3 months ago

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.