Tab por Enter
Eu utilizou o codigo a seguir para mudar de campos com ENTER ao inves de TAB, porem com alguns componentes nao funciona, por exemplo com o RadioGroup, CheckBox, como posso resolver isso, obrigado.
procedure TF1Solicitacao.DBECodproKeyPress(Sender: TObject; var Key: Char); begin if (Key = #13) then begin SelectNext(Sender as tWinControl, True, True); Key := 0; end; end;
Felipeiw
Curtidas 0
Respostas
Leonardobhbr
10/02/2006
ao inves de
SelectNext(Sender as tWinControl, True, True);
eu uso
Perform(WM_NEXTDLGCTL,0,0);
mais eu acho q nao tem nada ver o que vc tem que ver é o seguinte se for windows xp por padrao checkbox radiobutton não são marcados quando selecionado para fazer que funcione igual o 98 voce terá que ir em propriedades de video\aparencia\efeitos\ e desmarcar Olcutar sublinhados para navegação do teclado ate eu apertar a tecla alt
SelectNext(Sender as tWinControl, True, True);
eu uso
Perform(WM_NEXTDLGCTL,0,0);
mais eu acho q nao tem nada ver o que vc tem que ver é o seguinte se for windows xp por padrao checkbox radiobutton não são marcados quando selecionado para fazer que funcione igual o 98 voce terá que ir em propriedades de video\aparencia\efeitos\ e desmarcar Olcutar sublinhados para navegação do teclado ate eu apertar a tecla alt
GOSTEI 0
Felipeiw
10/02/2006
Obrigado pela atencao Leonardo, mas mesmo fazendo isso nao funcionou.
abs
abs
GOSTEI 0
Aerreira
10/02/2006
Pelo que vejo aqui, vocês não tiveram solução nesse tópico, já experimentaram o componente EnterAsTab do Mike Heydon? É um bocado antigo e resolve pra mim em 100¬, e agora como Delphi2006 voltei a ter problemas, mas acabei conseguindo instalar. Se precisarem de mais informações, postem aqui.
GOSTEI 0
Micheus
10/02/2006
[b:08f37f0085]felipeiw[/b:08f37f0085],
no RadioGroup não há o evento keypress, talvez seja a isso que vc se refere quando diz que não funciona (não entendi direito).
No seu código, troque apenas o Sender por ActiveControl:
Acho que a solução para este procedimento seria bastante simplifica se as teclas fossem tratadas no evento OnKeyPress do form e não o de cada componente - já que vc quer substituir o padrão de movimentação de TAB para ENTER.
Gostaria de sugirir o seguinte:
1) Em cada form que vc quizer utilizar este recurso, configure a propriedade KeyPreview = True; Com isto toda tecla pressionada, neste form quando ativo, será enviada para ele;
2) Escreva o procedimento OnKeyPress do form:Observe que adicionei um teste referente a classe do componente que está com o foco atualmente. Isto porque imagino que o usuário ao estar digitando um texto dentro de um memo ou rich não desejará que o ENTER pressionado o mova para outro campo. Se não houver este tipo de componente, não haverá problema em remover o teste.
Este procedimento funcionou perfeitamente num form com Rich, Memo, Buttons, Checkbox, RadioGroup e até com o RadioButton - após setar a propriedade TabStop = True; Alias, esta propriedade determinará quem será posionado na seqüência, conforme parâmetro em SelectNext.
Mas...: Já que a idéia é mover-se por toda a tela utilizando o ENTER, acho que seria interessante amplicar o ´poder´ deste recurso. Que tal incluirmos , na verificação, o PageControl? Vai uma opção:Infelizmente não dá para separar o código num procedimento externo ao form, porque os métodos FindNextControl e SelectNex estão declarados como privados, de modo que não consegui dar jeito de compilar. :(
no RadioGroup não há o evento keypress, talvez seja a isso que vc se refere quando diz que não funciona (não entendi direito).
No seu código, troque apenas o Sender por ActiveControl:
de
SelectNext(Sender as tWinControl, True, True);
para
SelectNext(ActiveControl, True, True);
Mas acredito que não resolverá todos os seus problemas.Acho que a solução para este procedimento seria bastante simplifica se as teclas fossem tratadas no evento OnKeyPress do form e não o de cada componente - já que vc quer substituir o padrão de movimentação de TAB para ENTER.
Gostaria de sugirir o seguinte:
1) Em cada form que vc quizer utilizar este recurso, configure a propriedade KeyPreview = True; Com isto toda tecla pressionada, neste form quando ativo, será enviada para ele;
2) Escreva o procedimento OnKeyPress do form:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin if (ActiveControl is TMemo) or (ActiveControl is TRichEdit) then Exit; SelectNext(ActiveControl, True, True); Key := 0; end; end;
Este procedimento funcionou perfeitamente num form com Rich, Memo, Buttons, Checkbox, RadioGroup e até com o RadioButton - após setar a propriedade TabStop = True; Alias, esta propriedade determinará quem será posionado na seqüência, conforme parâmetro em SelectNext.
Mas...: Já que a idéia é mover-se por toda a tela utilizando o ENTER, acho que seria interessante amplicar o ´poder´ deste recurso. Que tal incluirmos , na verificação, o PageControl? Vai uma opção:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); var NextCtrl :TWinControl; begin if Key = #13 then begin Key := 0; if (ActiveControl is TMemo) or (ActiveControl is TRichEdit) then Exit; // verificamos se o componente ativo está colocado num TabSheet, // se for o caso... if ActiveControl.Parent is TTabSheet then begin // vamos obter o próximo componente na ordem normal de ativação. NextCtrl := FindNextControl(ActiveControl, True, True, False); // Se o componente atual for o último no TabSheet, isto resultará // em um componente fora do PageControl, então... // Selecionamos a próxima guia - TabSheet if NextCtrl.Parent <> ActiveControl.Parent then begin (ActiveControl.Parent.Parent as TPageControl).SelectNextPage(True, True); // Não fazemos mais nada. Já está posiconado no // 1º compontente do TabSheet Exit; end; end; SelectNext(ActiveControl, True, True); end; end;
GOSTEI 0
Aerreira
10/02/2006
Infelizmente não dá para separar o código num procedimento externo ao form, porque os métodos FindNextControl e SelectNex estão declarados como privados, de modo que não consegui dar jeito de compilar. :(
Dá sim, veja o código que postei nesse tópico: http://forum.clubedelphi.net/viewtopic.php?t=71066
GOSTEI 0
Micheus
10/02/2006
[quote:9f44ac9dd1]Infelizmente não dá para separar o código num procedimento externo ao form, porque os métodos FindNextControl e SelectNex estão declarados como privados, de modo que não consegui dar jeito de compilar. Sad
. Dá sim, veja o código que postei nesse tópico: http://forum.clubedelphi.net/viewtopic.php?t=71066[/quote:9f44ac9dd1]Já o havia visto este post. Eu quiz dizer, este código que postei por último. Não dá para separar o código em uma procedure - nem para adaptá-lo ao componente citado.Observe que o componente apenas troca o ENTER pelo TAB, e que não é somente esta a proposta final do código postado. O avanço entre as guias (TabSheet) no PageControls, nem o TAB faz - ao chegar no último componente na guia, o foco sai do PageControl para o próximo componente no Form.
GOSTEI 0
Micheus
10/02/2006
[quote:b4f9713dde]Infelizmente não dá para separar o código num procedimento externo ao form, porque os métodos FindNextControl e SelectNex estão declarados como privados, de modo que não consegui dar jeito de compilar. Sad
. Dá sim, veja o código que postei nesse tópico: http://forum.clubedelphi.net/viewtopic.php?t=71066[/quote:b4f9713dde]Já o havia visto este post. Eu quiz dizer, este código que postei por último. Não dá para separar o código em uma procedure - nem para adaptá-lo ao componente citado. :( Observe que o componente apenas troca o ENTER pelo TAB, e que não é somente esta a proposta final do código postado. O avanço entre as guias (TabSheet) no PageControls, nem o TAB faz - ao chegar no último componente na guia, o foco sai do PageControl para o próximo componente no Form. :o
[]s
GOSTEI 0