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

Lazarus Pascal Discussion :

Petit problème avec les barres de progression


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Par défaut Petit problème avec les barres de progression
    Bonjour,
    merci pour toute votre aide si précieuse.
    //-------
    J'ai un problème avec les barres de progression.
    elles n'arrivent pas au bout, tout du moins visuellement et j'aimerais savoir pourquoi ?
    je trouve que cela ne fait pas très bien.
    (je n'avais pas de problème sous Delphi 7 avec le même 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        OpenDialog1: TOpenDialog;
        ProgressBar1: TProgressBar;
        SaveDialog1: TSaveDialog;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
     
      public
     
      end;
     
    Const
      NbOctet = 5000000;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
      var
        i                   : integer;                                              // compteur de boucles
        FSourceL            : TFileStream;                                          // Fichier à construire
        NomDuFichier        : String;                                               // nom du fichier à construire
      begin
        SaveDialog1.Filter:='*.Sav';
        if Savedialog1.Execute then begin                                           // ouvre la boîte de dialogue 'enregistrer sous...'
          ProgressBar1.Visible:=true;                                               // Affichage de la barre de progression pendant la sauvegarde
          NomDuFichier:='';
          Repeat
            NomDuFichier:=SaveDialog1.FileName;                                     // récupère le nom du fichier
          until (NomDuFichier<>'');
          FSourceL:=TFileStream.Create(NomDuFichier, fmCreate or fmOpenWrite);      // ouvre le fichier d'entrée en Stream File
          try
            for i:=1 to NbOctet do begin                                            // pour toutes les impulsions du filtre actif
              ProgressBar1.Position:=round(i*100/NbOctet);                          // Position dans la barre de progression
              FSourceL.Write(i, SizeOf(i));
            end;
          finally
            if assigned (FSourceL) then FSourceL.Free;                              // destruction de l'objet TfileStream
            ProgressBar1.Visible:=false;                                            // Fin de l'affichage de la barre de progression
            Button2.Enabled:=true;                                                  // active le bouton 'Restauration'
          end;
        end;
      end;
     
    procedure TForm1.Button2Click(Sender: TObject);
      var
        i                   : integer;                                              // compteur de boucles
        FSourceL            : TFileStream;                                          // Fichier à construire
        NomDuFichier        : String;                                               // nom du fichier à construire
        Entier              : integer;                                              // entier à restaurer
      begin
        Entier:=0;
        OpenDialog1.Filter:='*.Sav';
        if OpenDialog1.Execute then begin                                           // ouvre la boîte de dialogue 'enregistrer sous...'
          ProgressBar1.Visible:=true;                                               // Affichage de la barre de progression pendant la sauvegarde
          NomDuFichier:='';
          Repeat
            NomDuFichier:=OpenDialog1.FileName;                                     // récupère le nom du fichier
          until (NomDuFichier<>'');
          FSourceL:=TFileStream.Create(NomDuFichier, fmOpenRead);                   // ouvre le fichier d'entrée en Stream File
          try
            for i:=1 to NbOctet do begin                                            // pour toutes les impulsions du filtre actif
              ProgressBar1.Position:=round(i*100/NbOctet);                          // Position dans la barre de progression
              FSourceL.Read(Entier, SizeOf(Entier));
            end;
          finally
            if assigned (FSourceL) then FSourceL.Free;                              // destruction de l'objet TfileStream
            ProgressBar1.Visible:=false;                                            // Fin de l'affichage de la barre de progression
          end;
        end;
      end;
     
     
    end.
    le bout de code complet est joint au fichier.
    merci et bonne journée à tous
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 129
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 129
    Par défaut
    Bonsoir,

    Citation Envoyé par neho88 Voir le message
    elles n'arrivent pas au bout, tout du moins visuellement et j'aimerais savoir pourquoi ?
    Comment peux-tu le voir puisque une fois au bout de la boucle tu masques la progression ?
    (code un poil allégé pour aller à l'essentiel et montrer l'idée) :

    Citation Envoyé par neho88 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            for i:=1 to NbOctet do ProgressBar1.Position:=round(i*100/NbOctet); 
          finally
            ProgressBar1.Visible:=false;

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 167
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Ici (sous Linux), même la progression ne s'affiche pas. Il faut que je rajoute ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              ProgressBar1.Position:=round(i*100/NbOctet);                          // Position dans la barre de progression
              Application.ProcessMessages; // <---
    Pour voir la barre entièrement remplie, je supprime cette ligne (comme Jipété l'a suggéré) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            //ProgressBar1.Visible:=false;
    Enfin, je note qu'il n'est pas utile de mettre à jour la barre de progression cinq millions de fois, puisqu'elle n'a que 280 pixels de largeur.

    Donc j'aurais peut-être fait quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        step: integer;
      begin
        // ...
          try
            step := NbOctet div ProgressBar1.Width;
            for i:=1 to NbOctet do begin
              if i mod step = 0 then
              begin
                ProgressBar1.Position:=round(i*100/NbOctet);
                Application.ProcessMessages; // <---
              end;
    Rien qu'à l'oreille, j'ai l'impression que la machine me dit merci.

    Mais ce n'est pas encore optimal, puisque la variable Position, dans l'état actuel du programme, ne peut avoir que 101 valeurs différentes...

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    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 491
    Par défaut
    salut

    il faut juste calculer un coefficient


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Position := (NbOctet*100) Div NbTotOctect; //
    PS : pour info le 100 correspond à la taille maxi de position dans un progessbar

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Par défaut Petit problème avec les barres de progression
    Bonjour,
    merci pour toutes vos réponses.
    //-----
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Comment peux-tu le voir puisque une fois au bout de la boucle tu masques la progression ?
    effectivement, le but n'est pas de voir la barre de progression, mais qu'elle indique à l'utilisateur la progression dans la tache en cours.
    donc, sur une tâche assez longue, j'affiche une barre de progression qui s'effacera quand la tâche est finie.
    et tant qu'a faire, autant que la barre reflète réellement la progression.
    or, sur certain chargement, elle ne dépasse pas 20% de la barre.
    autant ne rien afficher, plutôt qu'une information fausse.
    //-----
    2) l'ajout de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Application.ProcessMessages; // <---
    ne change rien.
    par contre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "je note qu'il n'est pas utile de mettre à jour la barre de progression cinq millions de fois, puisqu'elle n'a que 280 pixels de largeur."
    est très pertinent.
    //-----
    3)Le calcul du coefficient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Position := (NbOctet*100) Div NbTotOctect; //
    ne change rien.

    Bonne journée

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 123
    Par défaut Petit problème avec les barres de progression
    Bonjour,
    dans l'exemple suivant, la barre ne dépasse pas les 50 %.
    bonne journée.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        OpenDialog1: TOpenDialog;
        ProgressBar1: TProgressBar;
        SaveDialog1: TSaveDialog;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
     
      public
     
      end;
     
    Const
      NbOctet = 5000;
     
    var
      Form1: TForm1;
      TgRestore   : boolean    = false;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
      var
        i                   : integer;                                              // compteur de boucles
        FSourceL            : TFileStream;                                          // Fichier à construire
        NomDuFichier        : String;                                               // nom du fichier à construire
        Step                : integer;                                              // limitation de l'affichage de la barre de progression
      begin
        SaveDialog1.Filter:='*.Sav';
        if Savedialog1.Execute then begin                                           // ouvre la boîte de dialogue 'enregistrer sous...'
          ProgressBar1.Visible:=true;                                               // Affichage de la barre de progression pendant la sauvegarde
          NomDuFichier:='';
          Repeat
            NomDuFichier:=SaveDialog1.FileName;                                     // récupère le nom du fichier
          until (NomDuFichier<>'');
          FSourceL:=TFileStream.Create(NomDuFichier, fmCreate or fmOpenWrite);      // ouvre le fichier d'entrée en Stream File
          try
            step:=NbOctet div ProgressBar1.Width;
            for i:=1 to NbOctet do begin                                            // pour toutes les impulsions du filtre actif
              if i mod step = 0 then begin
                ProgressBar1.Position:=round(i*100 div NbOctet);                    // Position dans la barre de progression
                Application.ProcessMessages;
              end;
              FSourceL.Write(i, SizeOf(i));
              Button1.Caption:=IntToStr(i);                                         // juste pour ralentir !
            end;
          finally
            if assigned (FSourceL) then FSourceL.Free;                              // destruction de l'objet TfileStream
            ProgressBar1.Visible:=false;                                            // Fin de l'affichage de la barre de progression
            Button2.Enabled:=true;                                                  // active le bouton 'Restauration'
          end;
        end;
      end;
     
    procedure TForm1.Button2Click(Sender: TObject);
      var
        i                   : integer;                                              // compteur de boucles
        FSourceL            : TFileStream;                                          // Fichier à construire
        NomDuFichier        : String;                                               // nom du fichier à construire
        Entier              : integer;                                              // entier à restaurer
        Step                : integer;                                              // limitation de l'affichage de la barre de progression
      begin
        Entier:=0;
        OpenDialog1.Filter:='*.Sav';
        if OpenDialog1.Execute then begin                                           // ouvre la boîte de dialogue 'enregistrer sous...'
          ProgressBar1.Visible:=true;                                               // Affichage de la barre de progression pendant la sauvegarde
          NomDuFichier:='';
          Repeat
            NomDuFichier:=OpenDialog1.FileName;                                     // récupère le nom du fichier
          until (NomDuFichier<>'');
          FSourceL:=TFileStream.Create(NomDuFichier, fmOpenRead);                   // ouvre le fichier d'entrée en Stream File
          try
            step:=NbOctet div ProgressBar1.Width;
            for i:=1 to NbOctet do begin                                            // pour toutes les impulsions du filtre actif
              if i mod step = 0 then begin
                ProgressBar1.Position:=round(i*100 div NbOctet);                    // Position dans la barre de progression
                Application.ProcessMessages;
              end;
              FSourceL.Read(Entier, SizeOf(Entier));
              Button1.Caption:=IntToStr(i);                                         // juste pour ralentir !
            end;
          finally
            if assigned (FSourceL) then FSourceL.Free;                              // destruction de l'objet TfileStream
            ProgressBar1.Visible:=false;                                            // Fin de l'affichage de la barre de progression
          end;
        end;
      end;
     
     
    end.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Petit problème avec les pointeurs et variable
    Par mitherkiller dans le forum C
    Réponses: 5
    Dernier message: 09/03/2007, 22h05
  2. Problème avec une Barre de Progression
    Par hugo69 dans le forum Access
    Réponses: 1
    Dernier message: 15/12/2006, 15h37
  3. [VBA-Excel] Petit problème avec les formulaires
    Par ash_rmy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/08/2006, 09h22
  4. Petit problème avec les accents circonflexes...
    Par Harvester dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 29/11/2005, 18h44

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