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 :

Inhiber la molette de la souris


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut Inhiber la molette de la souris
    Bonjour. D'après ce que j'ai parcouru dans la FAQ, je nage à contrecourant ! En effet, je cherche à inhiber la molette de la souris. Je m'explique.
    Pour saisir dans un StringGrid destiné à évaluer des élèves, un clic dans une cellule affiche le caractère A (=compétence Acquise), un second clic les caractères NA(=compétence Non Acquise), un troisième clic vide la cellule(=compétence non évaluée), un quatrième réaffiche le carctère A, etc... J'utilise pour ce faire un évènement OnClick. Le premier problème, c'est que les touches étendues du clavier fonctionnent aussi comme des clics de souris (je n'ai pas compris pourquoi, mais j'ai résolu ce problème grâce à la FAQ qui m'a fait découvrir les codes VK_ que j'ai utilisés dans un évènement OnKeyDown). Mais je n'arrive à solutionner le second problème : la molette de la souris se comporte comme des clics, c'est à dire que le déplacement change les caractères de mes cellules (là aussi, je ne comprends pourquoi). D'où ma question : dans mon cas de figure, peut-on autoriser l'utilisation de la molette pour déplacement sans que ce déplacement ne change l'affichage des cellules (ce que j'appelle sans doute improprement inhiber la molette) ? J'espère avoir été clair. Merci d'avance pour vos conseils. Bien amicalement.
    PS : j'utilise Delphi 7
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Pour inhiber la roulette de la souris.

    Dans la partie public de ta classe Tform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     public
        { Déclarations publiques }
        procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
       ...
    Dans le oncreate de la fiche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.OnMessage := Form1.AppMessage;

    Puis la déclaration de la procédure AppMessage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
    begin
      if Msg.message = WM_MOUSEWHEEL then
        Msg.message := 0;
      Handled := false;
    end;
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut
    Bonjour.
    Merci à Pascal Jankowski pour la solution proposée, c'est radical, la molette est inhibée totalement.
    Ceci dit, je ne comprends pas pourquoi un déplacement (touches fléchées ou molette de souris) active l'élément OnClick de mon TStringGrid !
    Voici le code (que je flaire inélégant) que j'avais écrit avant d'implémenter la solution proposée (ça marchait uniquement pour les touches fléchées) :
    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
     
    // les variables Pr_xxxx sont Private
     
    procedure TForm6.StringGrid2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
      // Détection des touches étendues de déplacement
    begin
        if key=VK_UP then Pr_InterceptionTouchesEtendues:=True;
        if key=VK_DOWN then Pr_InterceptionTouchesEtendues:=True;
        if key=VK_LEFT then Pr_InterceptionTouchesEtendues:=True;
        if key=VK_RIGHT then Pr_InterceptionTouchesEtendues:=True;
        if key=VK_PRIOR then Pr_InterceptionTouchesEtendues:=True;
        if key=VK_NEXT then Pr_InterceptionTouchesEtendues:=True;
        if key=VK_HOME then Pr_InterceptionTouchesEtendues:=True;
        if key=VK_LBUTTON then Pr_InterceptionTouchesEtendues:=True;
        if key=VK_RBUTTON then Pr_InterceptionTouchesEtendues:=True;
        if key=VK_MBUTTON then Pr_InterceptionTouchesEtendues:=True;
    end;
     
    procedure TForm6.StringGrid2Click(Sender: TObject);
    begin
      if Pr_InterceptionTouchesEtendues=False then
       begin
        if (Pr_SelectColEvaluations>1) and (Pr_SelectRowEvaluations>0) and (Pr_ChoixAction='Saisie') then
            begin
                if StringGrid2.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]='A' then               StringGrid2.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]:='NA'
                else
                    begin
                        if StringGrid2.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]='NA' then
                            StringGrid2.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]:=''
                        else
                            StringGrid2.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]:='A';
                    end;
            end;
       end
      else
       Pr_InterceptionTouchesEtendues:=False;
    end;
    Avec ce code, les touches fléchées permettent le déplacement sans modifier l'affichage des cellules. Est-il possible d'obtenir le même résultat avec la molette de la souris (la solution proposée étant l'inhibition totale) ?
    Bon week-end.
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Voici une solution sans inhiber la roulette de la souris.

    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
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    begin
      if (stringGrid1.Row = ARow) and
         (StringGrid1.Col = ACol)
         then begin
                if stringGrid1.Cells[Acol,Arow] = 'A'
                  then stringGrid1.Cells[Acol,Arow] := 'NA'
                  else
                if stringGrid1.Cells[Acol,Arow] = 'NA'
                  then stringGrid1.Cells[Acol,Arow] := ''
                  else
                if stringGrid1.Cells[Acol,Arow] = ''
                  then stringGrid1.Cells[Acol,Arow] := 'A'
              end;
    end;
    Cordialement
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut
    La dernière solution de Pascal n'empêche pas les touches fléchées ni la molette de la souris de changer mes saisies. Mais en repartant de sa première solution et modifiant son AppMessage, j'ai une solution à mon problème. Merci encore à Pascal

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    type
      TForm1 = class(TForm)
      ...
      public
        { Déclarations publiques }
        procedure AppMessage(var Msg:TMsg;var Handled:boolean); 
      ...
     
    procedure TForm1.FormActivate(Sender: TObject);
       ...
        Pr_TouchesEtendues:=False;
        Pr_MoletteSouris:=False;
      ...
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Application.OnMessage:=Form1.AppMessage;
    end;
     
    procedure TForm1.AppMessage(var Msg:TMsg;var Handled:Boolean);
    begin
    //    if Msg.message=WM_MOUSEWHEEL then Msg.message :=0;    = inhibation totale de la molette
        if Msg.message=WM_MOUSEWHEEL then Pr_MoletteSouris:=True;  // ici, simple détection
        Handled:=False;
    end;
     
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
        if key=VK_UP then Pr_TouchesEtendues:=True; // flèche haut
        if key=VK_DOWN then Pr_TouchesEtendues:=True; // flèche bas
        if key=VK_LEFT then Pr_TouchesEtendues:=True; // flèche gauche
        if key=VK_RIGHT then Pr_TouchesEtendues:=True; // flèche droite
        if key=VK_PRIOR then Pr_TouchesEtendues:=True; // écran haut
        if key=VK_NEXT then Pr_TouchesEtendues:=True; // écran bas
        if key=VK_HOME then Pr_TouchesEtendues:=True; // début
        if key=VK_END then Pr_TouchesEtendues:=True; // fin
    end;
     
    procedure TForm1.StringGrid1Click(Sender: TObject);
    begin
      if  Pr_MoletteSouris=False then
        begin
          if Pr_TouchesEtendues=False then
            begin
              if (Pr_SelectColEvaluations>1) and (Pr_SelectRowEvaluations>0) then
                begin
                   if StringGrid1.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]='A' then
                     StringGrid1.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]:='NA'
                   else
                     begin
                       if StringGrid1.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]='NA' then
                         StringGrid1.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]:=''
                       else
                         StringGrid1.Cells[Pr_SelectColEvaluations,Pr_SelectRowEvaluations]:='A';
                    end;
                end;
            end;
        end;
      Pr_TouchesEtendues:=False;
      Pr_MoletteSouris:=False;
    end;
     
    Pr_SelectColEvaluations et Pr_SelectRowEvaluations, variables privées, sont mises à jour dans le OnSelectCell du StringGrid1
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  6. #6
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    juste une petite remarque, pour le test de key, utilise un case, c'est plus propre et plus rapide.
    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
     
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; 
      Shift: TShiftState);
    begin
      case key of
        VK_UP     : Pr_TouchesEtendues:=True; // flèche haut
        VK_DOWN   : Pr_TouchesEtendues:=True; // flèche bas
        VK_LEFT   : Pr_TouchesEtendues:=True; // flèche gauche
        VK_RIGHT  : Pr_TouchesEtendues:=True; // flèche droite
        VK_PRIOR  : Pr_TouchesEtendues:=True; // écran haut
        VK_NEXT   : Pr_TouchesEtendues:=True; // écran bas
        VK_HOME   : Pr_TouchesEtendues:=True; // début
        VK_END    : Pr_TouchesEtendues:=True; // fin
      end;
    end;
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Citation Envoyé par lil_jam63
    juste une petite remarque, pour le test de key, utilise un case, c'est plus propre et plus rapide.
    On peut faire cela aussi
    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
     
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; 
      Shift: TShiftState);
    begin
      case key of
        VK_UP,             // flèche haut
        VK_DOWN,     // flèche bas
        VK_LEFT,       // flèche gauche
        VK_RIGHT,    // flèche droite
        VK_PRIOR,    // écran haut
        VK_NEXT,     // écran bas
        VK_HOME,  // début
        VK_END    : Pr_TouchesEtendues:=True; // fin
      end;
    end;

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

Discussions similaires

  1. Gérer la molette de la souris
    Par thedivxboy dans le forum GLUT
    Réponses: 10
    Dernier message: 03/01/2010, 19h17
  2. Réponses: 4
    Dernier message: 15/11/2009, 18h00
  3. Réponses: 2
    Dernier message: 29/11/2005, 13h38
  4. Réponses: 5
    Dernier message: 14/10/2005, 20h44
  5. [TP]La molette de la souris / le port PS/2
    Par LaGuimb dans le forum Turbo Pascal
    Réponses: 23
    Dernier message: 30/12/2002, 22h01

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