SetFocus sur Controls[i] impossible ! [Résolu]

Signaler
Messages postés
11
Date d'inscription
dimanche 15 septembre 2002
Statut
Membre
Dernière intervention
27 octobre 2005
-
Messages postés
11
Date d'inscription
dimanche 15 septembre 2002
Statut
Membre
Dernière intervention
27 octobre 2005
-
J'ai une Form1 contenant :
x controls "TEdit"
et
y controls "Button"

je voudrais que le focus passe sur le control[x+1] à chaque pression de la touche "Return" et seulement sur les controls de type Tedit.

Ca fait 1 semaine que je cherche comment faire !

Merci de m'aider

Nestor

Pour info, 1 de mes derniers essais :

procedure TForm1.toto(Sender: TObject; var Key: Char);
Var
cpt : byte;
begin
if key =#13 then
begin
for cpt:=0 to controlcount-1 do
begin
if (controls[cpt].ClassType = Tedit) then
begin
controls[cpt].Enabled:=false;
//Controls[cpt].SetFocus; >> plantage
end;
end;
end;
end;

10 réponses

Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Il serait vrai de préciser comment on active le Focus. On ne sait jamais...

MaForm.ActiveControl:=MonEdit;
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
C'est car Setfocus est pour un TWinControl.
et que Form1.Components[cpt] est un TComponent.

Il faut que tu verifie que ton composant est un TEdit avec
if Form1.Components[cpt] is TEdit then
  // suite si vrai


apres tu demende s'il peut recevoir le focus :
if (Form1.Components[cpt] as TWinControl).CanFocus then
  // suite


Etant donné que TEdit hérite de TWinControl (la ou est implantée CanFocus et SetFocus) , ce n'est pas la peine de tester si c'est un TWincontrol puisqu'on sait que c'est un TEdit.

et que tu lui donne le focus :
(Form1.Components[cpt] as TWinControl).SetFocus;


Je te soumet donc plutot ceci :
procedure TForm1.toto(Sender: TObject; var Key: Char);
var
cpt : byte;
begin
if key =#13 then
  for cpt:=0 to Form1.ComponentCount -1 do  // on parcours la liste des composants
    if Form1.Components[cpt] is TEdit then  // si c'est un edit  ...
      if (Form1.Components[cpt] as TWinControl).CanFocus then   // si il peut avoir le focus ...
        (Form1.Components[cpt] as TWinControl).SetFocus;    // on le lui donne.
end;


Voila.

PS : dans le code, on peut aussi remplacer TWincontrol par TEdit.
PS2 : Ce code n'a aucune utilité car ce cera toujours le dernier TEdit de la liste de composnans qui aura le focus.
C'est à prendre àjuste titre d'exemple.

Florent

Si tu ne te plantes pas ......
tu ne poussera jamais
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
comme te la dit grandvizir il faudrait plutot une procedure qui passe automatiquement le focus au suivant lorqu'on l'apelle.

Pour cela tu déclare procedure PasseFocusAuTEditSuiv; dans la déclaration de la classe TForm1 ( ou de ta form ) :
[...]
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure PasseFocusAuTEditSuiv; // ICI
  private
    { Déclarations privées }
[...]


Tu définit ensuite une variable globale CompFocus :
[...]
var
Form1: TForm1;
CompFocus: integer;  // ICI


Puis dans la partie implementation tu met ta procedure :
procedure TForm1.PasseFocusAuTEditSuiv;
var
  OK : boolean;
begin
OK:=false;
{ Cette procedure parcourt tous les composants de Form1 jusqu'au prochain
TEdit qui peut recevoir la focalisation et la lui donne. }
repeat
  inc(CompFocus);
  if CompFocus >= Form1.ComponentCount then  // si on arrive à la fin de la liste des composants ...
    CompFocus:=0;  // on revient au début.
  if Form1.Components[Compfocus] is TEdit then
    if (Form1.Components[CompFocus] as TWinControl).CanFocus then
      begin
        (Form1.Components[CompFocus] as TWinControl).SetFocus;
        OK:=true;
      end;
until OK;
end;


Et voila !!!

Par contre, si tu ne veut pas recommencer depuis le premier TEdit lorsque tu arrive à la fin des composants,
changes
CompFocus:=0;

par
Break; 


Ps : cette procedure exige qu'au moins un TEdit soit présent sur la fiche car sinon la boucle repeat va faire planter le programme ...

Ps2 : Si tu fais le remplacement que je t'ai dit, ne rapelle plus la procedure car elle ne servira plus à moins que tu remettes ConpFocus à 0.

@ ++
Florent

Si tu ne te plantes pas ......
tu ne poussera jamais
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
J'ai une approche différente, Florenth, bluffante de simplicité.

Comme il me semble qu'elle offre un intérêt certain, je vais la mettre à disposition dans les codes source, afin que tout le monde puisse en profiter.

Bonne prog' :-p
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
florenth est ici très intuitif... je ne vois pas d'incohérences et c'est bien expliqué.

===========
Aider son prochain passe aussi par la validation des réponses...

ViewVite : HTML - ZIP
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
GrandVizir : Ok pour le cheminement dans la réflexion de Florenth. Il a pris de son temps pour expliquer comment on peut faire et c'est très courageux de sa part.

Mais son code suppose que l'utilisateur ne s'est pas déplacé avec la souris entre temps. Le fait d'incrémenter CompFocus ne garantit aucunement que l'on commence la recherche sur le contrôle suivant l'appel précédent à PasseFocusAuTEditSuiv.

Jetez donc un oeil sur le code source de Japee qui règle le problème de manière si élégante :approve) .

May Delphi be with you
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Je n'en doute pas... Avec les messages, on fait tout, si on sait les faire :) .

===========
ViewVite : HTML - ZIP
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Waoh ! Je suis bluffé :blush)

Les messages ... c'est vraiment utile, mais encore faut-il savoir les utiliser ...

Jpaee, Delphiprog : Pourquoi ne feriez-vous pas un tutorial pour apprendre à s'en servir ??

PS : Au sujet de ma source, erronée, eh bin je n'ai pas trouvé comment la modifier!! :sad) Help ??

@ ++
Florent

Si tu ne te plantes pas ......
tu ne poussera jamais
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Sache qu'il existe 804 messages... tous différents. Alors pour un tutorial, il va falloir être courageux ou alors être plus précis.

===========
Validez les réponses si ok...

ViewVite : HTML - ZIP
Messages postés
11
Date d'inscription
dimanche 15 septembre 2002
Statut
Membre
Dernière intervention
27 octobre 2005

Merci à tous,
je vais essayer de comprendre tout ça...

Mais on est bien loin du turbopascal de l'I.U.T.
Nestor