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

Delphi Discussion :

Désactiver le "double-click" dans une appli


Sujet :

Delphi

  1. #1
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut Désactiver le "double-click" dans une appli
    Bonjour,

    Dans mon logiciel, j'ai des boutons qui déclenchent des action longues sur un "click". Mon problème est que l'utilisateur, s'il fait deux clicks rapides sur le meme bouton, fait planter l'application car on entre deux fois dans la meme procedure : BIZARRE!!!!!

    Quelqu'un a-il déjà rencontrer ce problème et comment le résoudre une fois pour toute, sans être obligé d'implémenter dans caque action déclenchée ?

  2. #2
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Salut,

    Corriger ton problème sans corriger chaque procedure responsable de ce problème, je ne sais pas si c'est possible.
    En revanche tu peux isoler les procédures longues et rajouter ces lignes de codes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var OldEvent: TNotifyEvent;
    begin
      OldEvent := TonButton.OnDblClick; 
      TonButton.OnDblClick := nil; 
    ....Ton code...
      TonButton.OnDblCLick := OldEvent;
    end;
    A+.
    For crying out loud !

  3. #3
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Il me semble, pour ton pb plus cohérent de modifier le fonctionnement de l'appli. C'est à dire, d'empècher de lancer 2 fois la même procédure.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    N'est-il pas plus simple de faire en sorte que le 1er click sur le bouton considéré provoque immédiatement la neutralisation du bouton ? Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure form1.button1click(sender..);
    begin       button1.enabled:=false;
                  button1.Refresh; // pour prise en compte immédiate du false
                  puis instructions de lancement de l'action longue 
    end;
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    => Gilbert.
    Oui en fait, c'est ce que je sous entendais.
    Ne pas oublier de le remettre en enable à la fin....

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    ou meme déplacé ton traitement dans mouseup
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  7. #7
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Citation Envoyé par edam
    ou meme déplacé ton traitement dans mouseup
    J'vois pas ce que ça change ? un intérêt particulier dans ce contexte ?

    Car, cela implique toujours de coder un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    button1.enabled:=false;
    button1.Refresh;
    ou ya un truc qui m'échappe ?

  8. #8
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut
    Bon, si je résume, j'ai deux solutions :

    - soit je vais dans chaque procedure lancée par un click et j'insere un booleen qui empeche de rentrer plusieurs fois dedans : UN PEU CONTRAIGNANT

    - Soit je surcharge les le onclick de mes bouton en le rendant "enabled" le temps que l'action qu'il contienne se finisse. Mais comment est-ce possible de déterminer la fin de l'action Onclick?

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    ou meme déplacé ton traitement dans mouseup
    Vraiment???? Le lancement du traitement ne serait-il pas alors déclenché au mouseUp du 1er-click puis-redéclenché au mousUp du 2ème-click ? ce que Tchaill39 veut empêcher.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    - Soit je surcharge les le onclick de mes bouton en le rendant "enabled" le temps que l'action qu'il contienne se finisse. Mais comment est-ce possible de déterminer la fin de l'action Onclick?
    A la fin de ta procédur OnClick tu remet ton button à "enabled":=true;...Pas besoin de savoir quand elle se termine, dès qu'elle est finie, tu autorise ainsi à nouveau à la réappliquer.

    A+.
    For crying out loud !

  11. #11
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut
    Le probeme de fond est le suivant :

    - Une procedure est déclenchée sur un événement
    - Afin d'empecher à l'appli de rentrer une nouvelle fois dans le code, il faut détecter le fin de l'événement onclick, ce qui n'est à mon avis pas possible, sauf dans le cas où on le fait à l'intérieur de chaque procédure.

    Une autre solution serait peut-être dans l'objet bouton d'insérer un timer et d'empecher da réalisation d'un nouveau click selon un délai défini.....

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    je surcharge les le onclick de mes bouton en le rendant "enabled" le temps que l'action qu'il contienne se finisse. Mais comment est-ce possible de déterminer la fin de l'action Onclick?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure tagada.ButonXClick(sender ...);
    begin           ButonX.enabled:=false;
                      ButonX.refresh;
                      traitement pendant lequel le bouton est désactivé 
                      ButonX.enabled:=true; // : ré-activation du bouton
    end; // <--- fin de l'action Onclick
    Pigé ?

    C'est ce que Philnext visait en disant "Ne pas oublier de le remettre en enable à la fin...."
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  13. #13
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    J'ai du mal à comprendre ton problème...
    Si comme je le suppose ton traitement est lancé dans le OnClick du bouton, il est très simple rendre inactif ton bouton pendant la durée du traitement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Button1.Enabled := False;
      Button1.Refresh;
      //
      // ton traitement long...
      //
      Button1.Enabled := True;
    end;
    Ce code a d'ailleurs déjà été proposé !
    [edit] Oops grillé par Gilbert [/edit]

    @+Claudius

  14. #14
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Je réexplique comme il faut alors, désolé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure form1.button1click(sender..); 
    begin
    button1.enabled:=false; button1.Refresh; // pour prise en compte immédiate du false  puis instructions de lancement de l'action longue 
    ...
    Ton code de ton boutton
    ...
    button1.enabled:=true; button1.Refresh;
    end;
    Tant que ton button1.enabled est à false, il est "grisé": il sera impossible à l'utilisateur de cliquer, dblcliquer,... dessus. Ces évènements sont donc désactivés. Quand tu le repasse à true, ils sont réactivés.

    Si l'effet "grisé" ne plait pas à toi ou à tes clients, utilisent plutôt mon premier conseil pour désactiver un évènement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure form1.button1click(sender..); 
    var OldEvent: TNotifyEvent;
    begin
      OldEvent := TonButton.OnDblClick; 
      TonButton.OnDblClick := nil; 
    ....Ton code...
      TonButton.OnDblCLick := OldEvent;
    end;
    L'idée du Timer n'ai pas une idée à mon avis, puisque tu n'a aucun moyen de connaître précisemment le temps de tes action si tu as un multi-tâche important, ce qui t'obliugerais à prendre un intervalle de timer trop important.

    A+.

    [Edit]Ouais, alors là j'arrive carrément après la bataille, le rangement du champs de bataille et la reconstruction de la ville... [/Edit]
    For crying out loud !

  15. #15
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    et si le code de ton bouton est simplement un appel à une autre procédure, c'est pas génant, tous les exemplesci-dessus fonctionneront...

  16. #16
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    et puis si c'est vraiment long.. tu peux aussi gérer le pointeur de ta souris...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button1Click(Sender: TObject);
    var
      p : TCursor;
    begin
      p := Screen.Cursor;
      Screen.Cursor := crHourGlass;
      button1.enabled:=false; button1.Refresh;
     
    //   ton code
     
      button1.enabled:=true; button1.Refresh;
      Screen.Cursor := p;
    end;

  17. #17
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Tchaill39 : Vu? YA+K !
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  18. #18
    Membre régulier Avatar de Tchaill39
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 110
    Points : 70
    Points
    70
    Par défaut
    Toutes vos idées sont très bien. C'est en gros ce que je fait aujourdh'ui sur mes boutons.

    Je cherchais une idée pour ne pas avoir à faire cette manipulation à chaque fois que je rajoute un bouton ou tout autre objet avec événement...

    L'idée du timer est je vous l'accorde un peu farfelu mais c'est la seule qui me permet d'insérer le controle dans l'objet bouton !!!!!!

  19. #19
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Je cherchais une idée pour ne pas avoir à faire cette manipulation à chaque fois que je rajoute un bouton ou tout autre objet avec événement...
    Si c'est pour économiser le nombre de manips gère le code de Whiler comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure Bascule(unBouton : tButton);
    begin     with Screen do 
                if cursor=crHourGlass then cursor:=crDefault
                                             else cursor:=crHourGlass; 
                with Form1 do
                begin if unBouton.enabled=true 
                        then unBouton.enabled:=false
                        else unBouton.enabled:=true;
                        unBouton.Refresh;
               end;
    end;
    ... ce qui réduit toutes les procèdeures boutonClick à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    begin        Bascule(Button1);  
     
                   //   ton code
     
                   Bascule(Button1);  
    end;
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  20. #20
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Si c'est juste le doubleclick qui gène, une autre solution c'est : plutôt que de mettre des boutons, mettre un composant qui gère le OnDblClick (style Tpanel) avec un look de bouton et tu fais pointer ton OnDblClick sur le OnClick.

Discussions similaires

  1. Click droit dans une TextBox
    Par BRUNO71 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 17/01/2019, 15h01
  2. [XL-2007] Double condition If dans une boucle for
    Par luko6 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/11/2009, 14h01
  3. Réponses: 1
    Dernier message: 30/04/2009, 17h19
  4. Double affichage OpenGL dans une meme fenetre
    Par greghass dans le forum OpenGL
    Réponses: 3
    Dernier message: 13/11/2006, 21h57

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