IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

SetFocus et TEdits qui peuvent changer de place


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    mai 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2003
    Messages : 129
    Points : 99
    Points
    99
    Par défaut SetFocus et TEdits qui peuvent changer de place
    Bonjour à tous

    Dans la série (sans fin) de comment se créer soit même des emmerdements, je vous propose ceci :

    Hier soir j'ai eu une brillante idée : pouvoir changer de place des TEdits qui sont les uns à la suite des autres.
    TEdit1 TEdit2 TEdit3 que je réorganise comme je veux par exemple TEdit3 TEdit2 TEdit1
    C'est bon, ça fonctionne en changeant leur .Left
    Oui mais, ce matin, en voulant me servir de mon outil, je me rends compte que le focus est resté figé (normal en soi il est dans le code).

    Mais alors, comment faire pour dire que par exemple que de TEdit3 je dois aller en TEdit2 et non en TEdit1 suivant les "positions" des TEdit

    J'ai pensé à une liste de composant mais pour le moment je suis dans l'impasse.

    Auriez vous des suggestions à me faire ?
    Delphi 10.2 - Lazarus
    Utilisation de la VCL

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    mai 2002
    Messages
    2 612
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2002
    Messages : 2 612
    Points : 6 082
    Points
    6 082
    Par défaut
    Redéfinir le TabOrder des Edit après chaque réorganisation.
    Personnellement, je stockerais des pointeurs sur ces Edit dans une TObjectList, pour les balayer plus facilement.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. Écrivez dans un français correct !!

    Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Interbase (7 - XE) - PostgreSQL 11.6

  3. #3
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    mai 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2003
    Messages : 129
    Points : 99
    Points
    99
    Par défaut
    Merci Lung,
    En faisant une recherche avec le mot clef "TObjectList"
    je suis tombé sur une discussion de 2007 https://www.developpez.net/forums/d3...st-l-utiliser/
    Je m'en inspire ... a suivre
    Delphi 10.2 - Lazarus
    Utilisation de la VCL

  4. #4
    Membre chevronné Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - développeur Delphi, PHP et JS
    Inscrit en
    juin 2013
    Messages
    959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juin 2013
    Messages : 959
    Points : 2 044
    Points
    2 044
    Par défaut
    Attention avec la TObjectList à ce qu'elle ne prenne pas la possession des composants, ça pourrait générer des anomalies lors de la fermeture des programmes ou fiches.

  5. #5
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    mai 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2003
    Messages : 129
    Points : 99
    Points
    99
    Par défaut
    Après avoir étudié la discussion que je citais plus haut, j'ai choisi de suivre ce que dit Gilbert Geyer à savoir utiliser une TStringList car elle manipule autant les chaines que les objets.

    Toutefois, j'ai un soucis.
    J'espère mettre suffisamment d'info ...

    Contexte : j'ai 7 Tpanel qui contiennent chacun un TEdit, entre autre.
    Les TPanels peuvent être arrangés dans n'importe quel ordre.

    Une variable globale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeTEdit : TStringList;
    Une StringGrid qui me permet de facilement permuter les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            StringParams.Rows[1].CommaText := 'PIECE,'+IntToStr(Panel_PIECE.Width);
            StringParams.Rows[2].CommaText := 'REGLEMENT,'+IntToStr(Panel_REGLEMENT.Width);
            StringParams.Rows[3].CommaText := 'DATE,'+IntToStr(Panel_DATE.Width);
            StringParams.Rows[4].CommaText := 'COMPTE,'+IntToStr(Panel_COMPTE.Width);
            StringParams.Rows[5].CommaText := 'LIBELLE,'+IntToStr(Panel_LIBELLE.Width);
            StringParams.Rows[6].CommaText := 'DEBIT,'+IntToStr(Panel_DEBIT.Width);
            StringParams.Rows[7].CommaText := 'CREDIT,'+IntToStr(Panel_CREDIT.Width);
    Je remplis cette TStringList avec le contenu de la StringGrid. TStringList va contenir le Hint du TPanel pour identification et l'objet TPanel : TStringList(Chaine,Objet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        ListeTEdit:=TStringList.Create;
        ListeTEdit.Sorted := false;
        for X := 1 to StringParams.RowCount do
        begin
            if StringParams.Cells[0,X] = Panel_PIECE.Hint
            then for Y:=0 to Panel_PIECE.ControlCount-1
                 do if (Panel_PIECE.Controls[Y] is tEdit)
                    then ListeTEdit.AddObject(Panel_PIECE.Hint,TEdit(Panel_PIECE.Controls[Y]));
     
            ...//... pour chacun de TPanel
     
        end;
    Pour faire mon SetFocus sur le TEdit suivant celui dans lequel je suis, je fais ceci et c'est là que j'ai un soucis
    Dans TEditKeyPress
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Var
       X, Y : Integer;
    begin
        if Key = chr(13)
        then begin
            X :=  ListeTEdit.IndexOf(TEdit(Sender).Hint);
            if (X > -1)
            and (X+1 <= ListeTEdit.Count-1)
            then begin
                for Y := 0 to TPanel(ListeTEdit.Objects[X+1]).ControlCount-1 // ICI J'AI L'ERREUR : TPanel.ControlCount = 2 hors là = 0
                do if (TPanel(ListeTEdit.Objects[X+1]).Controls[Y] is tEdit)
                   then TEdit(TPanel(ListeTEdit.Objects[X+1]).Controls[Y]).SetFocus;
            end;
        end;
    end;
    Quand j'utilise le vrai nom du TPanel, son ControlCount contient bien 2 contrôles
    Dans la procédure TPanel(ListeTEdit.Objects[X+1]).ControlCount = 0

    Quelqu'un voit un truc qui ne vas pas ?
    Delphi 10.2 - Lazarus
    Utilisation de la VCL

  6. #6
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    mai 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2003
    Messages : 129
    Points : 99
    Points
    99
    Par défaut
    Bon, j'ai trouvé ... la nuit fut bonne conseillère

    Je mets un TEdit dans la StringGrid (ligne 8 du code 3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    then ListeTEdit.AddObject(Panel_PIECE.Hint,TEdit(Panel_PIECE.Controls[Y]));
    Je recherche un TEdit mais dans un TPanel qui est sensé être dans la TStringGrid (Ligne 12 du code 4)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    then TEdit(TPanel(ListeTEdit.Objects[X+1]).Controls[Y]).SetFocus;
    Ce qui est incohérent.
    Il faut chercher un TEdit dans la TStringGrid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TEdit(ListeTEdit.Objects[X+1]).SetFocus;
    Et ça fonctionne super!
    Delphi 10.2 - Lazarus
    Utilisation de la VCL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Expression régulière avec capture qui peuvent changer de place
    Par dosy07 dans le forum Langage
    Réponses: 1
    Dernier message: 18/07/2017, 23h46
  2. Réponses: 2
    Dernier message: 03/03/2017, 10h01
  3. Changer de place le curseur
    Par CCin dans le forum C++
    Réponses: 4
    Dernier message: 01/11/2005, 19h10
  4. changer de place d'un texte avec WM_TIMER
    Par nasrij dans le forum MFC
    Réponses: 5
    Dernier message: 06/10/2005, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo