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

C++Builder Discussion :

Problème de refresh d'une TProgressBar


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Par défaut Problème de refresh d'une TProgressBar
    Bonjour à tous,
    mon problème est le suivant: j'ai une fenêtre contenant une TProgressBar, qui appelle une classe indépendante qui fait un calcul assez long (import d'un fichier Excel d'une longueur connue): je peux donc, dans ma classe d'import, connaitre la proportion de temps qu'il me reste pour finir l'import. J'essaie donc de mettre à jour la progressBar de la fenêtre, mais ça ne fonctionne pas. Dans mon code, lors de l'appel de ma fonction de classe d'import depuis la fenêtre (lors d'un click), j'envoi le pointeur vers la TProgressBar, que j'utilise dans la classe pour la mettre à jour. Or, la progressBar ne bouge pas à l'écran. Alors que j'ai pris soin d'ajouter des lignes de raffraichissement juste après la modification de la position: refresh(), repaint() et même Application->ProcessMessages()
    Ce qui est bizarre, c'est que lorsque j'affiche, avec un MessageBox, la valeur de progress->Position, j'ai la bonne valeur!

    Voici un extrait du code:
    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
     
    /**** dans la fenetre ****/
    TProgressBar* progress;
    obj->loadFile(filename, progress);
     
    /**** dans la classe ****/
    void loadFile(AnsiString filename, TProgressBar* progress){
      progress->Min = 0;
      progress->Max = 100;
      for (int i=0; i<100; i++){
        // import excel
        progress->Position = i;
        progress->Refresh();
        progress->Repaint();
        Application->ProcessMessages();
      }
    }
    Merci de vos idées et suggestions!
    A bientot

    Benz

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Par défaut
    C'est assez connu comme PB:

    Si c'est ta classe ou ta fonction tu doit intégrer dans tes longs calculs des appels réguliers à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->ProcessMessages();
    Sinon certain composant comme Indy ont des fonctions "Antifreeze".

    Dans ton cas il faudra peut être faire un thread avec ta fonction d'import afin de ne pas perdre la main dans l'application en cours

  3. #3
    Membre confirmé
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Par défaut
    Je viens de résoudre mon problème en faisant un test tout bête!!
    En fait, je voulais essayer avec un mémo, et y afficher le numéro de la ligne que j'importe. J'ai donc changé mon paramètre de la fonction en TComponent* histoire d'être plus générique, et je caste ensuite le paramètre en (TMemo*) pour y écrire. Là, ça fonctionne! Donc, je me suis dit que j'allais essayer de passer la progressBar en TComponent et de la caster à l'arrivée. Et là, ça fonctionne aussi!

    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
     
    /**** dans la fenetre ****/
    TProgressBar* progress;
    obj->loadFile(filename, progress);
     
    /**** dans la classe ****/
    void loadFile(AnsiString filename, TComponent* progress){
      ((TProgressBar*)progress)->Min = 0;
      ((TProgressBar*)progress)->Max = 100;
      for (int i=0; i<100; i++){
        // import excel
        ((TProgressBar*)progress)->Position = i;
        Application->ProcessMessages();
      }
    }
    J'ai laissé ProcessMessages(), mais j'ai fait un test sans et ça marche aussi (pour la progressBar, mais la fenêtre est moins réactive)

    Merci quand même pour votre aide!
    Benz

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/05/2013, 16h33
  2. Problème de refresh dans une application modulaire
    Par TigrouMeow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 11/10/2007, 15h06
  3. Problème de refresh dans une JTable
    Par vano dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2006, 14h57
  4. problème de refresh sur une DBGrid
    Par lidouka dans le forum Bases de données
    Réponses: 4
    Dernier message: 20/12/2005, 17h12
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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