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

C++Builder Discussion :

Double click sur un TSpeedButton


Sujet :

C++Builder

  1. #1
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut Double click sur un TSpeedButton
    Bonjour,
    J'aimerais différencier l'appuie long sur un TSpeedButton précédent un click ou un double click.
    J'ai déjà un Timer qui me permet de détecter si l'utilisateur n'a pas relaché le bouton au bout de 500ms, mais je ne le détecte que sur un click seul.

    L'évènnement OnDblClick du TSpeedButton ne se déclenche jamais, même lorsqu'il est seul. Ais-je loupé quelque chose ?

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut bandit boy:
    J'ai fait un essai chez moi sur BCB6, effectivement les evenements souris declanche sauf le double click.

  3. #3
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Cool ca me rassure !
    Ca confirme que le problème ne vient pas de moi, mais qu'il y a bien un soucis de ce côté là.

    Maintenant, comment corriger se soucis ??

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut bandit boy:
    Est ce que tu ne pourrais pas faire un petit Hook sur le composant?

  5. #5
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Un hook sur la souris oui, mais je n'ai pas vu de Flag double click.

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Sur le lien sur les hooks claviers
    Ils parlent de l'evenement WM_LBUTTONDBLCLK

  7. #7
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Je ne veux pas rajouter ou travailler par dll, je trouve ca complexe, surtout pour un double click.
    L'idée est bonne, je vois comment faire un hook souris sans dll.
    Merci de l'idée

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Je ne suis pas sur que l'on peut appeler ca un Hook mais je pensais a quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEGIN_MESSAGE_MAP
    // utiliser wm_keyup pour recuperer les touches sauf ALT
            MESSAGE_HANDLER(WM_KEYUP, TMessage, onRBUTTONUP)
    // utiliser wm_syskeydown pour recuperer ALT
            MESSAGE_HANDLER(WM_SYSKEYDOWN, TMessage, onRBUTTONUP)
            MESSAGE_HANDLER(WM_LBUTTONDBLCLK, TMessage, onRBUTTONUP)
    END_MESSAGE_MAP(TForm)
    a adapter a ses besoins bien sur

  9. #9
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Je ne saisie pas tout là.

  10. #10
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Et bien avec:
    dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public:		// User declarations
            __fastcall TForm1(TComponent* Owner);
    void __fastcall onRBUTTONUP(TMessage& Msg);
    BEGIN_MESSAGE_MAP
            MESSAGE_HANDLER(WM_LBUTTONDBLCLK, TMessage, onRBUTTONUP)
    END_MESSAGE_MAP(TForm)
    dans le .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TForm1::onRBUTTONUP(Messages::TMessage& Msg)
    {
    // on recupere le message WM_LBUTTONDBLCLK
     
    // puis on le traite
    switch (Msg.WParam)
            {
     
    case
    C'est une facon de capturer les evenements claviers souris ou autre, personnellement c'etait pour le clavier, c'est pourquoi il y a des evenements clavier dans le post precedent je n'avais pas nettoye le code.

  11. #11
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Mais quand tu fais ca, tu as créé la DLL et tu t'en sert? ou tu utilise une autre méthode?

    La fonction seule ne se déclenche pas à l'évènnement souris ?

  12. #12
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut bandit boy:
    On ne cree pas de DLL on est dans le programme.
    D'apres ce que je comprend tu capture les evenements emis par Windows, et tu les traites mais cela dans le programme, personnellement je l'avais utilise pour capturer le clavier, et dans un switch case je traitais l'evenement, soit escape soit CTRL ..., donc la tu doit pouvoir recuperer le double clic, la position souris, j'ai lance une recherche sur developpez avec BEGIN_MESSAGE_MAP c'est utilise en VC++ il y a un exemple dans truc et astuces de GCI, si je trouve traitant de la souris je le poste.
    Je viens de trouver un lien ce n'est pas tout a fait ce que tu cherche mais les explications sont plus claires que les miennes.
    A+

  13. #13
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Je te joind un autre lien bien plus interressant.

  14. #14
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738

  15. #15
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Ok, j'ai pigé mais le truc est que l'on pointe sur une class. Donc on pointe sur TForm1, et non sur un TButton ou un autre composant. Maintenant, il faut faire une classe avec un bouton et je ne sais pas faire ca.

    Je me renseigne sur la création de class et je tente.
    Je sens qu'on touche au but !

  16. #16
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut bandit boy:
    Avec cette methode tu a acces a la position de la souris et au double click en connaissant la position du bouton il faut faire un test
    si double click et position ok alors execute la fonction double click.

  17. #17
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    tout simplement,
    OK je pense que le sujet est résolu maintenant.

    Merci encore

    J'ai parlé trop vite. Quand tu fais un double clic sur le bouton, il n'est pas détecté vu qu'il n'est pris que sur la classe et donc la Form.

  18. #18
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Je n'ai pas testé mais voici une idée, à la suite de ton mp.
    La classe TButton dérive de TControl et par conséquent hérite de l'événement OnDblClick qui n'est cependant pas publié au niveau de la classe TButton, sans doute à cause des mécanismes pouvant être liés en aval au TButton (???).
    Il n'y a donc pas nécessité à créer d'événement (begin map... end map).
    Dans le scope de la classe, la OnDblClick est accessible :

    Au niveau du .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class jButton : public TButton
    {
    private:
    protected:
     
    public:
            __fastcall jButton(TComponent *Owner, AnsiString N);
            __fastcall ~jButton();
            //déclaration de la méthode pour le double click
            void __fastcall WhenDblClick(TObject *Sender);
    };
    Au niveau du .cpp

    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
    __fastcall jButton::jButton(TComponent *Owner, AnsiString N)
        : TButton(Owner)
    {
    Caption = N;
     
    //Pour lui affecter un parent immédiatement, si Owner dérive de TWinControl
    //alors Owner est tout désigné...
     
    if(Owner->InheritsFrom(__classid(TWinControl))) Parent = (TWinControl*)Owner;
     
    //On accroche la méthode du double click
     
    OnDblClick = WhenDblClick;
    }
     
    __fastcall jButton::~jButton()
    {
    }
     
    void __fastcall jButton::WhenDblClick(TObject *Sender)
    {
    //... le code 
    }
    Il faudrait voir si ça fonctionne !

    A plus !

  19. #19
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut, je te remercie pour ta réponse.
    J'ai juste ajouté la création du bouton avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       new jButton(Form1,"DblClkBtn");
    mais le truc c'est que l'évènement 'Double-clic" n'existe pas sur ce type de control, la compilation s'effectue bien, mais l'évènnement ne se génère pas.
    C'est pourquoi j'avais prévu de faire le MAP, suivant les conseils de blondelle.

Discussions similaires

  1. BDD double click sur une DBGrid
    Par chamamo dans le forum C++Builder
    Réponses: 5
    Dernier message: 30/10/2006, 15h20
  2. double click sur un bouton
    Par gdpasmini dans le forum Windows
    Réponses: 7
    Dernier message: 10/05/2006, 14h38
  3. [VBA-E] Double-Click sur une cellule
    Par boosty dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/04/2006, 15h12
  4. [MFC] Detection d'un double click sur un slider
    Par bennnun dans le forum MFC
    Réponses: 4
    Dernier message: 01/03/2006, 08h07
  5. simuler un double click sur une liste dans un dbgrid
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 1
    Dernier message: 01/09/2005, 10h45

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