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 :

Problème bouton réentrant


Sujet :

Composants VCL Delphi

  1. #1
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut Problème bouton réentrant
    bonjour,

    Dans mon application, le fait d'appuyer sur un bouton (TButton) cela déclenche l'ouverture d'une fenêtre modale.
    Dans le oncreate de cette fenêtre j'effectue un traitement qui occupe le processeur pendant quelques secondes avant que la fenêtre ne s'affiche.
    Jusque là pas de problème.

    Ensuite, j'ai voulu afficher une barre de progression et c'est là que le problème apparait car si on clique deux fois de suite sur le bouton, alors les deux évènements sont pris en compte avant que la fenêtre ne s'affiche et lorsque la première fenêtre modale se ferme, l'autre fenêtre s'ouvre !!!

    Voilà ce que j'ai fait:
    Pour afficher une barre de progression, J'ai créé une form dans laquelle je n'ai que la barre de progression.
    Au début du traitement qui prend du temps , je créé la fenêtre comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      ProgressForm := TProgressForm.Create(AOwner,'Loading');
      ProgressForm.Show;
      ProgressForm.ProgressBar.Max:=cnt;
     
     for i:=1 to cnt do
     Begin
        ProgressForm.ProgressBar.position:=i;
        (.. ici mon traitement qui prend du temps...)
     end;
     ProgressForm.free;
    Je ne veux pas mettre la barre de progression dans la fenêtre modale car je souhaiterai utiliser cette fenêtre dans d'autres cas aussi.
    Peux-t-on bloquer les messages windows pendant le tratitement ? Ou existe-t-il une autre méthode ?

    Merci pour votre aide.
    Franck

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 439
    Points : 5 858
    Points
    5 858
    Par défaut
    salut

    passe ton bouton a enabled avant de lancer le traitement
    cela t’empêchera de le clicker deux fois

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Oui j'y avais pensé bien sur mais cette fonction peut être lancée par différente manière, par des menus, ou des appels de fonction dans des scripts, donc c'est pas aussi facile que ça.

  4. #4
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    J'ai résolu le problème en déplaçant ma fonction consommatrice en ressources processeur dans le OnShow de la fiche.
    Franck

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 621
    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 621
    Points : 25 321
    Points
    25 321
    Par défaut
    Tu n'aurais des Applications.ProcessMessages, c'est souvent cette méthode qui provoque une réentrance via la boucle de message Windows

    Utilise plutôt de Refresh pour forcer le dessin immédiat de la ProgressBar au lieu d'appeler ProcessMessages

    Si tu n'as pas de TThread, tu ne peux pas exécuter deux fois ce code simultanément, seul ProcessMessages dans le cas du Click peut provoquer la Ré-Entrance
    Si tu as des TThread, ajoute une Section Critique ou plutot un Synchronize vu que tu utilises une Form

    EDIT : Mince, le temps que je tape ma réponse, c'est déjà :résolu:

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 670
    Points : 10 675
    Points
    10 675
    Par défaut
    J'utilise la vieille technique des jeux le booléen is_working
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void _fastcall action_show_modal(TObject*) {
         if (is_working) { return; }
     
         is_working = true;
     
    //  ...

    Après pour un gros projet, le booléen peut-être assez difficile à gérer parce qu'il faut identifier [chirurgicalement] les entrées et les sorties des traitements sinon "ça ne clique plus"

    Édit: Sur mon exemple il manque is_working = false; à la fin du traitement. Mais la fin d'un traitement peut-être ailleurs que dans la méthode le déclenchant.

  7. #7
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Merci pour ta réponse, nos messages ce sont croisés.
    Ce post est maintenant résolu.
    En fait, j'ai déplacé ma méthode consommatrice en temps (et donc de ce fait aussi la fenêtre de progression) dans le OnShow de la fenêtre modale qui est appelée (au lieu du OnCreate)
    Franck

  8. #8
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    voir aussi cette solution

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gros problème bouton page précédante
    Par AzertyH dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 30/08/2006, 15h17
  2. Problèmes boutons de souris
    Par omgirl dans le forum Sécurité
    Réponses: 4
    Dernier message: 17/07/2006, 14h56
  3. Problème bouton précédent
    Par pete007 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/02/2006, 20h47
  4. Problème Bouton PLAY et MAC
    Par Stephetsand dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/10/2005, 16h19
  5. [C#] Problème boutons, toolbar et look xp
    Par kershin dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/11/2004, 10h59

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