AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Progressbar beim erstellen einer Datei?
Thema durchsuchen
Ansicht
Themen-Optionen

Progressbar beim erstellen einer Datei?

Ein Thema von Headi · begonnen am 26. Dez 2005 · letzter Beitrag vom 26. Dez 2005
Antwort Antwort
Headi

Registriert seit: 17. Nov 2005
Ort: Weinfelden
101 Beiträge
 
Delphi 2007 Professional
 
#1

Progressbar beim erstellen einer Datei?

  Alt 26. Dez 2005, 20:08
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
Pascal
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Progressbar beim erstellen einer Datei?

  Alt 26. Dez 2005, 20:23
Eventuell möchtest du zu deinem Problem diesen thread lesen: klick

Weihnachtliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#3

Re: Progressbar beim erstellen einer Datei?

  Alt 26. Dez 2005, 20:41
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...
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Headi

Registriert seit: 17. Nov 2005
Ort: Weinfelden
101 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Progressbar beim erstellen einer Datei?

  Alt 26. Dez 2005, 20:56
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
Pascal
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Progressbar beim erstellen einer Datei?

  Alt 26. Dez 2005, 21:04
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
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#6

Re: Progressbar beim erstellen einer Datei?

  Alt 26. Dez 2005, 21:08
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
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Headi

Registriert seit: 17. Nov 2005
Ort: Weinfelden
101 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Progressbar beim erstellen einer Datei?

  Alt 26. Dez 2005, 21:26
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;
Pascal
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Progressbar beim erstellen einer Datei?

  Alt 26. Dez 2005, 21:32
Hallo Gereon,

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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Progressbar beim erstellen einer Datei?

  Alt 26. Dez 2005, 21:50
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz