Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CopyFileProgress mit Fehler (https://www.delphipraxis.net/95507-copyfileprogress-mit-fehler.html)

Mazel 7. Jul 2007 18:12


CopyFileProgress mit Fehler
 
Hallo,

ich habe ein Problem mit CopyFileEx und CopyFileProgress festgestellt, welches ich nicht lösen kann.
Delphi-Quellcode:
var
 test: Byte; // zu Beginn auf 0 gestezt

function CopyFileProgress(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason, hSourceFile, hDestinationFile, lpData: DWORD): DWORD; stdcall;
begin
 Application.ProcessMessages;
 if Main.bCopyCanceled = True then
 begin
  Result := PROGRESS_CANCEL;
  Exit;
 end;
 case dwCallbackReason of
  CALLBACK_CHUNK_FINISHED:
   begin
    Progress.PBrCopy.Position := TotalBytesTransferred.QuadPart;
    Result := PROGRESS_CONTINUE;
   end;
  CALLBACK_STREAM_SWITCH:
   begin
    inc(main.test);
    Main.Caption := inttostr(main.test);
    //Progress.PBrCopy.Max := Trunc(0.3 + Progress.PBrCopy.Max * 100 / Main.FullSize);
    Progress.PBrCopyAll.Position := Progress.PBrCopyAll.Position + Progress.PBrCopy.Max;
    Progress.PBrCopy.Max := TotalFileSize.QuadPart;
    Result := PROGRESS_CONTINUE;
   end;
 end;
end;
Es scheint alles normal zu laufen, bis mir auf fiel, dass die Prozente einfach nicht passen. Zunächst dachte ich es liegt an schlechte Rundungen aber durch die Variable test ist mir aufgefallen, dass nicht dass passiert was soll. Ich habe 50 Dateien ausgewählt, die kopiert werden sollten. Diese 50 Dateien wurden auch sauber kopiert aber test sagt was anderes: 57. Deshalb stimmen auch die Prozente nicht. Der Fortschrittsbalken ist immer schon am Ende obwohl noch Daten kopiert werden.

Wo liegt hier der Fehler?

Gruß
Mazel

Mazel 8. Jul 2007 18:02

Re: CopyFileProgress mit Fehler
 
Hat keiner eine Idee?

Luckie 8. Jul 2007 21:03

Re: CopyFileProgress mit Fehler
 
Guck mal hier: http://www.michael-puff.de/Developer...opyFileEx.html

Mazel 9. Jul 2007 08:10

Re: CopyFileProgress mit Fehler
 
Danke dir erst einmal. Ich habe jetzt versucht den Code bei mir einzubauen, dabei ist mir aufgefallen, dass da ein kleiner Fehler drinn ist:
Delphi-Quellcode:
ProgressBar1.Max := (Msg.LParam) shl 32) + Msg.WParam;
// ich glaube so sollte es sein oder?
ProgressBar1.Max := (Int64(Msg.LParam) shl 32) + Msg.WParam;
Nun gut. Als ich das ausprobiert habe, kam sofort meine Meldung, dass alle Dateien übertragen wurden. Diese Meldung soll aber normaler Weise erst nach am Ende kommen. Auch die ProgressBars waren nicht zu sehen. Die Dateien wurden also im HiIntergrund kopiert.

Deshalb habe ich an meinen alten Code weiter versucht das Problem zu lösen. Dabei habe ich dies mit Erfolg versucht:
Delphi-Quellcode:
CALLBACK_CHUNK_FINISHED:
   begin
    Progress.PBrCopy.Position := TotalBytesTransferred.QuadPart;
    if Progress.PBrCopy.Position = Progress.PBrCopy.Max then
     begin
      inc(main.test);
      Main.Caption := inttostr(main.test);
      Progress.PBrCopy.Max := Trunc(0.4 + Progress.PBrCopy.Max * 100 / Main.FullSize);
      Progress.PBrCopyAll.Position := Progress.PBrCopyAll.Position + Progress.PBrCopy.Max;
     end;
    Result := PROGRESS_CONTINUE;
   end;
Nun stimmt die übertragene Anzahl von Dateien. Jetzt stellt sich nur noch die Frage, ob ich das hier lassen kann.

Gruß
Mazel


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 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