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 :

StringGrid, flêches de déplacement et Keyup/down/press


Sujet :

Langage Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 194
    Points : 127
    Points
    127
    Par défaut StringGrid, flêches de déplacement et Keyup/down/press
    Bonjour à tous,
    Je suis en train de me casser les dents sur un problème de déplacement dans une stringgrid avec les flèches.
    J'ai besoin de tout contrôler, c'est à dire que quand j'appuie sur une des flèches, je souhaite contrôler moi même le focus dans la cellule (notamment si la taille de la cellule =-1, je veux sauter la cellule et me mettre sur la cellule suivante.

    Je suis donc parti dans les évènements KeyUp avec ce code simple pour voir le comportement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
         if Key=VK_LEFT then
         begin
             StringGrid1.Col:=StringGrid1.Col-1;
         end;
     
         if Key=VK_RIGHT then
         begin
             StringGrid1.Col:=StringGrid1.Col+1;
         end;
    Et quand j'appuie sur ma flêche vers la droite, la cellule saute à cellule+2 et non la cellule +1, pareil vers la gauche.

    J'ai regardé dans le code de vcl.Grids, et j'ai tracé les KeyPress et KeyDown et je suis tombé sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TCustomGrid.KeyDown(var Key: Word; Shift: TShiftState);
    qui intercepte les touches aussi. Donc l'évènement de la procédure de vcl.Grids déplace la cellule à +1 et ma procédure déplace la cellule à +1 donc au total je me suis déplacé de +2

    Comment je peux désactiver la procédure de vcl.Grids de manière à ramener toutes les actions sur les touches dans les évènements KeyPress, KeyDown et KeyUp ? J'ai tenté de mettre en commentaire la procédure de vcl.Grids pour voir, mais cela ne bloque rien (et même ce serait embêtant pour les autres projets qui ont besoin de la gestion des évènements sur les touches).

    Voilà,
    Merci à tous pour le coup de main

  2. #2
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 484
    Points
    484
    Par défaut
    Bonjour,
    Je suppose que tu y a déjà pensé, mais pourquoi ne pas tenir compte de la gestion interne du StringGrid, et ne gérer, dans tes propres routines, que les cellules qui sont inopérantes ?

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 252
    Points
    41 252
    Billets dans le blog
    63
    Par défaut
    Bonjour, je suis assez d'accord avec Galet;

    je souhaite contrôler moi-même le focus
    J'ai déjà pu faire ce genre de chose en utilisant l'évènement OnSelectCell

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 374
    Points : 3 152
    Points
    3 152
    Par défaut
    Bonjour,

    Pour sauter une colonne de largeur nulle, il suffit de faire dans le OnKeyUp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      if Key=VK_LEFT then
         begin
           If StringGrid1.ColWidths[StringGrid1.Col] <=0 Then  StringGrid1.Col:=StringGrid1.Col-1;
         end;
     
      if Key=VK_RIGHT then
         begin
           If StringGrid1.ColWidths[StringGrid1.Col] <=0 Then   StringGrid1.Col:=StringGrid1.Col+1;
         end;
    il faudra aussi borner Col

    A+

    Charly

  5. #5
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 194
    Points : 127
    Points
    127
    Par défaut
    (Charly910, essaye ton code et tu devrais avoir le même phénomène que celui explosé en #1)

    Bon, j'ai utilisé le code suivant mais il ne fonctionne pas dans la mesure ou je me prends un
    Nom : Annotation 2020-02-01 125124.png
Affichages : 217
Taille : 2,9 Ko

    Voilà le code que j'ai utilisé ... Je suis parti de l'idée que je devais tester juste avant la sélection de la cellule puisque je ne peux pas intervenir au niveau des Keypress/down/up
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,ARow: Integer; var CanSelect: Boolean);
    begin
         if StringGrid1.ColWidths[ACol]<=0
         then begin
              StringGrid1.Col:=StringGrid1.Col+1;
              //StringGrid1.Selection:=TGridRect(Rect(StringGrid1.FixedCols,StringGrid1.Selection.Top,StringGrid1.FixedCols,StringGrid1.Selection.Bottom));
              CanSelect:=true;
              StringGrid1SelectCell(Sender,StringGrid1.Col,StringGrid1.Row,CanSelect);
         end;
    end;

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 374
    Points : 3 152
    Points
    3 152
    Par défaut
    Bonjour,
    j'ai surement mal compris ton problème. Voici mon exe avec le code que je t'ai donné.

    Dans la grille la colonne 2 est de largeur nulle. Le focus se déplace bien de la colonne 1 à 3 ou 3 à 1 avec les flèches droite ou gauche.

    Grid.zip

    Cela ne marche que s'il n'y a pas plusieurs colonnes consécutives de largeur nulle. Sinon il faut adapter le code.

    Ton problème est différent ?

    A+
    Charly

  7. #7
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 194
    Points : 127
    Points
    127
    Par défaut
    Merci Charly910,
    J'ai exécuté ton exe et :
    * Le code ne fonctionne pas quand tu te déplace en ligne : tu te positionne sur la 1-1, tu descends avec la flèche et plus de focus, tu rappuie, le focus est sur la 1-3 donc, il s’arrête dans la cellule 1-2
    Mais il fonctionne en colonne

    Mais comment résoudre le truc s'il y a plusieurs (et malheureusement c'est cas) cellules consécutives à -1 dans un déplacement horizontal ?

  8. #8
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 194
    Points : 127
    Points
    127
    Par défaut
    Bon, je ne sais pas si c'est orthodoxe mais j'ai fais une itération de la procédure OnKeyUp en testant le ColWidths de la cellule.
    Ca fonctionne!
    Merci à tous pour l'aide et les pistes, merci à Charly910 d'avoir enfoncé le clou

    (pourtant c'est tout bête comme code, et ben il m'a quand même un peu (beaucoup) embété )

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
     
       if Key=VK_LEFT then
       begin
           If StringGrid1.ColWidths[StringGrid1.Col] <=0 Then
           begin
                StringGrid1.Col:=StringGrid1.Col-1;
                if StringGrid1.ColWidths[StringGrid1.Col]<=-1
                then StringGrid1KeyUp(Sender,Key,Shift);
           end;
       end;
     
       if Key=VK_RIGHT then
       begin
           If StringGrid1.ColWidths[StringGrid1.Col] <=0 Then
           begin
               StringGrid1.Col:=StringGrid1.Col+1;
               if StringGrid1.ColWidths[StringGrid1.Col]<=-1
               then StringGrid1KeyUp(Sender,Key,Shift);
           end;
       end;
     
    end;

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

Discussions similaires

  1. flèche de déplacement dans terminal
    Par YmaSumac dans le forum Linux
    Réponses: 1
    Dernier message: 30/11/2010, 17h50
  2. presse papier et stringgrid
    Par vitch8 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 08/04/2008, 14h25
  3. Réponses: 11
    Dernier message: 07/01/2008, 17h20
  4. Déplacement d'un objet dans une stringgrid
    Par QAYS dans le forum Composants VCL
    Réponses: 1
    Dernier message: 26/10/2007, 11h56
  5. Déplacement de la fenetre avec des flèches
    Par MayOL69bg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 03/05/2007, 23h09

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