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

NESTORORG 11 Messages postés dimanche 15 septembre 2002Date d'inscription 27 octobre 2005 Dernière intervention - 5 nov. 2004 à 20:20 - Dernière réponse : NESTORORG 11 Messages postés dimanche 15 septembre 2002Date d'inscription 27 octobre 2005 Dernière intervention
- 7 nov. 2004 à 19:20
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;
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 6 nov. 2004 à 13:12
3
Merci
C'est fait !

Voir ma solution au problème ici :

DÉPLACER LE FOCUS D'UN TEDIT À L'AUTRE EN IGNORANT LES AUTRES COMPOSANTS

Bonne prog' :-p

P-S : si ça te convient, NESTORORG, n'oublie pas de cliquer sur "Réponse acceptée". ;)

Merci japee 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de japee
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 5 nov. 2004 à 20:34
0
Merci
Une procédure sur OnKeyPress sur les edits désirés:

begin
if key=#13 then PasseAuSuivant;
end;


Voir
http://www.delphifr.com/forum.v2.aspx?ID=321710
Commenter la réponse de cs_grandvizir
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 5 nov. 2004 à 20:36
0
Merci
Il serait vrai de préciser comment on active le Focus. On ne sait jamais...

MaForm.ActiveControl:=MonEdit;
Commenter la réponse de cs_grandvizir
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 6 nov. 2004 à 12:03
0
Merci
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
Commenter la réponse de florenth
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 6 nov. 2004 à 12:23
0
Merci
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
Commenter la réponse de florenth
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 6 nov. 2004 à 12:56
0
Merci
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
Commenter la réponse de japee
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 6 nov. 2004 à 19:22
0
Merci
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
Commenter la réponse de cs_grandvizir
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 6 nov. 2004 à 19:51
0
Merci
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
Commenter la réponse de cs_Delphiprog
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 6 nov. 2004 à 20:22
0
Merci
Je n'en doute pas... Avec les messages, on fait tout, si on sait les faire :) .

===========
ViewVite : HTML - ZIP
Commenter la réponse de cs_grandvizir
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 7 nov. 2004 à 12:26
0
Merci
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
Commenter la réponse de florenth
cs_grandvizir 1237 Messages postés samedi 8 novembre 2003Date d'inscription 3 septembre 2006 Dernière intervention - 7 nov. 2004 à 12:43
0
Merci
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
Commenter la réponse de cs_grandvizir
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 7 nov. 2004 à 13:20
0
Merci
Si vraiment l'utilisation des messages vous intéresse, voyez donc ceci : Tutorial utilisation des messages windows.

GrandVizir : je n'ai pas compté tous les messages de Windows mais, de toutes façons, comment on peut aussi en créer d'autres pour un usage personnel, il n'y a donc pas de limite...
C'est ce que tente de démontrer le tutorial ci-dessus.

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
Commenter la réponse de cs_Delphiprog
NESTORORG 11 Messages postés dimanche 15 septembre 2002Date d'inscription 27 octobre 2005 Dernière intervention - 7 nov. 2004 à 19:20
0
Merci
Merci à tous,
je vais essayer de comprendre tout ça...

Mais on est bien loin du turbopascal de l'I.U.T.
Nestor
Commenter la réponse de NESTORORG

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.