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. #21
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Citation Envoyé par Moez.B Voir le message
    Est ce que tu peux m'éclaicir un peu sur le PeekMessage ?
    J'avoue que les messages systèmes en Delphi...
    Il n'y a rien à dire de plus que la MSDN sur PeekMessage, cela permet de prendre un message dans la file pour le traiter, Application.ProcessMessages pour résumer à l'extreme c'est juste une boucle comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure PumpMessages;
    var
      Msg: TMsg;
    begin
        while PeekMessage(Msg, 0, 0, 0, pm_Remove) do
        begin
              TranslateMessage(Msg);
              DispatchMessage(Msg);
        end;
    end;

    Comment vider le buffer du clavier ?


    Citation Envoyé par Moez.B Voir le message
    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 ... )
    Je subi la même chose, souvent plein de truc inutile, genre capture du WM_SIZING pour empecher le changement de taille par ce qu'il n'avait pas pris le temps de lire la documentation sur BorderStyle et Constraints !
    Régulièrement, j'ajoute un flag qui inhibe ces chiasses, par défaut ça conserve, et quand j'en ai besoin, je peux éteindre pour avoir un comportement VCL normal
    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

  2. #22
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    voici une solution simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      memo1.Lines.Add(Sender.ClassName + IntToStr(TControl(Sender).Tag));
      TControl(Sender).Tag := TControl(Sender).Tag + 1;
      TControl(Sender).Enabled := False;
      Sleep(1000);
      Memo1.Lines.add('---');
      Application.ProcessMessages; // traite les messages en attente
      TControl(Sender).Enabled := True;
    end;
    avec un ProcessMessages avant d'activer le bouton, les messages en attente sont traités et les clics sur le bouton sont de fait ignorés.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #23
    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
    Il n'y a rien à dire de plus que la MSDN sur PeekMessage, cela permet de prendre un message dans la file pour le traiter, Application.ProcessMessages pour résumer à l'extreme c'est juste une boucle comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure PumpMessages;
    var
      Msg: TMsg;
    begin
        while PeekMessage(Msg, 0, 0, 0, pm_Remove) do
        begin
              TranslateMessage(Msg);
              DispatchMessage(Msg);
        end;
    end;
    Comment vider le buffer du clavier ?




    Je subi la même chose, souvent plein de truc inutile, genre capture du WM_SIZING pour empecher le changement de taille par ce qu'il n'avait pas pris le temps de lire la documentation sur BorderStyle et Constraints !
    Régulièrement, j'ajoute un flag qui inhibe ces chiasses, par défaut ça conserve, et quand j'en ai besoin, je peux éteindre pour avoir un comportement VCL normal
    Salut Shai,
    J'ai essayé ton exemple en me lançant un peu dans la commande PeekMessage , il y a beaucoup d'explications dans les exemples de ce lien
    http://www.cplusplus.com/forum/beginner/38860/
    J'ai compris le principe, mais je reviens sur le problème initial car je crois que od.ps n'a pas bien expliqué les faits de l'anomalie (vu que j'ai occupé pas mal de temps le poste d'un testeur des applications écrites en DELPHI) donc j'ai essayé de décortiquer le problème et voilà ce que je trouve:
    Quand on place un bouton de type TSpeedButton sur une fiche et qu'on met dans son OnClick : SpeedButton.enabled := false; un simple clic de la souris suffit de le mettre à l'état non actif.
    Mais, si on simule cette action:
    On place le curseur de la souris sur notre bouton.
    On fait un clic (gauche) de la souris.
    On déplace rapidement le curseur de la souris en sortant du cadre du bouton.
    Le bouton reste toujours actif.
    Je suppose donc que le clic sur le bouton ne s'est pas fait correctement car on attendait une action à faire dans le OnClick qui n'est jamais exécutée.
    Si je reviens à a définition du OnClick en elle même, c'est le fait d'envoyer deux messages au bouton l'un pour le WM_LBUTTONDOWN et l'autre pour WM_LBUTTONUP.
    Sinon, dans notre cas le WM_LBUTTONDOWN est envoyé mais il y a un autre événement qui est le fait de sortir du cadre du bouton juste après et puis il y a le message WM_LBUTTONUP qui est envoyé, lui aussi, en dehors du cadre du bouton.
    Je suis revenu sur ton premier Post et j'ai essayé de supprimé le message ( que je ne connais pas et qui n'est pas WM_MOUSEDOWN car il n'existe pas [WM_MOUSEACTIVATE, WM_MOUSEFIRST ...] ) par un PeekMessage, j'ai essayé avec tous les messages de la souris mais en vain.
    Je suis sûr que WM_LBUTTONDOWN est envoyé quand le curseur de la souris est dans le cadre du bouton. Je veux éliminer le message système par un PeekMessage pour le message WM_MOUSE_tratata (bien sur lorsque le contrôle concerné est notre SpeedButton ( pour ControlPosAt), pourque le message WM_LBUTTONUP est envoyé lorsque le pointeur de la souris est toujours dans le cadre du bouton .
    Voici un des exemples que j'ai testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.SpeedButtonClick(Sender: TObject);
    var
      msg: TMsg;
    begin
      while PeekMessage(msg, Parent.Handle, WM_MOUSEMOVE, 0, PM_REMOVE) do
      begin
        TranslateMessage(msg);
        DispatchMessage(msg);
      end;
      SpeedButton.Enabled := false;
    end;
    je reviens à un exemple ancien qui de surcharger la méthode WndProc de TForm pour la fiche actuelle, j'ai essayé avec le message de la roulette de la souris WM_MOUSEWHEEL (juste pour le test)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.WndProc(var Message: TMessage);
    begin
      if Message.Msg = WM_MOUSEWHEEL then
      Begin
        SpeedButton.Enabled := false;
      End;
      inherited;
    Lorsque je déroule la roulette de la souris , le bouton n'est plus actif donc Mais ce n'est pas mon objectif car je veux supprimer le message du mouvement de la souris qui sort du cadre du SpeedButton/
    Est ce que tu peux tester de ta part avec le PeekMessage de nouveau ?
    Merci Shai ..
    "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]

  4. #24
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    en fait le mieux serait de ne pas bloquer l'IU pendant le traitement du clic
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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