Se movendo com ENTER
02/12/2005
0
agradeço!!! lembrando nao quero trocar o foco para o proximo componente e sim para a proxima celula do grid.
The_holyman
Post mais votado
13/08/2006
Caro VIGGIANOJR, você precisa primeiro usar o código abaixo para registar o componente EnterAsTab no seu delphi. Depois basta usar o componente em sua aplicação. Aqui ([url]http://forum.clubedelphi.net/viewtopic.php?t=77891&highlight=[/url]) eu falo como instalar o componente no Delphi2006, em outros delphis anteriores basta abrir e compilar e instalar, nada muito complicado não.
Quanto à opinião do DMALTA, perteito! É isso mesmo... Concordo com você. Isso seria o ideal, mas realmente tem gente que quer, de qualquer modo, usar Enter para mudar de campo.
Mas veja bem, em qualquer teclado a tecla Enter recebe um destaque bastante maior que o Tab, muitos deles nem sequer tem escrito TAB, tem apenas duas setinhas... O Enter está muito mais destacado, é muito mais fácil de usar, veja numa entrada de dados numéricos por exemplo, se o usuário tiver que usar tab para inserir novos valores, funciona, mas concorda que terá que usar a mão esquerda para teclar TAB? E se o usuário estiver com a mão sobre uma lista de valores, com uma régua ou coisa semelhante para não se perder nos valores que está digitando, como vai dar o TAB? Com a mão direita!?! Coitadinho dele...
Existem casos e casos, por isso, usar o Enter no lugar do TAB sempre pode ser uma boa saida em muitos casos. Bom, essa é a minha opinião.
Aerreira
Mais Posts
04/12/2005
Sabado
No evento ´OnKeyPress´ do Form acrescente o código abaixo:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then begin
Key := 0;
Perform(WM_NEXTDLGCTL, 1, 0);
end;
end;
Em DBGrid, escreva o evento OnKeyPress como abaixo:
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = 13 then
DBGrid1.Perform(WM_KEYDOWN, VK_TAB, 0);
end;
O enter será utilizado como se fosse o TAB em toda a sua aplicação, inclusive para saltar entre as células do seu Tdbgrit
15/01/2006
Raserafim
16/01/2006
Titanius
Vejo dois problemas, que ainda não consegui solucionar, com este método:
1- Ao apertar o ENTER, ele dá um barulhinho no PC, no inicio se acha legal, mas com o tempo e com um cadastro com mais de 50 campos, fica chato ficar escutando o danado do barulho.
2- Dependendo do componente ele dá 2 ENTER, ou seja, o foco é passado pro componente cujo TabOrder é maior 2 vezes, por exemplo... isso acontece comigo nos seguintes componentes: ComboBox, DBComboBox, JvDBComboBox e etc...
Alguém sabe porque desses 2 problemas? e como soluciona-los?
[]s
16/01/2006
Michael
Tenho meus próprios componentes com uma propriedade [b:f4d0bab795]EnterToTab[/b:f4d0bab795], que os capacita para selecionar o próximo controle na lista de tabulação quando Enter é pressionado.
Nunca tive esses problemas de beep´s ou dupla mudança de foco. Será que meu speaker nunca funcionou? :-)
De qualquer forma, [b:f4d0bab795]SelectNext [/b:f4d0bab795]chama internamente [b:f4d0bab795]FindNextControl[/b:f4d0bab795], outro método de [b:f4d0bab795]TWinControl[/b:f4d0bab795], que faz um loop pela lista de componentes associados ao ´chamador´, isto é, com [b:f4d0bab795]Parent [/b:f4d0bab795]apontando para ele. Quero dizer que ele não chama [b:f4d0bab795]Perform [/b:f4d0bab795]nem tem uma chamada a [b:f4d0bab795]Beep[/b:f4d0bab795]. Talvez isso resolva o problema.
[]´s
17/01/2006
Titanius
Tenho meus próprios componentes com uma propriedade [b:b0c1ecb0b2]EnterToTab[/b:b0c1ecb0b2], que os capacita para selecionar o próximo controle na lista de tabulação quando Enter é pressionado.
Nunca tive esses problemas de beep´s ou dupla mudança de foco. Será que meu speaker nunca funcionou? :-)
De qualquer forma, [b:b0c1ecb0b2]SelectNext [/b:b0c1ecb0b2]chama internamente [b:b0c1ecb0b2]FindNextControl[/b:b0c1ecb0b2], outro método de [b:b0c1ecb0b2]TWinControl[/b:b0c1ecb0b2], que faz um loop pela lista de componentes associados ao ´chamador´, isto é, com [b:b0c1ecb0b2]Parent [/b:b0c1ecb0b2]apontando para ele. Quero dizer que ele não chama [b:b0c1ecb0b2]Perform [/b:b0c1ecb0b2]nem tem uma chamada a [b:b0c1ecb0b2]Beep[/b:b0c1ecb0b2]. Talvez isso resolva o problema.
[]´s[/quote:b0c1ecb0b2]
Fala ae Michael,
Você não poderia me fornecer o codigo desta função? Pois estou passando muita raiva com essa que eu uso... e quanto a propriedade.. legal isso, cmo eu faço uma ? :oops:
[]s
21/01/2006
Raserafim
como faço para evitar este beep?
21/01/2006
Godzilla_xf
if key= #13 then
begin
Perform (CM_DialogKey, VK_TAB, 0);
key:=0;
end;
e coloque a propriedade KeyPreview do forme para True.
16/07/2006
Aerreira
unit EnterTab; // ================================================================== // Mike Heydon - mheydon@eoh.co.za // Sep 2000 // // Component to GLOBALLY Enable/Disable Enter Key mapping as Tab Key. // The effect is application wide. // // 23/09/2000 - Modified to allow a list of components that // do not allow ENTER -> TAB ramapping // // Both the Keyboard and Keypad Enter keys may be set individually. // They both can be set to act as either ENTER or TAB keys // // Properties // KeyboardEnterType : TEnterAsTabKeyValue (kyTab or kyEnter) // KeypadEnterType : TEnterAsTabKeyValue (kyTab or kyEnter) // ExcludeComponents : TStringList (eg TMemo etc.) // // Methods // Enable Enables GLOBAL remapping of Enter Keys // Disable Disables GLOBAL remapping of Enter Keys // // ================================================================== interface uses Windows, Messages, Forms, Classes, Controls, SysUtils; type TEnterAsTabKeyValue = (kyTab,kyEnter); TEnterAsTab = class(TComponent) private SaveOnMessage : TMessageEvent; FExcludeComponents : TStringList; FKBenter, FKPenter : TEnterAsTabKeyValue; procedure SetExcludeComponents(NewValue : TStringList); protected procedure DoEnterAsTab(var Msg: TMsg; var Handled: Boolean); public constructor Create(AOwner : TComponent); override; destructor Destroy; override; procedure Enable; procedure Disable; published property KeyboardEnterType : TEnterAsTabKeyValue read FKBenter write FKBenter; property KeypadEnterType : TEnterAsTabKeyValue read FKPenter write FKPenter; property ExcludeComponents : TStringList read FExcludeComponents write SetExcludeComponents; end; procedure Register; // ------------------------------------------------------------------ implementation constructor TEnterAsTab.Create(AOwner : TComponent); begin inherited Create(AOwner); FKBenter := kyTab; FKPenter := kyTab; FExcludeComponents := TStringList.Create; FExcludeComponents.Add(´TBitBtn´); FExcludeComponents.Add(´TButton´); FExcludeComponents.Add(´TDBMemo´); FExcludeComponents.Add(´TDBRichEdit´); FExcludeComponents.Add(´TMemo´); FExcludeComponents.Add(´TRichEdit´); if not (csDesigning in ComponentState) then SaveOnMessage := Application.OnMessage; end; destructor TEnterAsTab.Destroy; begin FExcludeComponents.Free; end; procedure TEnterAsTab.DoEnterAsTab(var Msg: TMsg; var Handled: Boolean); type TEnterType = (KeyPad,KeyBoard); var EnterType : TEnterType; CurrControl : TWinControl; i : integer; Excluded : boolean; begin if Msg.Message = WM_KEYDOWN then begin if Msg.wParam = VK_RETURN then begin Excluded := false; CurrControl := Screen.ActiveControl; for i := 0 to FExcludeComponents.Count - 1 do begin if UpperCase(FExcludeComponents.Strings[i]) = UpperCase(CurrControl.ClassName) then begin Excluded := true; break; end; end; if not Excluded then begin if (Msg.lParam and $1000000 <> 0) then EnterType := KeyPad // ENTER on numeric keypad else EnterType := KeyBoard; // ENTER on the std keyboard if ((FKPenter = kyTab) and (EnterType = KeyPad)) or ((FKBenter = kyTab) and (EnterType = KeyBoard)) then Keybd_Event(VK_TAB,0,0,0); end; end; end; if Assigned(SaveOnMessage) then SaveOnMessage(Msg,Handled); end; procedure TEnterAsTab.SetExcludeComponents(NewValue : TStringList); begin FExcludeComponents.Assign(NewValue); end; procedure TEnterAsTab.Enable; begin Application.OnMessage := DoEnterAsTab; end; procedure TEnterAsTab.Disable; begin Application.OnMessage := SaveOnMessage; end; // =================================== // Register to Delphi pallete // =================================== procedure Register; begin RegisterComponents(´Win95´, [TEnterAsTab]); end; end.
13/08/2006
Viggianojr
13/08/2006
Dmalta
Queria dar um pitaco nessa conversa, se me permitem. Afinal, pra que tanto interesse em usar ENTER?
O padrão da interface comum do Windows para mudar de campo é a tecla TAB. Todo mundo sabe isso. Só não sabe quem é usuário tradicional de programas DOS e ainda está começando a migrar para Windows - parece incrível, mas ainda acontece bastante, porque há muitos SW feitos em Clipper em plena atividade.
Quando nós fazemos um programa Windows aceitando ENTER, estamos ensinando o usuário a ignorar o padrão do ambiente operacional. Quando ele entrar no Word, vai querer dar ENTER em uma caixa de diálogo e ao invés de ir pro campo seguinte, vai fechar a janela.
Aliás, isso é outro ponto importante. O ENTER tem função já definida nos ´[i:ec1b06f5c8]guidelines[/i:ec1b06f5c8]´ da interface Windows: executar a ação do botão default da janela (geralmente o botão ´OK´).
Eu acho que o melhor é ensinar os usuários que é com TAB que se move entre os campos e usar TButton.Default = True para que a tecla ENTER funcione como esperado em qualquer programa da interface comum do Windows.
Na minha experiência, os usuários nem vão se incomodar com isso. No máximo vão estranhar por um ou dois dias e depois ficam satisfeitos, porque trabalham da mesma forma com qualquer software, reduzindo a curva de aprendizado de novas aplicações. Por outro lado, 90¬ dos usuários que já tem experiência com Windows vão supor implicitamente que TAB muda o foco dos campos.
Um abraço,[/i]
14/08/2006
Viggianojr
Grato.
14/08/2006
Aerreira
Bom, aí o tratamento é outra coisa completamente diferente... Falávamos em substutuir a função da tecla Tab usando a tecla Enter. Para colocar um Enter seu seu arquivo txt basta colocar um CHR(13), mais nada.
26/06/2013
Ricardo Lima
if Key = #13 then begin
Key := #0; // retira o ruido irritante
Perform(WM_NEXTDLGCTL, 0, 0);
26/06/2013
Aerreira
Clique aqui para fazer login e interagir na Comunidade :)