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

API, COM et SDKs Delphi Discussion :

Différencier le simple du double Clique


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Différencier le simple du double Clique
    J'ai parcouru pas mal de forum et commentaire divers.

    Ma problématique :
    Pouvoir différencier sur un TPanel le clique du double clique

    J'ai un évenement OuMouseDown (qui me permet d'initialiser l'evenement OnMousemouve) et divers recherche dans des base de donnés + quelques autres paramétres.
    J'ai également l'evenement OnDblCLick sur ce panel qui me permet d'ouvrir une fenêtre (une form)

    Lorsque je doubleclique ma fenetre s'ouvre bien, mais à la fermeture il réalise l'évenement OuMousedown.

    Je n'arrive pas à empecher d'aller dans l'evenement OuMouseDown lorsqu'il y à un Double clique.

    Apparement j'ai pu voir des commentaires sur l'evenement WM_LBUTTONDBLCLK de windows ou l'on pourrais detecter le double clique en comparant le temps entre 2 cliques.

    Mais je sais pas du tout comment m'y prendre. Il y à-t-il des spécialistes dans le coin ?

    Merci.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    effectivement, c'est le temps entre 2 clics qui te dit si c'est un double ou un unique ; temps : tu stockes la valeur renvoyée par GetTickCount et tu fais la différence avec la précédente
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Avec le parmètre GetTickCount qui donne le temps depuis l'alluimage du PC je n'arrive pas à savoir si on clique simple ou clique double malheureusement c'est impossible.

    Il y aurait-il un exemple quelque par de ce que je cherche ?

    Merci

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Tu peux consulter les deux discussions suivantes :
    http://www.developpez.net/forums/d34...-click-souris/
    http://www.developpez.net/forums/d38...k-onmousedown/

    Ton soucis devrait être résolu avec tout ça
    @+
    Ero-Sennin

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Merci pour le lien, mais il n'y à pas de code exemple.

    Si Sub0 est dans les parages se serait sympa qu'il donne son exemple.

    Car je vois vraiment pas comment faire.

  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
    Salut!

    C'est exactement ce problème que j'ai expliqué dans l'autre topic, c'est-à-dire qu'avec ma solution, il y aura toujours un délai avant l'action du onmousedown, le temps que le système puisse détecter si il s'agit d'un doubleclick ou non.

    Si tu veux, je te prépare une demo
    De retour parmis vous après 10 ans!!

  7. #7
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Réponse de Béotien :

    • pourquoi ne pas disposer d'un boolean commun aux 2 fonctions (OnMouseDown et OnDblClick)
    • l'initialiser à False,
    • lui donner la valeur True dans le OnDblClick
    • tester sa valeur dans OnMouseDown avant d'effectuer le traitement de la tache, et ne pas oublier de lui rendre sa valeur False à la fin du OnMouseDown.
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  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
    Citation Envoyé par archonte Voir le message
    • pourquoi ne pas disposer d'un boolean commun aux 2 fonctions (OnMouseDown et OnDblClick)
    • l'initialiser à False,
    • lui donner la valeur True dans le OnDblClick
    • tester sa valeur dans OnMouseDown avant d'effectuer le traitement de la tache, et ne pas oublier de lui rendre sa valeur False à la fin du OnMouseDown.
    Le problème est là justement. Avant d'obtenir l'evènement du ondoubleclick, tu auras forcement celui du onmousedown qui sera détecté...
    Donc, la seule solution selon moi est d'attendre de savoir si c'est bien un doubleclick avant de décider d'une action. Grossomodo :

    - Au premier click, on lance un genre de timer
    - Si au bout d'un certain temps, le 2ème click n'est pas arrivé, c'est qu'il s'agit d'un simple click, sinon d'un double
    De retour parmis vous après 10 ans!!

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Je déseperais lol...

    J'ai pas réussi avec les différents topic donnée de réussir à le faire.

    Si tu as un exemlpe simple se serais sympa de ta par.

    Aujourd'hui je travail avec des variable global mais je n'arrive tojour pas à empeche le premier clique de faire l'action down, mais au moins j'empeche de refaire l'aciton down si double clique.

    A te lire.

  10. #10
    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
    Ah oui, tout à fait.
    Justement, tu n'arriveras pas à désactiver l'action onmousedown, il faut simplement la permettre quand tu es sûr qu'il ne s'agit pas d'un double clic.

    Citation Envoyé par Sub0 Voir le message
    - Au premier click, on lance un genre de timer
    - Si au bout d'un certain temps, le 2ème click n'est pas arrivé, c'est qu'il s'agit d'un simple click, sinon d'un double
    Autrement dit, l'action du simple clic et du double clic sera lancée après ce test.
    C'est pourquoi le onmousedown ne peut plus avoir une action instantannée.
    C'est ce que j'ai expliqué...

    Je vais faire une démo.
    De retour parmis vous après 10 ans!!

  11. #11
    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
    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
    Unit Unit1;
     
    Interface
    Uses Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls;
     
    Type
      TForm1 = Class(TForm)
        Panel1: TPanel;
        Timer1: TTimer;
        Procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Timer1Timer(Sender: TObject);
      End;
     
    Var Form1: TForm1;
     
    {----------------------------------------------------------------}
    {                       }Implementation{                         }
    {----------------------------------------------------------------}
    {$R *.dfm}
     
    {----------------------------------------------------------------}
    Procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    Begin
      If Not(Timer1.Enabled)Then Begin
        Timer1.Enabled := True;
        Exit;
      End;
      Timer1.Enabled := False;
      ShowMessage('Double click');
    End;
     
    {----------------------------------------------------------------}
    Procedure TForm1.Timer1Timer(Sender: TObject);
    Begin
      Timer1.Enabled := False;
      ShowMessage('Simple click');
    End;
     
    {----------------------------------------------------------------}
    End.
    Le timer doit avoir les propriétés suivantes dans le DFM du programme :
    Interval = 700 (ou 500, c'est toi qui voit)
    Enabled = False
    De retour parmis vous après 10 ans!!

  12. #12
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Je doit être idiot mais.

    Tu dit tu dois autoriser l'action MouseDown que lorsque tu est sur que ce n'ai pas un doubleclique.

    Avec ta proposition qui se situe au niveau du Mouseup c'est impossible de faire fonctionner le tout, puisque l'action MouseDown à lieu AVANT le MouseUp.

    Donce je clique les evenement suivant arrive :
    MouseDown
    Simpleclique
    MouseUp
    Je double clique on à
    MouseDown
    MouseUp
    Doubleclique
    MouseUp

    A chaque fois on commence par Mousedown non ? donc ton timer ne peux pas fonctionner dans un MouseUP ? je me trompe ?.

  13. #13
    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
    Citation Envoyé par BuzzLeclaire Voir le message
    je me trompe ?.
    Oui, parce-qu'avec le code que j'ai posté, on pourrait aussi bien utiliser onmousedown que onmouseup pour lancer le timer. En fait, ça marche dans les 2 cas...

    Mais bon, finalement, j'ai choisi la méthode onmousedown car la méthode onmouseup me sert pour améliorer les evènements onclick et ondblclick du programme. Par exemple, le relachement du bouton doit être effectué dans le panel pour valider le click... Voilà le code de cette nouvelle démo:

    Nouvelle démo.

    N'hésite pas à reposter si tu as des questions ou des remarques.

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

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Non on ne peut pas, le LMouseUp est obligatoire.

    L'ordre des messages pour un simple click est:
    WM_LBUTTONDOWN, WM_LBUTTONUP

    Pour un double-click:
    WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLICK, WM_LBUTTONUP

    Le message bouton pressé ne survient qu'une fois

    Edit: Je ne peux pas accéder à la démo Sub0, clicker sur le lien me plante le navigateur

  15. #15
    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
    Citation Envoyé par Andnotor Voir le message
    Je ne peux pas accéder à la démo Sub0, clicker sur le lien me plante le navigateur
    Pourtant l'archive a l'air de fonctionner correctement...
    Peut-être en en créant une nouvelle alors :

    clicks3.zip
    De retour parmis vous après 10 ans!!

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    MouseDown est bien invoqué dans les deux cas.
    Ma remarque ne concerne donc que lors d'une gestion similaire par hook.

  17. #17
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bon j'ai essayer ta propoisition Sub0 mais cela ne fonctionne pas.

    Voici mon evenement ShapeMouseDown
    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
     
    procedure TFormPrincipal.ShapeMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Var
      ChaineDroite, ChaineGauche, ChaineDroiteX : String;
    begin
    ... // Plusieur initialisation de variable global
      if (Button = mbRight) then Begin
        Application.ShowHint := False;
        Exit;
      End;
     
      If Not (Timer2.Enabled) Then
      Begin
        Timer2.Tag := 1;
        Timer2.Enabled := True;
    .......
        If (X >= TShape(Sender).Width-3) then //  And (ssCtrl in Shift)
        Begin
    ...
    // Lecture dans une base de donnée de diverses info
    ...
          Cote:=2;
    ... 
        end
        else
        Begin
    ...
    // Lecture dans une base de donnée de diverses info
    ...
          Cote:=3;
          Pos := Point(x,y);
    ....
        end;
     
        Exit;
      end;
      Timer2.Enabled := False;
    end;
    Le TIMER

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TFormPrincipal.Timer2Timer(Sender: TObject);
    begin
      If (Timer2.Tag = 1) Then Exit;
      Timer2.Enabled := False;
    end
    ;

    L'évenement Shape double clique qui ce déclanche selon les conditions du Down

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TFormPrincipal.ShapeDblClick(Sender: TObject);
    Var
      ChaineDroite, ChaineDroiteX: String;
      ChaineGauche: String;
    begin
    // On recherche la référence Le Shape
      StatusBar1.Panels[0].Text := 'Modification tâche';
    ...
    /// Plein de bidule machin chose
    ...
      StringGridSemaine.CheckInBounds;
      StatusBar1.Panels[0].Text := 'Planning '+Commun.Version;
    end;
    Mon evenement UP
    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 TFormPrincipal.ShapeMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Var
      xColonne, xColonneDebut, xHeure, xHeureDebut, xLigne: Integer;
      JourDeDebutEnNbr, JourDeFinEnNbr: Integer;
      HintModifDirecte, xCodeSal: String;
    begin
      If Not (Button = mbLeft) Or
         Not (PtInRect(TShape(Sender).ClientRect,
           TShape(Sender).ScreenToClient(mouse.CursorPos))) Then
        Timer2.Enabled := False;
      Timer2.Tag := 0;
    ...
    // Divers enregistrement de Table
    ...
    end;
    Concretement lorsque je double clique et bien il me fait quand même l'evenement down 2 fois, donc je tombe sur une erreur de lecture de mes champs.

  18. #18
    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
    Oui, je vois que tu n'arrives pas encore à adapter ma solution dans ton programme.

    Attention : onmousedown et onmouseup ne doivent servir que pour la détection, il ne doit y avoir que mon code dans ces méthodes. Dans ton programme, tu dois utiliser les méthodes ShapeClick et ShapeDblClick pour programmer les actions du simple et double click.

    Déjà, tu dois enlèver l'evènement ShapeDblClick de ton DFM puisque tu le génères toi-même maintenant dans le ShapeMouseDown().
    Donc, à la place de mon ShowMessage('double click'), tu dois mettre :Ensuite, c'est pareil pour le simple click qui est généré dans le timer. Regarde où se trouve mon ShowMessage dans la démo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFormPrincipal.Timer2Timer(Sender: TObject);
    begin
      If (Timer2.Tag = 1) Then Exit;
      Timer2.Enabled := False;
      ShapeClick(Shape);
    end
    J'espère que tu as compris le principe : C'est toi qui génère les evènements et non plus le composant.
    A+
    De retour parmis vous après 10 ans!!

  19. #19
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    J'ai bien compris ton explication et ton exemple.

    Alors le problème c'est que j'ai besoin de
    (Button: TMouseButton; Shift: TShiftState; X, Y: Integer)
    comme information c'est pour cela que j'utilise le MouseDown !! je ne retrouve pas cela dans le ShapeClick(Sender) ?

    Alors j'ai tenter de mettre mes fonctions comme je l'ai décris en dessous et cela fonctionne super lol, j'ai juste un probleme, lorsque que je simple clique et que rapidement je sort du control (le Shape) il me fait un doubleclick dont il génère mon travail.
    Même avec la version 3 qui comprends l'evenement UP, à un moment donner surtout au reclick sur le control il me genere 1 fois sur 3 à tord un doubleclik.

    concretement j'utilise le premier clique maintenue pour mouvoir Mon shape (le faire bouger) et le double clique pour ouvrir une fenetre de saisie.
    Dans les 2 cas j'ai besoins des infos X et Y, Tbutton et Shiftstate !!

    Tu vois ?

  20. #20
    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
    D'après moi, la meilleure solution dans ton cas serait de mettre ces paramètres dans des variables globales pour les utiliser après dans onclick ou ondblclick. On ne peut pas bien faire autrement : Il faut que tu génères le simple click dans le timer et le double click à la fin du onmousedown. Je ne peux pas te proposer mieux ni plus facile hélas, l'algo est trop simple...

    Voici pour toi mon code modifié:
    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
     
    Var 
      MyButton: TMouseButton; 
      MyShift: TShiftState; 
      MyX, MyY: Integer;
     
     
    {----------------------------------------------------------------}
    Procedure TFormPrincipal.ShapeMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Begin
      Mybutton := Button;
      Myshift := Shift; 
      MyX := X;
      MyY := Y;
      If Not (MyButton = mbLeft) Or
        Not (PtInRect(TShape(Sender).ClientRect,
        TShape(Sender).ScreenToClient(mouse.CursorPos))) Then
        Timer2.Enabled := False;
      Timer2.Tag := 0;
    End;
     
    {----------------------------------------------------------------}
    Procedure TFormPrincipal.ShapeMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      Mybutton := Button;
      Myshift := Shift; 
      MyX := X;
      MyY := Y;
      If Not (MyButton = mbLeft) Then Exit;
      If Not (Timer2.Enabled) Then Begin
        Timer2.Tag := 1;
        Timer2.Enabled := True;
        Exit;
      End;
      Timer2.Enabled := False;
      MyX := X;
      MyY := Y;
      ShapeDblClick(Sender);
    End;
     
    {----------------------------------------------------------------}
    Procedure TFormPrincipal.Timer2Timer(Sender: TObject);
    Begin
      If (Timer2Tag = 1) Then Exit;
      Timer2.Enabled := False;
      ShapeClick(Shape);
    End;
     
    {----------------------------------------------------------------}
    Procedure TFormPrincipal.ShapeClick(Sender: TObject);
    Begin
      ...
    End;
     
    {----------------------------------------------------------------}
    Procedure TFormPrincipal.ShapeDblClick(Sender: TObject);
    Begin
      ...
    End;
    Ensuite, tu utilises tes variables comme tu veux dans shapeClick et ShapeDblclick, c'est plus propre selon moi.
    Essaye comme ça plutôt.

    Pour être plus précis, récupère la position actuelle de la souris directement dans le onclick et le ondblclick comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {----------------------------------------------------------------}
    Procedure TFormPrincipal.ShapeClick(Sender: TObject);
    Begin
      MyX := TShape(Sender).ScreenToClient(mouse.CursorPos).X;
      MyY := TShape(Sender).ScreenToClient(mouse.CursorPos).Y;
      ...
    End;
    ► Mais surtout n'oubli pas qu'il ne faut rien assigner aux evènements onclick et ondblclick du shape dans l'inspecteur d'objet.
    Uniquement onmousedown et onmouseup ont leur méthode, c'est important :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Shape.onclick := Nil;
    Shape.ondblclick := Nil;
    A+
    De retour parmis vous après 10 ans!!

Discussions similaires

  1. [WD18] Différencier le simple clic du double clic
    Par ynsmtkl dans le forum WinDev
    Réponses: 8
    Dernier message: 01/02/2015, 11h52
  2. Différencier un clique d'un double clique
    Par gingman dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/03/2006, 23h12
  3. [Jar] Double clique ne fonctionne pas ...
    Par sylvain_2020 dans le forum Général Java
    Réponses: 4
    Dernier message: 11/08/2004, 19h24
  4. [MFC] Ouvrir un document par double-clique
    Par Choupinou dans le forum MFC
    Réponses: 7
    Dernier message: 03/08/2004, 12h38
  5. Réponses: 4
    Dernier message: 05/07/2004, 13h17

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