Mein Problem ist ja dass ich nen
Access Violation Error bekomme wenn ich statt
Code:
If not CopyFileEx(PChar(Files[y]), PChar(ExtractFilePath(aDestPath)+ExtractFileName(Files[y])),
nil, nil, FCancelled, 0) then
dies schreibe:
Delphi-Quellcode:
If not CopyFileEx(PChar(Files[y]), PChar(ExtractFilePath(aDestPath)+ExtractFileName(Files[y])),
@PProgressRoutine, nil, FCancelled, 0) then
Ansonsten werd ich das mal probieren wenn kein
Access Violation error mehr kommt
Edit: Ja klar, "lpData" muss gesetzt werden; gesagt - getan - und schon klappts
Danke!!!
Edit²: Für alle die die funktionierende Lösung wollen:
Delphi-Quellcode:
function PProgressRoutine(TotalFileSize,
TotalBytesTransferred,
StreamSize,
StreamBytesTransferred: LARGE_INTEGER;
dwStreamNumber,
dwCallbackReason: DWORD;
hSourceFile,
hDestinationFile: THandle;
lpData: Pointer): DWORD; stdcall;
begin
if dwCallbackReason = CALLBACK_STREAM_SWITCH then
TLMDBiProgressBar(lpData).Scale := TotalFileSize.QuadPart;
TLMDBiProgressBar(lpData).DarkValue := TotalBytesTransferred.QuadPart;
Application.ProcessMessages;
Result := PROGRESS_CONTINUE;
end;
procedure ListCopyProgress(const Files: TStrings; aDestPath: String; TotalProgressBar, CurrentProgressBar: TLMDBiProgressBar);
var
x, y, Prozent: integer;
begin
x:=Files.Count;
TotalProgressBar.MinValue := 0;
TotalProgressBar.Scale := x;
for y:=0 to x-1 do
begin
MainForm.laAktiveDatei.Caption := 'Aktuelle Datei: '+ExtractFileName(Files[y]);
try
Prozent := Round(TotalProgressBar.DarkValue / TotalProgressBar.Scale * 100);
except
Prozent := 0;
end;
MainForm.laGesamt.Caption := 'Gesamt-Fortschritt ('+IntToStr(Prozent)+'%):';
If not CopyFileEx(PChar(Files[y]), PChar(ExtractFilePath(aDestPath)+ExtractFileName(Files[y])),
@PProgressRoutine, MainForm.pbAktiveDatei, FCancelled, 0) then
begin
ShowMessage('File['+IntToStr(y)+']: '+Files[y]+#10+
'DestFile['+IntToStr(y)+']: '+ExtractFilePath(aDestPath)+ExtractFileName(Files[y])+#10+
'Error: '+IntToStr(GetLastError));
end;
TotalProgressBar.DarkValue := y+1;
TotalProgressBar.Update;
CurrentProgressBar.Update;
end;
MainForm.laAktiveDatei.Caption := 'Aktuelle Datei: Keine';
MainForm.laGesamt.Caption := 'Gesamt-Fortschritt (100%):';
end;
Und anwenden mit bsp:
ListCopyProgress(DateienStringList, 'C:\ZielPfad\', ProgressBarAlleDateien, ProgressBarAktiveDatei);
Und für alle, die es immer noch nicht verstehen gibts im Anhang nen kleines Beispiel-Programm mit Quellcode
PS: Um dieses Programm nutzen zu können benötigt ihr die
LMD Komponenten!
Mfg, Destroxi