Se movendo com ENTER

02/12/2005

12

Como eu poderia fazer para pular as celulas do DbGrid com enter e nao com TAB???????
agradeço!!! lembrando nao quero trocar o foco para o proximo componente e sim para a proxima celula do grid.


Responder

Posts

04/12/2005

Sabado

Mude a propriedade ´KeyPreview´ do Form para true.
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


Responder

15/01/2006

Raserafim

existe algum método do próprio delphi para substituir o acesso a API via Perform?


Responder

16/01/2006

Titanius

Mude a propriedade ´KeyPreview´ do Form para true. 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


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


Responder

16/01/2006

Michael

Particulamente eu nunca usei [b:f4d0bab795]Perform [/b:f4d0bab795]para isso, mas sim o método [b:f4d0bab795]SelectNext [/b:f4d0bab795]da classe [b:f4d0bab795]TWinControl[/b:f4d0bab795].

[b:f4d0bab795]procedure [/b:f4d0bab795]SelectNext(CurControl: TWinControl; GoForward, CheckTabStop: Boolean);


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


Responder

17/01/2006

Titanius

Particulamente eu nunca usei [b:b0c1ecb0b2]Perform [/b:b0c1ecb0b2]para isso, mas sim o método [b:b0c1ecb0b2]SelectNext [/b:b0c1ecb0b2]da classe [b:b0c1ecb0b2]TWinControl[/b:b0c1ecb0b2]. [quote:b0c1ecb0b2=´Borland´][b:b0c1ecb0b2]procedure [/b:b0c1ecb0b2]SelectNext(CurControl: TWinControl; GoForward, CheckTabStop: Boolean);


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


Responder

21/01/2006

Raserafim

usei as duas funções e ambas produzem um beep.
como faço para evitar este beep?


Responder

21/01/2006

Godzilla_xf

Olá, tente usar assim:

if key= #13 then
begin
Perform (CM_DialogKey, VK_TAB, 0);
key:=0;
end;

e coloque a propriedade KeyPreview do forme para True.


Responder

16/07/2006

Aerreira

Gente, desculpa voltar nesse tópico, mas vejo que estão todos abertos sem solução... Basta usar o compomente abaixo que funciona legal, nenhum beep, e cobre toda a aplicação, não precisa mexer em absolutamente nada.

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.



Responder

13/08/2006

Viggianojr

Criei a unit EnterTab de acordo com o codigo nao esta funcionando com enter, só com tab...


Responder

13/08/2006

Dmalta

Pessoal,

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]


Responder

13/08/2006

Aerreira

Criei a unit EnterTab de acordo com o codigo nao esta funcionando com enter, só com tab...

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.


Responder

14/08/2006

Viggianojr

Não preciso usar o Enter pra mudar de Edit, e sim usa-lo para grava-lo em um arqtxt...

Grato.


Responder

14/08/2006

Aerreira

Não preciso usar o Enter pra mudar de Edit, e sim usa-lo para grava-lo em um arqtxt... Grato.

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.


Responder

26/06/2013

Ricardo Lima

para tirar esse ruido irritante, na verdade o código deve ficar assim:

if Key = #13 then begin
Key := #0; // retira o ruido irritante
Perform(WM_NEXTDLGCTL, 0, 0);
Responder

26/06/2013

Aerreira

Caraca, última mensagem neste post em 2006... Como o tempo passa!
Responder