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 Anzeige lKBytesDone und lTotalSize falsch? (https://www.delphipraxis.net/90669-anzeige-lkbytesdone-und-ltotalsize-falsch.html)

lucius 21. Apr 2007 15:29


Anzeige lKBytesDone und lTotalSize falsch?
 
Guten Tag,

Ich habe ein kleines Problem mit der Anzeige von den Totalen- und Entpackten Bytes beim Entpacken von Rardateien.
Das komische ist wenn die Entpackte Datei groesser wie 1 GB ist, wird die Anzeige falsch dargestellt.
Wenn Sie kleiner ist klappt alles.
Die Datei besteht aus mehreren Rar-Volumen.
Kann mir da einer helfen bitte?
Danke im voraus.
Delphi-Quellcode:
function Bytes2String(i: longint): string;
begin
  Bytes2String := FormatFloat('###,###,###', i div 1024);
end; // Bytes2String

/////////////////////////////////////////////////////////////////////////////////

function RarCallbackProc(msg: UINT; UserData, P1, P2: integer): integer; stdcall;
var
  s: string;
begin
  Result := 0;
  case msg of
    UCM_CHANGEVOLUME:
      if (P2 = RAR_VOL_ASK) then
      begin
      end;
    UCM_PROCESSDATA:
    begin
      if RARExtract then
      begin
        lKBytesDone := lKBytesDone + P2; // bytes written so far

        //frmUnrar.Refresh; // refresh misc status text
        Application.ProcessMessages;

        // Current file progress
        frmUnrar.pbCurrentFile.Position := frmUnrar.pbCurrentFile.Position + P2;
        frmUnrar.lblBytes.Caption := Bytes2String(lKBytesDone) +
          ' kb of ' + Bytes2String(RARHeaderData.UnpSize) + ' kb';

        // Total progress
        lKBWritten := lKBWritten + (P2 div 1024);
        frmUnrar.pbTotalProgress.Position := lKBWritten;
        frmUnrar.lblTotalMB.Caption := Bytes2String(lKBWritten) +
          ' mb of ' +
          Bytes2String(lTotalSize) + ' mb';
        frmUnrar.Label2.caption := IntToStr(lTotalSize);
        // Time elapsed
        RARElapsedTime := Time - RARStartTime;
        DecodeTime(RARElapsedTime, Hour, Min, Sec, MSec);
        if Min < 10 then
          s := '00:0' + IntToStr(Min) + ':'
        else
          s := '00:' + IntToStr(Min) + ':';
        if Sec < 10 then
          s := s + '0';
        s := s + IntToStr(Sec);
        if s <> frmUnrar.lblElapTime.Caption then
          frmUnrar.lblElapTime.Caption := s;

        // Estimated time left
        if lTotalSize > 0 then
        begin
          RARPctDone := (lKBWritten * 100) div lTotalSize;
          if RARPctDone = 0 then RARPctDone := 1;
        end
        else
          RARPctDone := 50;

        RARPctLeft := 100 - RARPctDone;
        if RARPctLeft > 0 then
        begin
          iRARDoneTime := (Min * 60) + Sec;
          iRAREsti := ((iRARDoneTime * 100) div RARPctDone) - iRARDoneTime;
          Min := iRAREsti div 60;
          Sec := IRAResti - (60 * Min);
          if Min < 10 then
            s := '00:0' + IntToStr(Min) + ':'
          else
            s := '00:' + IntToStr(Min) + ':';
          if Sec < 10 then
            s := s + '0';
          s := s + IntToStr(Sec);
          if s <> frmUnrar.lblEstiTime.Caption then
            frmUnrar.lblEstiTime.Caption := s;
        end;

        //frmUnrar.Refresh; // refresh misc status text
        Application.ProcessMessages;
        Result := 1;
      end
      else
        Result := 1;
    end;
  end;
end; // RarCallbackProc
Gruss Lucius,

Olli 22. Apr 2007 11:58

Re: Anzeige lKBytesDone und lTotalSize falsch?
 
Wes Grundes benutzt du vorzeichenbehaftete Integer? Erwartest du negative Groessen in der Naehe von schwarzen Loechern oder so?

Schau mal hier rein: http://de.wikipedia.org/wiki/Zweierkomplement

Ich weiss als RAR-Benutzer, dass dort Dateigroessen von mehr als 4GB unterstuetzt werden, so dass ich mich mal aus dem Fenster lehne und anzuzweifeln wage, dass dort ueberhaupt ein 32bit-Wert stehen soll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz