Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Progressbar beim erstellen einer Datei? (https://www.delphipraxis.net/59662-progressbar-beim-erstellen-einer-datei.html)

Headi 26. Dez 2005 20:08


Progressbar beim erstellen einer Datei?
 
Hi zusammen,

Ich weiss zwar wie man eine Progressbar daten zuweisen kann,
aber ich habe keine Ahnung wie ich eine Progressbar für einen Fortschritt verwenden kann.
Hab auch schon gegoogelt und hier im forum geschaut, aber ich werde einfach nicht so schlau draus...
Hier mal mein Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var I: Real;
    IMB: integer;
    S: string;
    T: TextFile;
begin
  I:=StrToFloat(JvEdit1.Text);
  IMB:=round(I*1048576);
  s:=StringOfChar('0', IMB);
  If SaveDialog1.Execute then
    begin
        assignfile(t,SaveDialog1.FileName);
        rewrite(t);
        writeln(t,s);
        closefile(t); //Datei schliessen
    end
end;
Vielleicht zur erklärung, im edit Feld kann man eine zahl eingeben, beim buttonklick wird dann eine datei erstellt die so
gross ist wie die eingegebene Zahl.
Jetzt bei 2 MB geht das ja noch schnell, aber bei z.B. 500 MB geht das dann recht lange und darum möchte ich eine ProgressBar anzeigen.

Jetzt habe ich eigentlich keine Ahnung wie ich sowas machen muss, aber ich könnte mir das so vorstellen:

IMB = endgrösse
progressbar.max := IMB
und dann einfach bei jedem erstellten byte progressbar.position um eine stelle erhöhen oder so...
Nur wie krieg ich dann raus wieviel der schon erstellt hat?

Vielen dank

greez Headi

marabu 26. Dez 2005 20:23

Re: Progressbar beim erstellen einer Datei?
 
Eventuell möchtest du zu deinem Problem diesen thread lesen: klick

Weihnachtliche Grüße vom marabu

glkgereon 26. Dez 2005 20:41

Re: Progressbar beim erstellen einer Datei?
 
Wenn du es mit TextFile machen willst, musst du wohl oder übel etwas Performance dafür opfern.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const MB2B = 1024*1024; //MBytes nach Bytes
      BufSize = 1024; //Buffergröße in Bytes
var Buf: String[1024]; //Buffer
    Size: Int64; //MBytes
    T: TextFile; //TextFile
    i, j: Integer; //Zähler
begin
  Size:=StrToFloat(JvEdit1.Text);
  Buf:=''; //auf 0
  Bar.Max:=Size; //Progressbar Init
  Bar.Step:=1;
  If SaveDialog1.Execute then
    begin
    assignfile(t,SaveDialog1.FileName); //FileInit
    rewrite(t);
    for i:=1 to Size do //Für jedes MB
      begin
      for j:=1 to MB2B div BufSize do //solange Buffer bis MB voll
        writeln(t,Buf); //Buffer schreiben
      Bar.StepIt; //Progressbar Weitermachen und Neu malen
      Bar.Refresh;
      end;
    closefile(t); //Datei schliessen
    end;
end;
eleganter ist es aber in jedem Fall mit einem Stream...

Headi 26. Dez 2005 20:56

Re: Progressbar beim erstellen einer Datei?
 
Zitat:

Zitat von marabu
Hallo,

probiere es so:

Delphi-Quellcode:
var
  fs: TFileStream;

begin
  fs := TFileStream.Create(YourFileName, fmCreate or fmShareExclusive);
  fs.Size := YourFileSize;
  fs.Free;
end;
Grüße vom marabu


loool....

Na dann... mein Code lautet jetz so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;

begin
  If SaveDialog1.Execute then
  begin
    fs := TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareExclusive);
    fs.Size := StrToInt(JvEdit1.Text);
    fs.Free;
  end
end;
und das geht auch 1000 Mal schneller, aber ich würde eigentlich immer noch gerne wissen wie ich eine progressbar benutzen kann.
Jetzt natürlich zum neuen Code.

@glkgereon: könntest du vielleicht deinen code noch ein bisschen beschreiben.... (nur ein kleines bisschen bitte)

Vielen dank und noch schöne Festtage

mfg headi

marabu 26. Dez 2005 21:04

Re: Progressbar beim erstellen einer Datei?
 
Hallo Pascal,

einen ProgressBar solltest du nur verwenden, wenn der Vorgang absehbar deutlich länger als zwei Sekunden dauert - sonst ist es zu nervig. StrToInt() liefert einen Integer-Wert, FileStream.Size ist Int64 - kennst du schon StrToInt64() aus der SysUtils-Unit?

Wenn du einen ProgressBar ansteuern willst, dann teile deine geplante Dateigröße einfach durch 10, schiebe in einer Schleife die FileStream.Size schrittweise auf ihren endgültigen Wert und lasse den ProgressBar in der gleichen Schleife von 0 auf 100 in Zehnerschritten vorrücken.

marabu

glkgereon 26. Dez 2005 21:08

Re: Progressbar beim erstellen einer Datei?
 
kommentiert^^

@marabu:

Wie arbeitest du denn mit einer Progressbar? *schüttel*
Am Anfang Prg.Max:=AnzahlDerSchritt; Prg.Step:=1;
und dann bei jedem Durchlauf Prg.StepIt; Prg.Refresh;
Fertig ;)

Headi 26. Dez 2005 21:26

Re: Progressbar beim erstellen einer Datei?
 
Ich habe das jetzt mal so gemacht wie ich das verstanden habe,
Aber kann es sein dass er da die file grösse jetzt 10 mal schreibt??

Abgesehen davon habe ich jetzt irgendwie ein durcheinander mit den variablen, ich runde hin und her und am schluss
ist dann mein ergebnis nicht mehr genau. Was mache ich falsch? Also Es funktioniert, aber das ergebnis hat einfach eine Abweichung.

hier mal mein Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
  R: Real;
  I, IMB: integer;
  IMB2: int64;

begin
  R:=StrToFloat(JvEdit1.Text);
  IMB:=round(R*1048576/10);
  If SaveDialog1.Execute then
  begin
    IMB2:=IMB;
    fs := TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareExclusive);
    for I := 1 to 10 do
    begin
      fs.Size := fs.Size+IMB2;
      ProgressBar1.Position:=ProgressBar1.Position+10;
    end;
    fs.Free;
  end
end;

marabu 26. Dez 2005 21:32

Re: Progressbar beim erstellen einer Datei?
 
Hallo Gereon,

Zitat:

Zitat von glkgereon
Wie arbeitest du denn mit einer Progressbar?

warum fragst du mich, wenn du die Online-Hilfe schon gelesen hast?

Max 100 und Step 10 sind mir ganz angenehm und nicht zufällig die Default-Werte der Progressbar. Bei Anzeige eines Hint sehe ich gerne eine Prozentanzeige - und die erhalte ich bei Max 100 ohne zusätzliche Umrechnung. Wenn du jemals als Programmierer Geld verdienen willst, dann erinnere dich im richtigen Augenblick daran, dass eine zweite Umrechnung an dieser Stelle deinen performance index versaut.

Weihnachtliche Grüße vom marabu

marabu 26. Dez 2005 21:50

Re: Progressbar beim erstellen einer Datei?
 
Hallo Pascal,

ich habe versucht nicht zuviel an deinem Code zu ändern - getippt und nicht getestet:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
  e: Extended;
  i: Integer;
  iChunk, iSize: Int64;
begin
  e := StrToFloat(JvEdit1.Text);
  iSize := Round(e * 1024 * 1024);
  iChunk := Trunc(iSize / 10);
  If SaveDialog1.Execute then
  begin
    fs := TFileStream.Create(SaveDialog1.FileName, fmCreate or fmShareExclusive);
    for i := 1 to 10 do
    begin
      if i = 10 
        then fs.Size := iSize
        else fs.Size := i * iChunk;
      ProgressBar1.StepIt;
      ProgressBar1.Refresh;
    end;
    fs.Free;
  end
end;
marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz