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 :

Ne pas empiler les évènements répétitifs


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mai 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Par défaut Ne pas empiler les évènements répétitifs
    Bonjour à tous ,

    J'espère être au bon endroit.
    Cette fois ci, mon pb est le suivant :
    A chaque fois que je clique sur mon SpeedButton alors même que je le rends Disabled (not Enabled) dès le premier clic, il continue à accumuler ces clics.
    En clair (j'espère), dans l'évènement OnClick du bouton, je le mets à Disabled,
    si je clique 10 fois dessus rapidement, il exécute 10 fois son événement 'OnClick'.
    Ok, je suppose donc que c'est normal. Mais alors comment l'empêcher d'empiler (ou comment vider), tous ces évènements, pour l'empêcher de refaire 10 fois la même chose.

    Merci d'avance à ceux qui pourraient m'aiguiller.

  2. #2
    Membre expérimenté Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Par défaut
    Bonjour,
    Normalement, ça ne doit pas l'être, mais je me demande pourquoi mettre Enabled d'un TSpeedButton à false. Si tu as besoin de changer se forme, tu peux jouer sur les propriétés AllowAllUp et Down
    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
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      with SpeedButton do
      begin
        AllowAllUp := true;
        GroupIndex := 1;
      end;
    end;
     
    procedure TForm1.SpeedButtonClick(Sender: TObject);
    begin
      with SpeedButton do
      Begin
        AllowAllUp := not AllowAllUp;
        Down       := not Down;
      End;
    end;
    Sinon, le mettre à enabled dans le OnClick, pourquoi faire ? Est ce que tu peux expliquer plus
    Bye

  3. #3
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Salut

    Sans doute que Windaube a le temps d'empiler les messages du click (tu cliques peut-être trop vite ou tu trembles ), là-dessus pas de contrôle.
    pour tenter de corriger, n'exécutes le code que si le bouton est désactivé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.SpeedButton1Click(sender: TObject);
    begin
      if SpeedButton1.Enabled then
        try
          SpeedButton1.Enabled := False;
    //     ... ton code ici ...
        finally
          SpeedButton1.Enabled := True;
        end;
    End;
    Ca fait bidouille, mais bon...

    Peut-être qu'un simple Application.ProcessMessages en début de procédure suffirait, à voir...

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  4. #4
    Membre expérimenté Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Salut

    Sans doute que Windaube a le temps d'empiler les messages du click (tu cliques peut-être trop vite ou tu trembles ), là-dessus pas de contrôle.
    pour tenter de corriger, n'exécutes le code que si le bouton est désactivé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.SpeedButton1Click(sender: TObject);
    begin
      if SpeedButton1.Enabled then
        try
          SpeedButton1.Enabled := False;
    //     ... ton code ici ...
        finally
          SpeedButton1.Enabled := True;
        end;
    End;
    Ca fait bidouille, mais bon...

    Peut-être qu'un simple Application.ProcessMessages en début de procédure suffirait, à voir...

    @+
    Ouh la, si tu mets Enabled à false tu ne peux plus exécuter ce code, le OnClick ne peut plus passer ..

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Citation Envoyé par Moez.B Voir le message
    Ouh la, si tu mets Enabled à false tu ne peux plus exécuter ce code, le OnClick ne peut plus passer ..
    Le code de @e-ric est utilisable...

  6. #6
    Membre expérimenté Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Le code de @e-ric est utilisable...
    Salut
    Scénario de test du code de @e-ric:
    Placer un TSpeedButton sur la fiche.
    Mettre à false sa prop Enabled (le désactiver).
    Ajouter le code de @e-ric.
    Exécuter pour voir. le TSpeedButton est toujours disabled.
    Pour moi, ça ne fonctionne pas ...
    Bye

  7. #7
    Inactif
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mai 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Mai 2013
    Messages : 10
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Salut

    Sans doute que Windaube a le temps d'empiler les messages du click (tu cliques peut-être trop vite ou tu trembles ), là-dessus pas de contrôle.
    pour tenter de corriger, n'exécutes le code que si le bouton est désactivé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.SpeedButton1Click(sender: TObject);
    begin
      if SpeedButton1.Enabled then
        try
          SpeedButton1.Enabled := False;
    //     ... ton code ici ...
        finally
          SpeedButton1.Enabled := True;
        end;
    End;
    Ca fait bidouille, mais bon...

    Peut-être qu'un simple Application.ProcessMessages en début de procédure suffirait, à voir...

    @+
    Oui, c'est bien ce que je fais. Le code dans le try n'est donc heureusement pas exécuté.
    Mais, si je clique 20 fois sur le bouton, et que, lorsque j'arrête de cliquer, il reste 10 passages à faire dans le OnClick, il va, évidemment, les faire jusqu'au dernier.
    C'est normal, ok.
    Ce que j'aimerais arriver à faire, c'est l'empêcher de continuer à exécuter les événements restants quand j'arrête de cliquer, en "vidant cette "pile" d'évènements" qui doit être enregistrée quelue part.

  8. #8
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Salut

    Si je comprends bien où tu veux en venir avec :
    Oui, c'est bien ce que je fais. Le code dans le try n'est donc heureusement pas exécuté.
    c'est que tu as vérifié l'état de ton SpeedButton et empêché ainsi le code de s'exécuter. Ok mais on en devrait pas avoir à faire de telles acrobaties à vrai dire.

    Tu affirmes cependant que le gestionnaire est invoqué autant de fois que de clics sur le composant désactivé. Ce que l'on a du mal de comprendre (Moez.B, Ph. B. et moi-même), c'est justement que le gestionnaire est appelé, ce qui n'est pas trop normal en fait. Comment le détectes-tu ?

    Peux-tu (n-ième demande) montrer le code du gestionnaire mais aussi le composant (copier/coller du composant depuis l'EDI vers le message). Utilises-tu un composant standard ou un composant exotique ?

    La pile d'événements, ou plus certainement la file, désolé mais c'est Windows qui se la coltine, donc pour le contrôle, ce sera un autre jour.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Tu affirmes cependant que le gestionnaire est invoqué autant de fois que de clics sur le composant désactivé. Ce que l'on a du mal de comprendre (Moez.B, Ph. B. et moi-même), c'est justement que le gestionnaire est appelé, ce qui n'est pas trop normal en fait. Comment le détectes-tu ?
    On a déjà eu sur le forum, ce problème du Enabled à false qui met du "temps" à réagir !
    Je pense même l'avoir constaté aussi (j'ai utilisé un TPanel à place et jouer sur les Borders)

    Ajoute un faux OnDblClick (moi, j'ai triché ainsi sur un projet de media player qui pouvait délirer dans ses handles si l'on brutalisait la touche pause, cela dépendant du matériel vidéo et des libs fournis, selon les marques il faut faire quelques compromis d'ergonomies au profit de la robustesse, important en vidéo-surveillance)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.SpeedButton1.DblClick(Sender: TObject);
    begin
      if not SpeedButton1.Enabled then
        OutputDebugString(PChar('Please do not brutalize the button'));
    end;

    C'est problablement lié au que le TSpeedButton est un TGraphicControl, en fait le click est fait sur TWinControl qui le contient et c'est ce parent qui dispatche les clics !
    Avec un TButton, normalement on pas ce genre de problème parce que la gestion du click est différente

    Pour vider la pile (si elle est déjà présente lors du 1er clic)
    utilise un PeekMessage PM_REMOVE sur le Handle du Parent, avoir quel message si c'est WM_MOUSEDOWN ou autre du genre
    Le faire aussi en fin de procédure, attention, cela pourrait inhiber d'autres click en cours sur d'autres TGraphicControl du même parent (faudrait filtrer sur les position avec ControlAtPos)

    Attention au piège Application.ProcessMessages, ne pas non plus en abuser, car cela met en pause son traitement pour gérer les messages, du coup, si l'on met ça en plus milieu du traitement du click, tu peux avoir un autre click qui commence le sien comme dans ce sujet

    Au début ou en Fin, il aura un peu l'effet d'un PeekMessage
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par od.ps Voir le message
    si je clique 10 fois dessus rapidement, il exécute 10 fois son événement 'OnClick'.

    On pourrait voir le code ?

  11. #11
    Membre expérimenté Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    On pourrait voir le code ?
    C'est ce que j'ai demandé en premier lieu ..

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/11/2013, 10h01
  2. [A-03]Pas de "sur minuterie" dans les événements
    Par elfiestador dans le forum IHM
    Réponses: 5
    Dernier message: 11/03/2009, 16h38
  3. Réponses: 3
    Dernier message: 01/07/2008, 08h25
  4. comment ne pas afficher les zéro dans un diagramme à barres empilées
    Par sebastien84 dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 10/10/2007, 12h17

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