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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 985 fois - Téléchargée 37 fois

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

Ajouter un commentaire

Commentaires

cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
10 -
Nan mais vraiment !!! Bien sûr que si qu'on peut changer le Key sur l'évènement OnKeyDown. C'est pas «impossible», sauf si on ne voit pas la différence entre un key en mode CHAR (onKeyPress) et un key en mode ORDINAL (onKeyUp/Down). C'est sûr qu'on ne peut pas écrire Key:='x'; sur OnKeyDown. On peut par contre mettre Key:=Ord('x'); Inversement avec OnKeyPress. C'est une histoire de conversion, pas de faisabilité. Restons en là avec "is TCustomEdit" de DelphiProg :)
cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
10 -
En tout cas, dans OnKeyPressed, ça marche !... euh... Ah ouais, je viens de voir le truc... En fait, tellement l'évènement OnKeyPressed me paraissait évident que j'ai mis OnKeyDown. C'est logique ! ?? Mais qui sait, je me trompe encore.
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Je cite:
<<[MAURICIO] Pour convertir les Enter en Tabs, il suffit juste dans l'évènement onKeyDown de mettre:
if key=#13 then key:=#9;
Le composant se charge du reste après.>>

Dans le OnKeyDown tu peux pas mettre ça!!! Impossible!!!
Donc ton dernier commentaire, ne tiens pas debout...

Je cite:
<<Sinon, je ne voit pas le rapport avec les TDBMachin. On vit dans les TEdit ici (pas exclusivement non plus).>>
Si t' as pas compris, je t' explique:
Aller, je me cite:
<<Voici un probleme archi connu pour delphi:
remplacer la touche Tab par la touhe Enter dans les forms:>>
Donc, c' est une fonction utilisable de maniere GENERALE pour n' importe quelle form.
Tu as compris maintenant pourquoi je parle de DB truc machin???????????????????????????
cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
10 -
Je cite: «Bem ouai, si tu veux aller à la ligne dans un Memo, bem tu peux pas». Sauf si tu paramètres WantsTabs et WantsReturn correctement.
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Voici la nouvelle fonction ameliorée grâce à DelphiPRO:
(il faut l' appeler dans le onkeypress de vos forms qui, celles-ci doivent avoir keypreview à True)

je garde cette ligne DelphiProg : Cont := TWC <> Nil;
Tu vois pourquoi ...

procedure NavegarComEnter(Na_Form: TForm; var Tecla: Char);
var TWC : TWinControl;
Cont : Boolean;
begin
if Tecla = #13
then begin
TWC := Na_Form.ActiveControl;
Cont := TWC <> Nil;

if Cont
then begin
if TWC is TDBLookupComboBox
then Cont := not ((TWC as TDBLookupCombobox).ListVisible);

if Cont and not ((TWC is TDBMemo)
or (TWC is TMemo)
or(TWC is TDBRichEdit)
or (TWC is TDBGrid)) then
begin
Na_Form.Perform(WM_NEXTDLGCTL, 0, 0);
Tecla := #0;
end;
end;
end;
end;

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.