![]() |
Prozentrechnung geht nicht bei grossen Zahlen!?
Hallo,
bin grad dabei ein Verschlüsselungsprog. zu coden und wollte dazu eine Progressbar bauen mit Prozentanzeige. Der Witz ist: Die Progressbar selber geht wunderbar, allerdings kann ich die Prozente dazu nicht berechnen. Habe 2 Zahlen: Sourcefile und Destinationfile (in Bytes) Hier der Code:
Delphi-Quellcode:
Wenn die Dateien relativ klein sind, funktioniert beides gut, bei Dateien die ein paar hundert MB gross sind, geht die Progressbar wunderbar,
var
fsource,fdest:longint; status:real; begin ...... Form1.progressbar1.Min:=0; Form1.progressbar1.Step:=1; Form1.progressbar1.Max:=filesize(source); repeat fdest:=filesize(dest) div 10; fsource:=filesize(source) div 10; status:=fdest *100 div fsource; form1.progreslabel.caption:=floattostr(status); Form1.progressbar1.Position:=filesize(dest); ....... until Read<> Sizeof(Buffer); allerdings tritt bei der Ausgabe der Zahl im Progresslabel ein Phänomen auf: er zählt hoch von 1-10, dann fängt er bei -10!!!! an und geht is +10 wieder hoch, dann springt er auf 20, dann wieder auf -10 usw... total verrückt (PS: das div 10 habe ich extra eingebaut damit die zahlen kleiner bleiben scheint aber auch nicht zu helfen) kann mir jemand sagen was da los ist? |
Re: Prozentrechnung geht nicht bei grossen Zahlen!?
Versuch mal int64 statt Longint.
|
Re: Prozentrechnung geht nicht bei grossen Zahlen!?
Hatte dasselbe Problem. Integer geht ja nur bis 2.147.483.647.
Habe es dann über Real gelöst:
Delphi-Quellcode:
var
Progress : Int64; Percent : Real; Percent := (i / HexEdit.DataSize) * 100; Progress := Ceil(Percent); pbProgress.Position := Progress; |
Re: Prozentrechnung geht nicht bei grossen Zahlen!?
Ich liebe es. Alle Jahre wieder kann ich meinen Artikel dazu promoten
![]() Seit kurzem auch mit Bildern. |
Re: Prozentrechnung geht nicht bei grossen Zahlen!?
1. Wieso definierst du "status" als Floatingpoint-Variable, wenn Du dann mit "div" arbeitest statt mit "/"?
2. Warum benutzt Du "status" nicht auch gleich, um den Progressbar anzuzeigen? 3. wenn Du deinen Sourcecode übersichtlicher formatierst, hilfst Du Dir und uns :-) => Leerzeichen, Einrücken, Gleichheitszeichen untereinander ausrichten, ... 4. Der Progressbar zeigt doch eh schon eine Prozentzahl an, oder? Dann könntest Du Dir das Progresslabel eigentlich sparen und direkt mit Progessbar.Position := Round(fdest / fsource * 100) arbeiten
Delphi-Quellcode:
var
fsource, fdest: Cardinal; status: real; begin with Form1.Progressbar1 do begin Min := 0; Max := 100; end; repeat fdest := filesize(dest) div 10; fsource := filesize(source) div 10; status := fdest / fsource * 100; form1.progreslabel.caption := Format('%3f %%', [status]) Form1.progressbar1.Position := Round(status); ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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-2025 by Thomas Breitkreuz