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 :

Comment détecter un clic de souris dans la cellule active d'un TStringGrid ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 82
    Points
    82
    Par défaut Comment détecter un clic de souris dans la cellule active d'un TStringGrid ?
    Bonjour, j'ai besoin de détecter un clic de souris dans un stringgrid, bien sur j'utilise l'evenement onclick lorsque l'utilisateur selectionne la cellule.

    Mais il y a un cas ou cela ne marche pas.

    Mon stringgrid est éditable, (goediting à true) et lorsque l'utilisateur est en train de remplir une cellule et qu'il clique sur cette même cellule, (pour revenir en arrière corriger une faute de frappe) dans ce cas l'évenement onclick reste muet (j'ai essayé également onmouseup, onmousedown et onmousemove)

    Y aurait-il un moyen quelquonque de détecter ce clic ?

    Merci

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    OnSelectCell ?
    De retour parmis vous après 10 ans!!

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 82
    Points
    82
    Par défaut
    Non, en fait aucun controle courant ne réponds quand la cellule est en cours d'édition, pour l'instant j'ai bricolé un truc en positionnant le curseur de la souris à l'extérieur de mon tableau lorsque la cellule est éditée, comme ça si l'utilisateur veut re-cliquer dessus il est obligé de re-survoler le tableau et à ce moment la onmousemove réponds.

    Mais bon, c'est du bricolage, j'aimerais trouver une solution plus formelle.

    Si quelqun à une idée....

    Merci

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Une solution consisterait à détecter le clic de souris avec GetAsyncKeyState...
    Tu vérifies ensuite que la souris se trouve bien dans la cellule avec PtInRect et Mouse.CursorPos...
    Cela pourrait donner ceci :
    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
    {----------------------------------------------------------------}
    Procedure TForm1.FormCreate(Sender: TObject);
    Begin
      Application.OnMessage := AppMessage;
    End;
     
    {----------------------------------------------------------------}
    Procedure TForm1.AppMessage(Var Msg: TMsg; Var Handled: Boolean);
    Begin
      With StringGrid1 Do
        If (GetAsyncKeyState(1) And 32768 <> 0) And
           (PtInRect(CellRect(Col, Row), ScreenToClient(Mouse.CursorPos))) And
           (EditorMode) Then
        Begin
          OnEditMouseDown;
          Repeat Until (GetAsyncKeyState(1) And 32768 = 0);
          OnEditMouseUp;
        End;
    End;
     
    {----------------------------------------------------------------}
    Procedure TForm1.OnEditMouseDown;
    Begin
      MessageBeep(0);
    End;
     
    {----------------------------------------------------------------}
    Procedure TForm1.OnEditMouseUp;
    Begin
    End;
    De retour parmis vous après 10 ans!!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 82
    Points
    82
    Par défaut
    Alors là ............. chapeau je ne comprends pas comment ça marche, mais ça marche au poil.

    Merci beaucoup et je vais de ce pas me documenter sur GetAsyncKeyState

  6. #6
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Je t'explique dans les grandes lignes. Pour les détails ->

    Application.OnMessage définit la procédure qui sera déclenchée lorsqu'un nouveau message système est détecté par l'application (évènement souris, clavier, statut fenêtre, etc...). GetAsyncKeyState est une fonction qui permet de connaître l'état du clavier et de la souris. Le chiffre 1 en paramètre correspond au bouton gauche. Ce chiffre est issue de la liste des constantes prédéfinies "VK_"... Le fait d'ajouter "And 32768" à la valeur retournée par GetAsyncKeyState permet d'obtenir un résultat binaire (égal ou différent de zéro). Pour le reste du code, je suppose que tu as compris, sinon n'hésite pas à poser des questions, à+
    De retour parmis vous après 10 ans!!

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 82
    Points
    82
    Par défaut
    Impec, grace à tes explications et à l'aide de Delphi, j'ai pu récupérer ton code et le modifier pour gérer dans le même mouvement les touches VK_Right et VK_LEFT qui me posaient le même problème.

    Résolu au dela de mes espérances donc.

    Merci

  8. #8
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Maintenant que tu as compris, j'en profite pour te montrer comment il faut procéder pour obtenir l'appui de touche en simultanné (combinaisons de touches). Il faut mémoriser l'état des touches dans un tableau de booléans et utiliser celui-ci plutôt que l'état retourné par la fonction GetAsyncKeyState :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Var 
      Etat: Array[0..255] Of Boolean;
     
    {----------------------------------------------------------------} 
    Procedure TForm1.AppMessage(Var Msg: TMsg; Var Handled: Boolean); 
    Var
      x: Byte;
    Begin
      For x := Low(Etat) To High(Etat) Do
        If ((GetAsyncKeyState(x) And 32768) <> 0) Then Etat[x] := True Else 
        If ((GetAsyncKeyState(x) And 32768) = 0) Then Etat[x] := False;
     
    { <- le reste de ton code ici... -> }
    End;
    Ainsi, pour connaître l'état du bouton gauche, utilise plutôt Etat[VK_LBUTTON].
    Par exemple, si je veux détecter l'appui du bouton gauche avec la touche Ctrl enfoncée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (Etat[VK_LBUTTON]) And (Etat[VK_CONTROL]) Then ...
    Voici une démo utilisant ce procédé : http://sub0.developpez.com/delphi/mouse.zip

    à+
    De retour parmis vous après 10 ans!!

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Points : 82
    Points
    82
    Par défaut
    Ok effectivement cela rends les acces aux touches beaucoup plus simple.

    Merci pour le code.


    Dans un premier temps je fini mon appli et lorsque j'en serais au stade peaufinage / optimisation je monterais un type d'acces comme celui ci.

    (Car pour l'instant j'en suis encore au stade bourre bourre bourre il faut que ce soit fini pour hier )

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

Discussions similaires

  1. Comment détecter le clic du bouton central dans un Table LWUIT ?
    Par andrianiaina dans le forum Développement Mobile en Java
    Réponses: 0
    Dernier message: 20/05/2011, 17h39
  2. [VBA-E] Evvènement sur clic de souris dans une feuille Excel
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/12/2006, 14h40
  3. Réponses: 4
    Dernier message: 10/09/2006, 19h06
  4. Réponses: 5
    Dernier message: 16/06/2006, 09h16
  5. Réponses: 4
    Dernier message: 11/06/2006, 05h39

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