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

Langage Delphi Discussion :

fenêtre d'attente (et autre code) non affichée (ou appliquée) durant une boucle for


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 117
    Points
    117
    Par défaut fenêtre d'attente (et autre code) non affichée (ou appliquée) durant une boucle for
    Bonjour...
    mon problème est le suivant :
    j'ai une une boucle qui modifie les valeurs d'une treeview... donc le but, c'est que durant cette modification, un message d'attente apparaisse...

    problème : j'ai beau mettre tout le code que je veux avant la boucle, celui ci ne veut rien faire... ou plutôt attend la fin de la boucle pour appliquer les modifs (exemple : la fenêtre d'attente ne s'affichera qu'une fois la boucle terminée... super...) du coup la fenêtre freeze durant la modif de la treeview(boucle fort oblige)

    que ce soit un timer ou un thread, c'est du pareil au même.


    voici le code de modification:
    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
    19
    20
    21
    22
    23
    24
    //Modifie les valeurs de la treeview
    procedure TConfigExportCSVFrm._modifTreeView;
    var
      i, j : Integer;
      usert : TUserRight;
      changed : boolean;
    begin
      Self._beginAttente('Chargement des droits...', -1);
      pas := 1;
      lblLibelle.Caption := IntToStr(pas);
      //monThread := TPersoThread.Create(true, self);
      //monThread.Resume;
      for i := 0 to lstUser.Count - 1 do
      begin
        if tvUserDroits.Items[i].Count = 0 then
        begin
          tvUserDroits.checked[tvUserDroits.Items[i]] := lstUser.Items[i].bVisible;
        end;
      end;
      inWork := False;
      //monThread.Suspend;
      //FreeAndNil(monThread);
      Self._endAttente;
    end;

    le code rendant la fenêtre inaccessible et démarant le timer (pour la fenêtre d'attente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //initialise la fenêtre d'attente
    procedure TConfigExportCSVFrm._beginAttente(attMess : string; attMax : integer);
    begin
      self._figerInterface;
      inWork := true;
      waitMsg := attMess;
      max := attMax;
      tmrWait.Enabled := True;
    end;
    le code se trouvant dans le timer
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    procedure TConfigExportCSVFrm.tmrWaitTimer(Sender: TObject);
    var
      pas : Integer;
    begin
      if not inWork then
      begin
        self.OnProgess(-1, -1, waitMsg);
        tmrWait.Enabled := false;
      end
      else
      begin
        if max > 0 then
        begin
          pas := Trunc((100 * iprogress)/max);
          self.OnProgess(pas, 100, waitMsg);
          if pas >= 100 then
            iprogress := 0
          else
           Inc(iprogress);
        end;
     
        if max = -1 then
        begin
        self.OnProgess(iprogress, 100, waitMsg);
        if iprogress >= 100 then
          iprogress := 0
        else
          Inc(iprogress);
        end;
      end;
    end;
    et enfin le code affichant la fenêtre d'attente
    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
    19
    20
    21
    22
    23
    //fenetre d'attente
    procedure TConfigExportCSVFrm.OnProgess(aPos, aMax: Integer; aText: String);
    begin
      if (aPos = -1) and ( aMax = -1) then
      begin
        FrmWaiting.Close;
        Exit;
      end;
     
      if not FrmWaiting.Visible then
      begin
        FrmWaiting.Maximum  := aMax div 100;
        FrmWaiting.Maximum2 := 100;
        FrmWaiting.QProgressBar1.Visible := false;
        FrmWaiting.QProgressBar2.Visible := true;
        FrmWaiting.Show;
        Application.ProcessMessages;
      end;
     
      FrmWaiting.QProgressBar1.position := aPos div 100;
      FrmWaiting.QProgressBar2.position := aPos mod 100;
      FrmWaiting.Texte                  := aText;
    end;
    pourriez vous m'aidez s'il vous plait je suis à la limite de me tirer une balle dans la tête

  2. #2
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.processmessages
    Avec une boucle, c'est un grand classique...

    salut

  3. #3
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 117
    Points
    117
    Par défaut
    il y est deja ... regardes dans le code d'affichage de fenêtre d'attente
    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
    19
    20
    21
    22
    23
    //fenetre d'attente
    procedure TConfigExportCSVFrm.OnProgess(aPos, aMax: Integer; aText: String);
    begin
      if (aPos = -1) and ( aMax = -1) then
      begin
        FrmWaiting.Close;
        Exit;
      end;
     
      if not FrmWaiting.Visible then
      begin
        FrmWaiting.Maximum  := aMax div 100;
        FrmWaiting.Maximum2 := 100;
        FrmWaiting.QProgressBar1.Visible := false;
        FrmWaiting.QProgressBar2.Visible := true;
        FrmWaiting.Show;
        Application.ProcessMessages;
      end;
     
      FrmWaiting.QProgressBar1.position := aPos div 100;
      FrmWaiting.QProgressBar2.position := aPos mod 100;
      FrmWaiting.Texte                  := aText;
    end;

  4. #4
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    excuse, je n'avais lu que les premières lignes...
    boucle et exécution du code seulement après d'où le réflexe...

    là, ton code est sorti du contexte, il faut se mettre dedans...
    Il me semble que tant que la condition est vraie à chaque passage dans ton timer, tu rappelles le show de ta fenêtre. Déjà là, ça ne va pas...
    à voir...

  5. #5
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 117
    Points
    117
    Par défaut
    merci pour ta réponse.
    en fait non : il ne réaffiche la fenêtre que s'il n'est pas visible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if not FrmWaiting.Visible then
      begin
        FrmWaiting.Maximum  := aMax div 100;
        FrmWaiting.Maximum2 := 100;
        FrmWaiting.QProgressBar1.Visible := false;
        FrmWaiting.QProgressBar2.Visible := true;
        FrmWaiting.Show;
        Application.ProcessMessages;
      end;
    j'ai tenté de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ProcessMessages;
    en dehors du if not frmWaiting.visible
    ainsi que dans le code du timer afin de l'appeler a chaque ms mais rien n'y fait

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Le Application.ProcessMessages ne devrait-il pas être dans la boucle de mise à jour du Treeview?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  7. #7
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 117
    Points
    117
    Par défaut
    SUPER!!!
    réponse simple!!!! rapide!!! clair!!! et j'ai envie de te frapper car je pêche dessus depuis deux jours comme un dingue!!!

    il faudrait que je comprenne vraiment que je sache coment marche application.processmessage(c'est ma première utilisation)

    Merci encore linkin et archimede

  8. #8
    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
    Euh ... pourquoi utiliser un timer alors qu'il te suffit de mettre a progression dans ta boucle

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    //Modifie les valeurs de la treeview
    procedure TConfigExportCSVFrm._modifTreeView;
    var
      i, j : Integer;
      usert : TUserRight;
      changed : boolean;
    begin
      Self._beginAttente('Chargement des droits...', -1);
      pas := 1;
      lblLibelle.Caption := IntToStr(pas);
      //monThread := TPersoThread.Create(true, self);
      //monThread.Resume;
      for i := 0 to lstUser.Count - 1 do
      begin
        if tvUserDroits.Items[i].Count = 0 then
        begin
          tvUserDroits.checked[tvUserDroits.Items[i]] := lstUser.Items[i].bVisible;
        end;
        OnProgess(i + 1,lstUser.Count,'Blabla');
        Application.ProcessMessages;
      end;
      inWork := False;
      //monThread.Suspend;
      //FreeAndNil(monThread);
      Self._endAttente;
    end;
    Modérateur Delphi

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

  9. #9
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 117
    Points
    117
    Par défaut
    Rayek > parce que je ne peux plus bouger la fenêtre d'attente avec cette méthode...

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 519
    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 519
    Points : 25 037
    Points
    25 037
    Par défaut
    Un BeginUpdate et EndUpdate serait aussi bien venu !
    Sinon, c'est si lent que cela ? Tu as des milliers d'utilisateurs pour avoir besoin d'une barre de progression ?
    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

  11. #11
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 117
    Points
    117
    Par défaut
    begin et endupdate a essayer...(moi et delphi faisons deux )

    et oui il y a pas mal d'utilisateurs à voir cette barres de progression...et malheureusement oui c'est si long que ça... je suppose qu'il met du temps a redessiner la treeview...et je dois voir s'il y a pas un moyen de redessiner uniquement l'élément modifiée... ce qui serait beaucoup plus rapide... mais bon c'est une autre histoire

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

Discussions similaires

  1. [AC-2003] Code pour afficher les utilisateurs connectés à une BDD
    Par LionelDM dans le forum IHM
    Réponses: 2
    Dernier message: 07/01/2010, 17h04
  2. exception non levée malgré throw dans une boucle for
    Par marion5515 dans le forum Langage
    Réponses: 12
    Dernier message: 14/05/2009, 17h53
  3. Réponses: 1
    Dernier message: 18/06/2008, 21h18
  4. optimiser mon code avec une boucle for?
    Par Invité dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 16/11/2007, 08h33
  5. Réponses: 11
    Dernier message: 18/02/2007, 23h20

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