Jump to content
Fórum Script Brasil
  • 0

Tab Por Enter


Eder
 Share

Question

Ola..pessoal..

eu já estou pra ver este problema a algum tempo....seguinte

eu uso este codigo pra trabalhar com enter no form:

propriedade KeyPreview=True

No Form onkeypress

Begin
   If Key = #13 then 
Begin
   Key := #0;
   Perform(WM_NextDlgCtl, 0, 0);
End; 
End;

O Codigo funciona legal...exceto com DBLookupComboBox, POIS quando o usuario pega a lista do DBLookupComboBox, tipo um nome la do meio com o enter ou com as flexinhas do teclado ele não busca...ai o usuario tem que selecionar no mouse ai da certo...isto é um saco...eu concordo com o usuario..e teria que achar uma maneira de funcionar corretamente sem ter que pegar o mouse.

Daria pra adpatar este codigo acima ou outro codigo que funcione 100%

procurei outros codigos mais sempre a uma falha nos que achei....

muito Grato

Link to comment
Share on other sites

19 answers to this question

Recommended Posts

  • 0
Guest --jonas --

já tive este problema, resolvi desta maneira:

Não esqueça de definir do Type

procedure MudarComEnter(var Msg: TMsg; var Handled: Boolean);

Faça a chamada no FormActive do formulario

Application.OnMessage := MudarComEnter;

procedure TForm1.MudarComEnter(var Msg: TMsg; var Handled: Boolean);
begin
   If not ((Screen.ActiveControl is TCustomMemo) or   // se não for um memo
     (Screen.ActiveControl is TDBLookupComboBox) or  // se não for um DbLookup
     (Screen.ActiveControl is TCustomGrid) or // se não for uma grid o controle mudara com enter
     (Screen.ActiveForm.ClassName = 'TMessageForm')) then
   begin
     If Msg.message = WM_KEYDOWN then
        begin
           Case Msg.wParam of
              VK_RETURN,VK_DOWN : Screen.ActiveForm.Perform(WM_NextDlgCtl,0,0);   //,VK_TAB
              VK_UP : Screen.ActiveForm.Perform(WM_NextDlgCtl,1,0);
           end;
        end;
   end;
end;

Link to comment
Share on other sites

  • 0
Guest --Jonas --
Jonas

O que você quer dizer:

Não esqueça de definir do Type

porque montei ...e deu este erro:

[Error] Ajuste.pas(802): Object or class type required

Grato

Não esqueça de definir no Type, ou seja :

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, DBCtrls, Buttons, ExtCtrls, Grids, DBGrids, ComCtrls, ToolEdit,
  DBTables, Mask, Db, DBClient, Provider, typInfo, Mylabel, CurrEdit;

type
  TFAtesta = class(TForm)
    StaticText1: TStaticText;
    Panel1: TPanel;
.
.
.
.
  [color="#FF0000"] procedure MudarComEnter(var Msg: TMsg; var Handled: Boolean);[/color]

  private
    { Private declarations }
  public

se voce não definir aqui dá este erro que voce relatou ... ok ?

Link to comment
Share on other sites

  • 0

Jonas..perdão mais esta dando o mesmo erro:

nesta linha:

If Msg.message = WM_KEYDOWN then
erro: [Error] Ajuste.pas(803): Object or class type required fiz assim:
procedure TFormAjuste.FormKeyPress(Sender: TObject; var Key: Char);
begin
If not ((Screen.ActiveControl is TCustomMemo) or   // se não for um memo
     (Screen.ActiveControl is TDBLookupComboBox) or  // se não for um DbLookup
     (Screen.ActiveControl is TCustomGrid) or // se não for uma grid o controle mudara com enter
     (Screen.ActiveForm.ClassName = 'TMessageForm')) then
   begin
     If Msg.message = WM_KEYDOWN then
        begin
           Case Msg.wParam of
              VK_RETURN,VK_DOWN : Screen.ActiveForm.Perform(WM_NextDlgCtl,0,0);   //,VK_TAB
              VK_UP : Screen.ActiveForm.Perform(WM_NextDlgCtl,1,0);
           end;
        end;
   end;
end;
type:
procedure EditNFExit(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn); //TRATAMENTO DE erros bd
    //CODIGO DO ENTER
    procedure MudarComEnter(var Msg: TMsg; var Handled: Boolean);
    //
    private
    { Private declarations }
  public
    { Public declarations }
  end;
FormOnActivate:
procedure TFormAjuste.FormActivate(Sender: TObject);
begin
//CODIGO DO ENTER
Application.OnMessage := MudarComEnter;
end;

O que tem de errado??

Grato

Edited by Eder
Link to comment
Share on other sites

  • 0
Veja se voce não esqueceu de definir na clausula uses

Messages

R. também TINHA imaginado isto ...mas não é não...veja meu uses:

uses
  Windows, Messages, DbiProcs, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, StdCtrls, Mask, DBCtrls, DBTables, ExtCtrls, XiPanel, XiButton,
  ComCtrls, ActnList, Grids, DBGrids, Buttons, RxCalc, ToolEdit, CurrEdit,
  RXDBCtrl;

meu delphi é 4

será isto??

:(

Link to comment
Share on other sites

  • 0
Guest --Jonas --

[Error] Ajuste.pas(803): Object or class type required

Objeto ou tipo de classe requerido

Isto indica que esta faltando alguma coisa a ser definida

se o erro ocorreu nesta linha de codigo If Msg.message = WM_KEYDOWN then então com a inclusaão da clausula uses messages estaria resolvido;

estou usando o delphi 3, 5 e 7 o codigo funciona perfeitamente para os 3 ... ok ?

Link to comment
Share on other sites

  • 0

Cara...o erro tava que eu tava colocando o codigo maior no OnKeyPress do Form(você nem tinha notado também né?...rs).....ai fiz o correto e o erro não apareceu mais..compilou....

Mas não funcionou no meu form que estou trabalhando....fiz em um formTeste e funcionou mas no outro não...deve ter algo impedindo o funcionamento.....barrando.

Tens alguma ideia do que pode ser??.....simplismente ele não funciona..somente o TAB....

Grato :(

Link to comment
Share on other sites

  • 0
Guest --Jonas --
Cara...o erro tava que eu tava colocando o codigo maior no OnKeyPress do Form(você nem tinha notado também né?...rs).....ai fiz o correto e o erro não apareceu mais..compilou....

Mas não funcionou no meu form que estou trabalhando....fiz em um formTeste e funcionou mas no outro não...deve ter algo impedindo o funcionamento.....barrando.

Tens alguma ideia do que pode ser??.....simplismente ele não funciona..somente o TAB....

Grato :(

propriedade KeyPreview=True

voce esqueceu de mudar a propriedade do seu form : propriedade KeyPreview=False, voce pode ver as diferenças no form teste e o seu .... deixe as propriedades do seu form igual ao do form Teste .... ok ?

Link to comment
Share on other sites

  • 0

Jonas....no meu programa tem um problema, alias dois...

1-Tenho um codigo no OnKeyPress que verifica se o cara degitou letras....tive que desativar pra funcionar o seu......pois cada enter que eu dava chamava o showmessage

procedure TFormAjuste.EditKmInicialAKeyPress(Sender: TObject; var Key: Char);
begin
if key in['a'..'z',#13] then begin
key:= #0;
showmessage('Por Favor, Digite apenas Números');
end;
end;

2-Mesmo assim o TDBLookupComboBox nãu funcionar...venho com enter ate ele e depois dali pra frente só com tab senão ele não sai.

Mas eu notei no codigo ele ta habilitado a aceitar o TDBLookupComboBox, então não sei.

Estranho!!

Mas se no seu funciona....sei lá...agora ferrou.

Grato

Link to comment
Share on other sites

  • 0
O Codigo funciona legal...exceto com DBLookupComboBox, POIS quando o usuario pega a lista do DBLookupComboBox, tipo um nome la do meio com o enter ou com as flexinhas do teclado ele não busca...ai o usuario tem que selecionar no mouse ai da certo...isto é um saco...
mas é o que deveria ser o certo. Quando o cara não usa o mouse, o ENTER funciona como seleção. Se você intercepta o ENTER, o componente que não sabe de nada disso, fica sem esta informação. Mesmo trocando o ENTER por TAB, você terá sempre o mesmo problema porque o TAB indica mudança de campo (componente, edit, coluna...) e o fato de você sair de uma campo para outro não significa que você alterou alguma coisa nesta lista - ela só intende quando você move a lista fechada (ao digitar para localizar) e quando aberta, ao clicar com o mouse ou teclando ENTER. Então...
Daria pra adpatar este codigo acima ou outro codigo que funcione 100%
... acho pouco provável que ache um.

Tem ainda que lembrar que num TMemo ou TRichEdit, o ENTER é considerado quebra de linha. Num grid, se editável, coloca a célula em modo edição. Então, como fica isso também?

Tudo bem, você vai dizer que pode filtrar o tipo do componente, mas daí uma hora o cara tem que saber que em tal componente o ENTER é isso, no outro ele é aquilo... :huh: (acho que ele vai achar isto ainda mais chato)

Mesmo assim, naquele código que postou inicialmente (nas condições citadas), para não fazer toda aquela encrenca com OnMessage, bastaria que você alterasse para:

Begin
  if not (ActiveControl is TDBLookupComboBox) and  // você deve usar AND
     not (ActiveControl is TCustomGrid) then
    If Key = #13 then
    Begin
      Key := #0;
      Perform(WM_NextDlgCtl, 0, 0);
    End;
End;

Link to comment
Share on other sites

  • 0

Hum...entendi...porem o seu código não funciona perfeito.

quando faca em cima do DbLookupCombobox ele não deixa passar......só com tab...

FormKeyPress.

if not (ActiveControl is TDBLookupComboBox) and  // você deve usar AND
     not (ActiveControl is TCustomGrid) then
    If Key = #13 then
    Begin
      Key := #0;
      Perform(WM_NextDlgCtl, 0, 0);
    End;
ai retirei as linhas que você inseriu e voltar ao meu codigo inicial...e é a melhor forma ainda....voltei a estaca zero de onde comecei este tópico...hehehe Mas entendi tudo que você mencionou..que cada componente tem suas particularidades... Veja o que o usuario faz... quando chega no DbLookupCombobox ele pega o mouse seleciona o item..e depois ao invés de dar um click com o mouse em cima do item...ele da um enter...ai ele não é atendido.... entendeu??.... Mas beleza..vou continuar com meu código inicial e dar instruções ao usuario. ;) Haaa..Carinha......este codigo do enter...eu uso em cada form ....não teria uma maneira de eu colocar num lugar onde no programa todo seja aceito?? sem ter que inserir em cada form??
procedure TFormAjuste.FormKeyPress(Sender: TObject; var Key: Char);
begin
    If Key = #13 then
    Begin
      Key := #0;
      Perform(WM_NextDlgCtl, 0, 0);
    End;
end;

Valeu

muito Grato

:D

Link to comment
Share on other sites

  • 0
Haaa..Carinha......este codigo do enter...eu uso em cada form ....não teria uma maneira de eu colocar num lugar onde no programa todo seja aceito?? sem ter que inserir em cada form??
Neste caso, tem que ser processado no Application, então volte a questão do OnMessage proposto pelo Jonas - apenas trabalhei encima do seu exemplo por achar que simplificaria as coisas.

Infelizmente no componente TDBLookupComboBox não há uma propriedade DroppedDown, como nos descendentes de TCustomCombo (TComboBox). Com algo assim, você saberia que o cara está teclando o ENTER com a caixa de listas aberta e poderia tratar a tecla adequadamente.

Abraços

Link to comment
Share on other sites

  • 0

cara... não sei se vai ajudar... mas eu usei este código em uma tela padrão do meu sistema e em todos os forms eu consigo mudar de campo com o enter... até mesmo os DBLookUpComboBox

If Key = VK_RETURN then
     SelectNext(ActiveControl,True,True);

Espero ter ajudado...

Abraço

Link to comment
Share on other sites

  • 0

Bruno e Wagner..bza?

Seguinte VEJA a mensagem que eu tinha colocado no começo do tópico:

O Codigo funciona legal...exceto com DBLookupComboBox, POIS quando o usuario pega a lista do DBLookupComboBox, tipo um nome la do meio com o enter ou com as flexinhas do teclado ele não busca...ai o usuario tem que selecionar no mouse ai da certo...isto é um saco...eu concordo com o usuario..e teria que achar uma maneira de funcionar corretamente sem ter que pegar o mouse.

As suas dicas também não deram certo..mas valeu a tentativa :D

Por enquanto o usuario tem que acostumar que se mexer com o Mouse vai ter que ir até o fim da seleção. ;)

muito Grato

Link to comment
Share on other sites

  • 0
Por enquanto o usuario tem que acostumar que se mexer com o Mouse vai ter que ir até o fim da seleção. ;)
se o usuário não quer ter que usar o mouse, diga como utilizar as teclas para se movimentar em uma aplicação Windows:

- TAB => Avança próximo campo (tem que cuidar com a definição do TabOrder em sua aplicação)

- SHIFT + TAB => Retrocede ao campo anterior

em caixas de lista:

- ALT + seta para baixo (DOWN) => abre a caixa. Daí é só utilizar as setas (UP ou DOWN), PgUp ou PgDn para navegar na lista. Após posicionado no item tecla ENTER para selecionar. A caixa se fecha - TAB vai avançar.

- ALT + seta para cima (UP) => com a caixa aberta, fecha ela. Teclar ESC tem o mesmo efeito.

Apenas uma questão de hábito.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...