So, ich habe gerade ein Beispiel für das Kopieren einer Datei mit Fortschrittsanzeige mit Hilfe von
CopyFileEx geschrieben:
Delphi-Quellcode:
var
Form1: TForm1;
CancelCopy: Boolean;
implementation
{$R *.dfm}
function CopyFileProgress(TotalFileSize, TotalBytesTransferred, StreamSize,
StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason,
hSourceFile, hDestinationFile, lpData: DWORD): DWORD; stdcall;
begin
Application.ProcessMessages;
if CancelCopy = True then
begin
ShowMessage('Abbruch');
result := PROGRESS_CANCEL;
end;
case dwCallbackReason of
CALLBACK_CHUNK_FINISHED:
begin
Form1.ProgressBar1.Position := TotalBytesTransferred.QuadPart;
result := PROGRESS_CONTINUE;
end;
CALLBACK_STREAM_SWITCH:
begin
Form1.ProgressBar1.Max := TotalFileSize.QuadPart;
result := PROGRESS_CONTINUE;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Cancel: PBOOL;
begin
CancelCopy := False;
Cancel := nil;
CopyFileEx('g:\Brennen\Madonna - Erotica.mpg', 'g:\Madonna - Erotica.mpg',
@CopyFileProgress, nil, Cancel, 0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
CancelCopy := True;;
end;
Nur ein Problem habe ich: Das Abbrechen funktioniert nicht. Er geht zwar in den if-Zweig rein, aber er ruft die Callback Routine immer wieder auf, obwohl ich PROGRESS_CANCEL zurückgebe.