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

  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
    Points : 10
    Points
    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 averti 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 : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    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
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  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 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    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 averti 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 : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    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 ..
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    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 ?
    Philippe.

  6. #6
    Membre averti 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 : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    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 ..
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  7. #7
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    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...
    Philippe.

  8. #8
    Membre averti 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 : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    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
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  9. #9
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par Moez.B Voir le message
    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
    Soyons sérieux. Je suppose que le TSpeedButton a la valeur initiale de sa propriété Enabled inchangée, à savoir True, sinon comment pourrait-on cliquer ne serait ce qu'une seule fois sur le bouton ???
    Par contre il est vrai que la formulation de @e-ric est maladroite quand il dit :
    Citation Envoyé par e-ric Voir le message
    pour tenter de corriger, n'exécutes le code que si le bouton est désactivé :
    Il a certainement voulu dire le contraire à savoir, s'assurer que l'état du bouton est activé (Enabled) pour traiter l'événement et l'ignorer dans le cas contraire... Le 1° événement est traité et les éventuels suivants ignorés tant que le bloc try finally n'est pas entièrement exécuté...
    Philippe.

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Réponse @Moez.B :
    Je désactive le speedbutton par code, sous-entendu, il ne l'est pas à l'instantiation de la fiche... (je ne suis quand même pas bourrin à ce point-là). Je n'ai fait que m'appuyer sur les explications de od.ps :

    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,
    => la désactivation est faite par code.

    Faut lire...

    C'est vrai que le problème est bizarre, et que od.ps devrait publier son code.

    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."

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    @Ph. B. , admettons qu'il y ait une petite ambiguité sur mon explication mais pas sur mon code comme tu l'as remarqué.

    L'ambiguïté est en fait assez légère du moment où l'on comprend que od.ps désactive le speedButton par code dans l'événement OnClick. J'ai déjà vu des spéc. plus ambiguës...

    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."

  12. #12
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par e-ric Voir le message
    @Ph. B. , admettons qu'il y ait une petite ambiguité sur mon explication mais pas sur mon code comme tu l'as remarqué.

    L'ambiguïté est en fait assez légère du moment où l'on comprend que od.ps désactive le speedButton par code dans l'événement OnClick. J'ai déjà vu des spéc. plus ambiguës...
    Initialement, il n'y en avait pas pour moi, mais ce n'est pas le cas de tous...
    Philippe.

  13. #13
    Membre averti 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 : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par e-ric Voir le message
    @Ph. B. , admettons qu'il y ait une petite ambiguité sur mon explication mais pas sur mon code comme tu l'as remarqué.

    L'ambiguïté est en fait assez légère du moment où l'on comprend que od.ps désactive le speedButton par code dans l'événement OnClick. J'ai déjà vu des spéc. plus ambiguës...
    Salut, eh oui, on revient à la question du départ de od.ps, car nous avons demandé de filer un peu de son code sinon, on va avoir à des dizaines de réponses pour un problème flou ...
    Je reviens à mon Post ( je crois que je n'ai pas bien dormi hier ! ), mais mon code n'a pas de relation avec le contexte de la demande de od.pas
    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;
    Mais, personnellement, avec du simple code de désactivation du TSpeedButton en cliquant, ça paraît un peu étrange car je n'ai pas le problème de od.ps...
    Bonne journée
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  14. #14
    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
    Points : 10
    Points
    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.

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    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."

  16. #16
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    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

  17. #17
    Membre averti 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 : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    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
    Salut Shai,

    Est ce que tu peux m'éclaicir un peu sur le PeekMessage ?
    J'avoue que les messages systèmes en Delphi ne sont pas beaucoup mon truc, même si, dès le matin, j'ai eu l'idée (car quand même,je ne suis pas nul à ce point, j'ai codé quelques exemples dans les tutos de Mdiscala et aussi Phidels sur les messages windows car dans ma société, ils gèrent à leur façon les envois et les réceptions des messages Windows mais je n'ai jamais eu à me demander ni pourquoi ni comment on le fait car c'est dans les fiches ancêtres qu'il y a des interceptions de messages [des fiches qui ont été créées plus de 10 années avant disons ... ) d'intercepter le message du clic droit de la souris lorsque WM_LBUTTONDOWN pour le bloquer ..
    mais je n'ai pas trouvé une vraie intro à toute l'histoire ..
    Merci ...
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

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

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Et si od.ps remplaçait ce foutu speedbutton par un bon vieux Button ???
    C'est un peu cavalier, je sais

    @+

    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."

  19. #19
    Membre averti 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 : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Et si od.ps remplaçait ce foutu speedbutton par un bon vieux Button ???
    C'est un peu cavalier, je sais

    @+
    Je présume que od.ps ne peut pas changer le type de composant car peut être c'est dans un cadre professionnel et que c'est imposé par son chef hiérarchique...
    D'ailleurs, il n'a pas présenté un bout du code dans le OnClick où il y a le bug ...
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  20. #20
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour ma part, j'avais eu le soucis avec des composants Speedbutton exotique (LmdSpeedButton).

    Le switch avec le enabled du composant ne fonctionnait pas à tous les coups donc on a tester avec le Tag et cela fonctionnait beaucoup mieux (Surement qu'il n'a pas besoin de gérer toute la partie graphique en changeant les couleurs & co contrairement au Enabled)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    If TSpeedButton(Sender).tag = 0 then
    begin
      TSpeedButton(Sender).tag = 1;
      try
      // The Code
      Finally
        TSpeedButton(Sender).tag = 0;
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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