Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Prozentrechnung beim Kopieren (https://www.delphipraxis.net/60875-problem-mit-prozentrechnung-beim-kopieren.html)

Helmi 13. Jan 2006 13:21


Problem mit Prozentrechnung beim Kopieren
 
Hallo,

ich habe folgenden Code zum Kopieren einer Datei mit Progressbar: (Original)

Delphi-Quellcode:
procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string);
var
  FromF, ToF: file of byte;
  Buffer: array[0..4096] of char;
  NumRead: integer;
  FileLength: longint;
begin
  AssignFile(FromF, Source);
  reset(FromF);
  AssignFile(ToF, Destination);
  rewrite(ToF);
  FileLength := FileSize(FromF);
  with Progressbar1 do
  begin
    Min := 0;
    Max := FileLength;
    while FileLength > 0 do
    begin
      BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
      FileLength := FileLength - NumRead;
      BlockWrite(ToF, Buffer[0], NumRead);
      Position := Position + NumRead;

      Label1.Caption := IntToStr((100 * Position) div Max); //<=========

      Application.ProcessMessages;
    end;
    CloseFile(FromF);
    CloseFile(ToF);
  end;
end;
Mit der Zeile:
Delphi-Quellcode:
      Label1.Caption := IntToStr((100 * Position) div Max); //<=========
will ich mir den aktuellen Kopier-Prozentsatz anzeigen lassen.

Es wird auch was berechnet - aber es kommen teilweilse positive als auch negative Prozentwerte raus.

Ich hab schon an mir selbst gezweifelt ob ich jetzt schon zu blöd bin Prozent zu rechnen, aber ich habe in meiner Formel eigentlich keinen Fehler.

Vielleicht könnt ihr mir helfen.
Ich möchte eigentlich, neben der Progressbar, die Anzeige auch als Prozent von 0% --> 100% angezeigt haben.

Vjay 13. Jan 2006 13:24

Re: Problem mit Prozentrechnung beim Kopieren
 
Ohne es mir jetzt genauer angeguckt zu haben, evtl. sprengt 100*position den Wertebereich eines Integer. Mache erst / und dann *

Helmi 13. Jan 2006 13:29

Re: Problem mit Prozentrechnung beim Kopieren
 
Zitat:

Zitat von Vjay
Ohne es mir jetzt genauer angeguckt zu haben, evtl. sprengt 100*position den Wertebereich eines Integer. Mache erst / und dann *

Geht trotzdem nicht!

Habs auch schon auf Real-Ebene probiert - geht auch nicht

Aenogym 13. Jan 2006 13:32

Re: Problem mit Prozentrechnung beim Kopieren
 
setze doch mal einen bedingten haltepunkt, der anhält, sobald du eine negative prozentzahl erhälst und schaue dann, mit welchen werten er gerechnet hat. damit kannst du dir schonmal die frage beantworten, ob er mit falschen werten rechnet oder ob die werte den rahmen des datentyps sprengen.

aeno

ManuMF 13. Jan 2006 13:39

Re: Problem mit Prozentrechnung beim Kopieren
 
1. Rechnen
2. Runden

Delphi-Quellcode:
Label1.Caption := IntToStr(Round(Position / Max * 100)) + ' %';
Gruß,
ManuMF

Helmi 13. Jan 2006 13:51

Re: Problem mit Prozentrechnung beim Kopieren
 
Zitat:

Zitat von ManuMF
1. Rechnen
2. Runden

Delphi-Quellcode:
Label1.Caption := IntToStr(Round(Position / Max * 100)) + ' %';
Gruß,
ManuMF

Oh, vielen Dank!
Jetzt gehts!

Bin wohl ans Ende vom Integer gekommen.

Vjay 13. Jan 2006 14:00

Re: Problem mit Prozentrechnung beim Kopieren
 
Na das gleiche habe ich dir doch auch gesagt ^^

Robert Marquardt 13. Jan 2006 14:27

Re: Problem mit Prozentrechnung beim Kopieren
 
Ein Artikel von mir in englisch: http://www.delphi-jedi.org/VOYBUGHUNT
So aktuell wie vor 5 Jahren.

alzaimar 13. Jan 2006 15:43

Re: Problem mit Prozentrechnung beim Kopieren
 
... Na ja, aber Round ist doch FALSCH... (Obwohl der Unterschied minimal ist)
Round benutzt das 'Bankersrounding', sodass bei X.5 auf die nächste GERADE Zahl gerundet wird. Das ist uncool.
Delphi-Quellcode:
...
  P := Prozent(815,1000); // P = 82 
  P := Prozent(825,1000); // P = 82, dabei wäre 83 aber richtig (bei konsequentem Runden)
...
Besser ist diese Funktion:
Delphi-Quellcode:
Function AlzPercent (a,b : Integer) : Integer;
Begin
  Result := Trunc (0.5 + 100.0*a/b);
End;


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