ProgressBar et boucle

Signaler
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012
-
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
-
Bonjour,
Est-il possible de gérer un ProgressBar dans une boucle repeat...until ?
Et si oui, comment ?
Où placer Min, Max, Position, Step, StepIt ?
J'ai tout essayé, ça ne fonctionne pas.

Il s'agit d'un programme qui lit et affiche des fichiers. Dans ce programme, une procedure renvoie la taille du fichier sans l'ouvrir. Voici la boucle en question que j'ai trouvée sur le site :
repeat
BlockRead(F, Buf, SizeOf(Buf), Lus);
Memo.Lines.Text:= Memo.Lines.Text + Buf;
until (Lus = 0);

Merci d'avance.
sgs

7 réponses

Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Salut silvergoldsilver

Donne nous ton code parce c'est facile...

PB.Max  := valeur max
PB.Step := 10; // valeur d'incrément gérer par StepIt
Repeat
...
  PB.StepIt;
...
Until PB.Position = PB.Max



Jean_Jean
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012

Bonjour,

Merci Jean_Jean. Je vais essayer ça tout de suite. C'est vrai que je n'avais pas pensé à utiliser Position et Max dans until, du fait que j'avais déjà
Lus = 0
A+
sgs
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012

Bonjour,
Malheureusement, ça fonctionne mal, le programme est ralenti considérablement.
Comment trouver la bonne valeur de Step par rapport à la taille du fichier.
Voici la procedure en question :

procedure TForm1.Ouvrir1Click(Sender: TObject);
var
F: File;
Lus: Integer;
Buf: array[1..1024] of Char;
begin
{$I-}
If OpenDialog1.Execute Then
begin
Form1.Memo.Cursor:= crHourGlass;
AssignFile(F, OpenDialog1.FileName);
Form1.Label1.Caption:= OpenDialog1.FileName; //Affiche le nom du Fichier
GetFileSize(OpenDialog1.FileName); //Appel Fonction Taille du Fichier qui renvoie Maxi
Form1.ProgressBar1.Min:= 0;
Form1.ProgressBar1.Max:= Maxi;
Form1.ProgressBar1.Step:= 10;

Reset(F,1);
repeat
BlockRead(F, Buf, SizeOf(Buf), Lus);
Memo.Lines.Text:= Memo.Lines.Text + Buf;
Form1.ProgressBar1.StepIt;
//until (Lus = 0);
until Form1.ProgressBar1.Position = Form1.ProgressBar1.Max;

Form1.Label2.Caption:= IntToStr(FileSize(F)) + ' ' + 'octets'; //Affiche la taille du Fichier en octets
CloseFile(F);
Form1.Memo.Cursor:= crDefault;
{$I+}
end;
end;

Merci et A+
sgs
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012

Bonjour,

Je vais chercher également de mon côté.
Encore merci.
A+
sgs
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012

Bonjour,
Voilà ce que j'ai trouvé pour faire fonctionner le ProgressBar dans la boucle repeat...until : utiliser la valeur du array dans position.

procedure TForm1.Ouvrir1Click(Sender: TObject);
var
F: File;
Lus: Integer;
Buf: array[1..1024] of Char;
begin
{$I-}
If OpenDialog1.Execute Then
begin
Form1.Memo.Cursor:= crHourGlass;
AssignFile(F, OpenDialog1.FileName);
Form1.Label1.Caption:= OpenDialog1.FileName; //Affiche le nom du Fichier
GetFileSize(OpenDialog1.FileName); //Appel Fonction Taille du Fichier qui renvoie Maxi
Form1.ProgressBar1.Min:= 0;
Form1.ProgressBar1.Max:= Maxi;
Reset(F,1);
repeat
BlockRead(F, Buf, SizeOf(Buf), Lus);
Memo.Lines.Text:= Memo.Lines.Text + Buf;
Form1.ProgressBar1.Position:= Form1.ProgressBar1.Position + 1024; //1024 c'est la taille de array
until (Lus = 0);
Form1.Label2.Caption:= IntToStr(FileSize(F)) + ' ' + 'octets'; //Affiche la taille du Fichier en octets
CloseFile(F);
Form1.Memo.Cursor:= crDefault;
{$I+}
end;
end;

Pour les gros fichiers, la lecture est très lente, mais ça fonctionne.
A+
sgs
Messages postés
21
Date d'inscription
vendredi 9 octobre 2009
Statut
Membre
Dernière intervention
17 septembre 2012

Bonjour,

Je viens de me rendre compte que l'on peut réduire le temps de lecture en augmentant la valeur de array : 1024, 2048, 4096...

Salut,
sgs
Messages postés
615
Date d'inscription
dimanche 13 août 2006
Statut
Membre
Dernière intervention
13 décembre 2018
3
Oui le but c'est de mettre un buffer plus gros pour travailler en mémoire centrale plutôt qu'en accès disque. Mais ça complique un peu le code...

Tu trouveras cependant pas mal d'exemple sur la toile...

Bonne prog.

Jean_Jean