Tab por Enter

Delphi

10/02/2006

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

Felipeiw

Curtidas 0

Respostas

Leonardobhbr

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


GOSTEI 0
Felipeiw

Felipeiw

10/02/2006

Obrigado pela atencao Leonardo, mas mesmo fazendo isso nao funcionou.
abs


GOSTEI 0
Aerreira

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

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:
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;
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:
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;
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. :(


GOSTEI 0
Aerreira

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

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

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
POSTAR