Déplacer le focus d'un tedit à l'autre en ignorant les autres composants

Contenu du snippet

Permet de mettre le focus sur l'Edit suivant ou l'Edit précédent en fonction de la touche pressée, en ignorant les autres composants (TButton, etc...).

- VK_DOWN, VK_NEXT, VK_RETURN : focus sur l'Edit suivant dans l'ordre de tabulation;
- VK_UP, VK_PRIOR : focus sur l'Edit précédent dans l'ordre de tabulation.

J'ai préféré placer l'appel à la procedure dans l'évènement OnKeyDown des TEdit, afin de pouvoir utiliser les flèches d'avancement.

Mais si l'on se contente de la touche entrée, on peut le placer dans OnKeyPress, ainsi :

if Key = #13 then SetFocusNextEdit;

Un code très court, très simple, mais très utile, répondant à une question récente posée sur ce forum.

Je le mets ici à la disposition du plus grand nombre.

Précisions :

Les TEdits doivent être reliés à l'évènement OnKeyDown du TEdit sur lequel est placé l'évènement (ici Edit1). Le plus simple est d'utiliser l'inspecteur d'objets. Pour les débutants : sélection des Edits à l'aide de la touche majuscule, et clic sur l'évènement OnKeyDown.

Bien sûr, bien que les composants autres que les TEdit soient ignorés, il est préférable de mettre la propriété TabOrder des TEdits dans une progression cohérente, afin que le déplacement du focus semble logique.

Le mieux étant, pour se simplifier la vie, de les créer à la suite, même si l'on peut à tout moment, sans problème, intercaler la création d'un autre composant.

Mes procedures utilisent l'unité "Message.pas".

On peut bien sûr adapter ce code à d'autre composants que les TEdit, vous l'aurez noté...

Source / Exemple :


// déclaration

procedure SetFocusPreviousEdit;
procedure SetFocusNextEdit;

implementation

procedure TForm1.SetFocusPreviousEdit;
begin
  repeat
    Perform(WM_NEXTDLGCTL, -1, 0);
  until ActiveControl is TEdit;
end;

procedure TForm1.SetFocusNextEdit;
begin
  repeat
    Perform(WM_NEXTDLGCTL, 0, 0);
  until ActiveControl is TEdit;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_DOWN, VK_NEXT, VK_RETURN: SetFocusNextEdit;
    VK_UP, VK_PRIOR: SetFocusPreviousEdit;
  end;
end;

Conclusion :


Même s'il n'y a qu'un Edit (!), pas de problème.
Et il y a forcément au moins un Edit, lol...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.