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

Composants VCL Delphi Discussion :

StringGrid Déplacement automatique du curseur


Sujet :

Composants VCL Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut StringGrid Déplacement automatique du curseur
    Bonjour tout le monde !

    Je cherche comment automatiser le déplacement et l'affichage du curseur dans un StringGrid. Je voudrais que le curseur se déplace à la ligne suivante lorsque l'utilisateur appuie sur Entrée.

    J'ai trouvé un code qui fait presque ce que je veux, mais pas tout à fait. Voyez l'exemple suivant : si je clique sur le bouton, ou si j'appuie sur Entrée, le résultat n'est pas exactement le même, quoique le code soit identique. En cliquant sur le bouton, le curseur se déplace et s'affiche. En appuyant sur Entrée, la sélection (?) se déplace, mais le curseur n'apparaît pas.
    Pratiquement ça ne fait pas de différence, puisque qu'on peut quand même taper du texte, sans avoir à cliquer d'abord sur la cellule, mais pour l'utilisateur c'est quand même plus clair s'il voit le curseur qui clignote.

    Bref, pourquoi est-ce que j'obtiens deux résultats différents ? et comment avoir le curseur clignotant après un appui sur la touche Entrée ?

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    unit UCurseur2;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids;
     
    type
      TForm1 = class(TForm)
        StringGrid1: TStringGrid;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with StringGrid1 do
      begin
        if Row < RowCount - 1 then
          Row := Row + 1
        else
          Row := 0;
        SetFocus;
        EditorMode := True;
      end;
    end;
     
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if Key = 13 then
        with StringGrid1 do
        begin
          if Row < RowCount - 1 then
            Row := Row + 1
          else
            Row := 0;
          SetFocus;
          EditorMode := True;
        end;
    end;
     
    end.
    P.-S. Impossible de retrouver une discussion que j'avais ouverte sur un projet de carnet de notes du professeur pour Delphi XE2. C'est ce projet que je reprends : j'aurais bien voulu relire et éventuellement continuer la même discussion.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    J'ai trouvé la solution ou du moins une solution : à savoir donner la valeur True à l'option goAlwaysShowEditor.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    J'ai encore trois petites questions, des choses pratiquement sans importance, mais puisque j'ai déjà ouvert cette discussion...

    Voici donc l'état l'actuel de mon programme.

    Première question : quand je lance mon programme, bien que la propriété enabled de la grille soit à False, il y a une cellule qui est comme sélectionnée (vue1). Peut-on éviter cela ?

    Deuxième question : quand je valide ma saisie dans un TEdit, le curseur passe bien se déplace bien comme je veux (soit vers le TEdit suivant, soit vers la grille), mais j'ai un "ding" Windows comme si je faisais une fausse manipulation. Pourquoi ce son ? Peut-on le supprimer ?

    Troisième question : quand je valide la dernière cellule de la grille (donc le prénom du dernier élève), le prénom en question ne se met pas en place et reste dans le coin de la cellule (vue2). Y a-t-il une solution ?
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Première question : quand je lance mon programme, bien que la propriété enabled de la grille soit à False, il y a une cellule qui est comme sélectionnée (vue1). Peut-on éviter cela ?
    Joue avec goAlwaysShowEditor en même temps que tu changes le Enabled
    Sinon voir en mettant -1 à l'un des membre de TGridRect Selection

    Citation Envoyé par Roland Chastain Voir le message
    Deuxième question : quand je valide ma saisie dans un TEdit, le curseur passe bien se déplace bien comme je veux (soit vers le TEdit suivant, soit vers la grille), mais j'ai un "ding" Windows comme si je faisais une fausse manipulation. Pourquoi ce son ? Peut-on le supprimer ?
    N'ayant pas souvent le son sur le poste de travail, ce quelques choses à laquelle je ne fais pas attention !

    Si c'est sur 13 (VK_RETURN serait plus élégant) que tu le gère, c'est peut-être le caractère ENTER qui fait "ding" sur un Edit Monoligne !
    Affecte 0 à Key, c'est ce que je faisais pour ce genre de manip
    Il existe d'ailleurs TJvEnterAsTab

    Tu utilises que du SetFocus ? Regarde TabOrder que l'on peut appliquer manuellement FindNextControl ou SelectNext

    Dans le OnKeyDown, inutile le SetFocus sur StringGrid1 qui devrait déjà l'avoir



    Citation Envoyé par Roland Chastain Voir le message
    Troisième question : quand je valide la dernière cellule de la grille (donc le prénom du dernier élève), le prénom en question ne se met pas en place et reste dans le coin de la cellule (vue2). Y a-t-il une solution ?
    Problème de OnExit ou de OnChange qui ne se produit pas lors d'un click sur le bouton (un click via un raccourci par exemple)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Merci, ShaiLeTroll, pour cette réponse. J'ai commencé à lire les liens et à faire certaines modifications.

    Ma première question est résolue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.FormActivate(Sender: TObject);
    var
      r: TGridRect;
    begin
      Edit1.SetFocus;
      with r do
      begin
        Left   := -1;
        Top    :=  0;
        Right  := -1;
        Bottom :=  0;
      end;
      StringGrid1.Selection := r;
    end;
    La version courte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      Edit1.SetFocus;
      StringGrid1.Selection := TGridRect(Rect(-1, 0, -1, 0));
    end;
    Content d'avoir appris l'existence de TabOrder : ça peut servir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            //Edit2.SetFocus;
            SelectNext(Edit1, True, True);
    J'ai remplacé aussi 13 par VK_RETURN. Par contre je n'ai pas compris à quel endroit je devais affecter 0 à Key. Je cherche...
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    D'après cette page et l'essai que je viens de faire, l'astuce de mettre Key à #0 fonctionne dans une procédure OnKeyPress, mais pas dans la procédure OnKeyDown. La solution du message fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      msg: TMsg;
    begin
      if (Key = VK_RETURN) then
      begin
        PeekMessage(msg, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
    J'ai résolu aussi le troisième point (le texte de la dernière cellule qui ne se mettait pas bien en place) de la façon suivante :

    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
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      i: integer;
      classes: tClasses;
    begin
      if Key = VK_RETURN then
        with StringGrid1 do
        begin
          if Col = 0 then Col := 1 else
            if Row < RowCount - 1 then
            begin
              Col := 0;
              Row := Row + 1
            end else
            begin
              editorMode := False;
              StringGrid1.Selection := TGridRect(Rect(-1, 0, -1, 0));
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

Discussions similaires

  1. Changement automatique de curseur
    Par tryonyco dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/04/2007, 21h12
  2. Déplacement automatique de la scrollbar
    Par Rom1984 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/03/2007, 22h43
  3. Déplacement automatique SDL
    Par babtwo dans le forum SDL
    Réponses: 2
    Dernier message: 03/02/2007, 12h16
  4. JScrollPane, descente automatique du curseur
    Par DJuL- dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 25/06/2006, 14h06
  5. Déplacement "automatique" du curseur
    Par Amenofis dans le forum Composants VCL
    Réponses: 2
    Dernier message: 08/01/2003, 18h57

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