Make ENTER like TAB in edit controls  

Send By: Q3 Team
Web : www.q3.nu
Email: dlib@q3.nu
Date: 16/07/00

Tip accessed 3038 times

 


If your form don't contains a DBGrid:

Put this code into OnKeyPress event of your form:


 begin
   if Key = #13 then                          { if it's an enter key }
   begin
       Key := #0;                                 { eat enter key }
       Perform(WM_NEXTDLGCTL, 0, 0);              { move to next control }
   end
 end;



This is before ENTER key work like TAB in edit controls



If your form HAVE a DBGrid control, maybe you enjoy more this code:


 { This is the event handler for the FORM's OnKeyPress event! }
 { Este es el manejador de evento de OnKeyPress de tu form }
 { You should also set the Form's KeyPreview property to True }
 { Debes poner la propiedad KeyPreview de la form a true}

 begin
   if Key = #13 then                                                 { if it's an enter key }
     if not (ActiveControl is TDBGrid) then begin       { if not on a TDBGrid }
       Key := #0;                                                        { eat enter key }
       Perform(WM_NEXTDLGCTL, 0, 0);                 { move to next control }
     end
     else if (ActiveControl is TDBGrid) then                { if it is a TDBGrid }

       with TDBGrid(ActiveControl) do
         if selectedindex < (fieldcount -1) then             { increment the field }
           selectedindex := selectedindex +1
         else
           selectedindex := 0;
 end;



Remember: property KeyPreview of the form = TRUE



Updated at 05/01/2000
Juan Hellín comments us that the first example works well... except for in case you use a TMemo, since it doesn't allow you to press ENTER for append lines...

And... he is right, it is a little uncomfortable. In fact I believe that it is only ultil when the control is a TEdit or a TDBEdit, so... better we discriminate against it:


 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
 begin
   if (Key = #13) then                            { if it's an enter key }
     if (ActiveControl is TEdit) or
        (ActiveControl is TDBEdit) then
     begin
       Key := #0;                                 { eat enter key }
       Perform(WM_NEXTDLGCTL, 0, 0);              { move to next control }
     end
 end;




Update send by: Arturo Garcia (sArthur7@wanadoo.es)
Shift-Tab path of the tip:


 procedure Tform1.Enter(Sender: TObject; var Key: Char);
 begin
  if (Key = #13) and (ActiveControl is  = TEdit) or  (ActiveControl isTDBEdit) then
   begin
     Key := #0;
     SelectNext(ActiveControl, GetKeyState(VK_SHIFT) and $80 = 0, True);
   end
    else if (ActiveControl is  TDBGrid) then
    if Key= #9 then                    {Con Tab salimos del grid hacia delante }
         SelectNext(ActiveControl, true, True)
     else
       with TDBGrid(ActiveControl) do
         if selectedindex < (fieldcount -1) then
           selectedindex := selectedindex +1
         else
           selectedindex := 0;
 end;

 procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
 begin
       Enter(Self,Key);
 end;






Enviado por: Juanma Miguel
Tras mucho programa creo que el truco 1 se hace muy costoso de mantener, en el club de delphi existe un truco que cambia el tab por enter o debería decir el enter por el tab. Creo que complicandolo un poco se puede adaptar para que se controle una vez en el programa y no preocuparte mas de esto:

  • 1- se define un procedimiento que se le tiene que asignar en el on create de la siguiente forma:


       procedure TFInicial.FormCreate(Sender: TObject);
       begin
          Application.OnMessage :=  AppMessage;
       end;
    



  • 2 - y el procedimiento es el siguiente:


     Procedure TFInicial.AppMessage(var Msg: TMSg; Var Handled:Boolean);
     var
      actual : TWincontrol;
     begin
     if Msg.message = WM_KEYDOWN then
        begin
    
        // esto es para controlar que con la flecha abajo se desplegen las
        // listas
        if Msg.wParam = VK_DOWN then
          begin
          Actual := Screen.ActiveControl;
          if Actual is TDBLookupComboBox then
                if not TDBLookupComboBox(Screen.ActiveForm.ActiveControl).listVisible then
                   TDBLookupComboBox(Screen.ActiveForm.ActiveControl).DropDown;
    
          // si utilizas las RX
          if Actual is TRxDBLookupCombo then
                if not TRxDBLookupCombo(Screen.ActiveForm.ActiveControl).listVisible then
                   TRxDBLookupCombo(Screen.ActiveForm.ActiveControl).DropDown;
    
    
          if Actual is TComboBox then
             SendMessage(TComboBox(Screen.ActiveForm.ActiveControl).Handle,CB_SHOWDROPDOWN,-1,0);
    
          // se pueden añadir mas controles....
    
          end;
    
        // y aqui es el control del intro.
        if Msg.wParam = VK_RETURN THEN
           begin
           Actual := Screen.ActiveControl;
           // para los edit.
           if (Actual is TCustomEdit) and
              not (Actual is TCustomMemo) then
              Msg.wParam := VK_TAB;
    
           // para los memo. Con ctrl + enter se salta de linea dentro del
           // memo, si solo es intro salta al siguiente control
           if (Actual is TCustomMemo) and
              (HiWord(GetKeyState(VK_CONTROL)) = 0)then
              Msg.wParam := VK_TAB;
    
           // para los lookup
           if Actual is TDBLookupComboBox then
              if not TDBLookupComboBox(Actual).listVisible then
                 Msg.wParam := VK_TAB;
    
           // Si utilizas las RX
           if Actual is TRxDBLookupCombo then
              if not TRxDBLookupCombo(Actual).listVisible then
                 Msg.wParam := VK_TAB;
    
           // Los combobox
           if Actual is TCustomComboBox then
              if not TCustomComboBox(Actual).DroppedDown then
                 Msg.wParam := VK_TAB;
    
           // el radiobutton
           if Actual is TRadioButton then
              Msg.wParam := VK_TAB;
    
           // en el grid
           if Actual is TDBGrid then
              if (TDBGrid(Actual).ReadOnly) or
                 (HiWord(GetKeyState(VK_CONTROL)) = 1)then
                 Msg.wParam := VK_TAB
    
           // o esto otro Con Ctrl + intro siguiente celda con
           // ctrl + shift + intro celda anterior
           // es complicado pero es por no liar con el intro solo
           // que siempre pasa de un control a otro.
           if Actual is TDBGrid then
              begin
              if (TDBGrid(Actual).ReadOnly) or
                 (HiWord(GetKeyState(VK_CONTROL)) = 0) then
                 Msg.wParam := VK_TAB
              else
                 if not(HiWord(GetKeyState(VK_SHIFT)) = 0) then
                    begin
                    if TDBGrid(Actual).selectedindex > 0 then             { increment the field }
                       TDBGrid(Actual).selectedindex := TDBGrid(Actual).selectedindex -1
                    else
                       TDBGrid(Actual).selectedindex := TDBGrid(Actual).fieldcount -1;
                    end
                 else
                    begin
                    if TDBGrid(Actual).selectedindex < (TDBGrid(Actual).fieldcount -1) then             { increment the field }
                       TDBGrid(Actual).selectedindex := TDBGrid(Actual).selectedindex +1
                    else
                       TDBGrid(Actual).selectedindex := 0;
                    end;
              end;
    
    
           // ListBox
           if Actual is TCustomListBox then
              Msg.wParam := VK_TAB;
    
           // TabControl
           if Actual is TCustomTabControl then
              Msg.wParam := VK_TAB;
    
           // Aqui se pondrían todos los controles que usamos en la
           // aplicación y necesitamos cambiar el tab por intro.
           // de esta forma te despreocupas de cuantos añades y es más
           // limpio el código
    
           end;
        end;
     end;