Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Fortschrittsanzeige bei Dateierstellung


bobicar - Mo 06.12.04 19:04
Titel: Fortschrittsanzeige bei Dateierstellung
hallo,
bin delphi anfänger und habe hier: http://www.delphi-forum.de/viewtopic.php?t=32757&highlight=datei+erstellen
eine datei erstellt. Jetzt ist mein problem das ich net weiß wie ich diesen prozess mit der ProgressBar visualisiere.


herzi - Mo 06.12.04 19:15

Einfach folgendes hinzufügen

Delphi-Quelltext
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:
procedure TForm1.CreateDumpFile(FileName : String; FileSizeMB : Integer);
var
  i         : Integer;  
  DumpFile  : File;  
  MemoryBuf : PChar;  
  AmtWritten : Integer;
const
  SizeMeg = 1048576;  
begin  
  AmtWritten := 0;  
  AssignFile(DumpFile, FileName);  
  // Datei zum Schreiben vorbereiten  
  try  
    Rewrite(DumpFile, 1);
  except  
    CloseFile(DumpFile);  
    Exit;  // Funktion verlassen, falls Datei nicht erstellt werden kann  
  end;  
  GetMem(MemoryBuf, SizeMeg);  
  FillChar(MemoryBuf^, SizeOf(MemoryBuf), 0); // Buffer leeren - hier war der Fehler  
  // 1MB-Blöcke solange in die Datei schreiben, wie gefordert
  Progressbar1.Max:=FileSizeMB; //<------
  for i := 0 to FileSizeMB - 1 do
  begin
    Progressbar1.Position:=i; //<-----
    BlockWrite(DumpFile, MemoryBuf^, SizeMeg, AmtWritten);
    if AmtWritten < SizeMeg then  // Wenn Festplattenkapazität voll, nicht mehr schreiben
      break;
  end;
  FreeMem(MemoryBuf);
  CloseFile(DumpFile);
end;


bobicar - Mo 06.12.04 19:47

hi,
erstmal danke für die schnelle antwort ein problem hab ich aber noch und zwar wenn ich das ganze starte und eine datei erstellen will krieg ich immer eine "access violation" fehlermeldung.
Mein code sieht wie folgt aus:


Delphi-Quelltext
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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls, ComCtrls, jpeg, ExtCtrls, Spin;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
   
    StatusBar1: TStatusBar;
    GroupBox2: TGroupBox;
    Edit2: TEdit;
    Button1: TButton;
    SpeedButton1: TSpeedButton;
    SpinEdit1: TSpinEdit;
    Image1: TImage;
    Label2: TLabel;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure CreateDumpFile(FileName : String; FileSizeMB : Integer);
var
  i         : Integer;
  DumpFile  : File;
  MemoryBuf : PChar;     
  AmtWritten : Integer;
  ProgressBar1 : TProgressBar;
const
  SizeMeg = 1048576;
begin
  AmtWritten := 0;
  AssignFile(DumpFile, FileName);
  // Datei zum Schreiben vorbereiten     
  try
    Rewrite(DumpFile, 1);
  except
    CloseFile(DumpFile);
    Exit;  // Funktion verlassen, falls Datei nicht erstellt werden kann
  end;     
  GetMem(MemoryBuf, SizeMeg);
  FillChar(MemoryBuf^, SizeOf(MemoryBuf), 0); // Buffer leeren - hier war der Fehler     
  // 1MB-Blöcke solange in die Datei schreiben, wie gefordert     
  Progressbar1.Max:=FileSizeMB;
  for i := 0 to FileSizeMB - 1 do
  begin
   Progressbar1.Position:=i; 
   BlockWrite(DumpFile, MemoryBuf^, SizeMeg, AmtWritten);
    if AmtWritten < SizeMeg then  // Wenn Festplattenkapazität voll, nicht mehr schreiben
      break;

  end;     
  FreeMem(MemoryBuf);
  CloseFile(DumpFile);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateDumpFile(''+Edit2.Text, SpinEdit1.Value);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  Form2.ShowModal;
end;

end.


in dem SpinEdit steht die größe der datei und im Edit2 der pfad und dateiname.
Im Form 2 hab ich einen dialog um den pfad auszuwählen.


herzi - Mo 06.12.04 22:09

schreib mal anstatt


Delphi-Quelltext
1:
procedure CreateDumpFile(FileName : String; FileSizeMB : Integer);                    


Delphi-Quelltext
1:
procedure TForm1.CreateDumpFile(FileName : String; FileSizeMB : Integer);                    


und

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
    procedure Button1Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
    procedure CreateDumpFile(FileName : String; FileSizeMB : Integer);
...


herzi - Do 09.12.04 21:42

Hat das jetzt geklappt?