1 pièce(s) jointe(s)
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:
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
Petit problème avec les barres de progression
Bonjour,
merci pour toutes vos réponses.
//-----
1)
Code:
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:
1 2
|
Application.ProcessMessages; // <--- |
ne change rien.
par contre,
Code:
"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:
1 2
|
Position := (NbOctet*100) Div NbTotOctect; // |
ne change rien.
Bonne journée
1 pièce(s) jointe(s)
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:
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. |