Man kommt ja öfters mal in die Lage, daß bestimmte Werte einfach zu groß sind.
z.B. ein Fortschritt bei 'ner Dateigröße (Int64) in eine ProgressBar (Integer) reinzubekommen
Jetzt könne man es selber umrechnen oder man läßt es eben automatisch skalieren.
Diese kleine Klasse setzt bei Zuweisung von .Max automatisch einen Skalierungsfaktor, so daß Alles möglichst optimal in einen Integer reinpaßt.
(man kann aber auch den Skalierungsfaktor selber noch ändern
oder die Automatic an andere Größem anpassen ... z.B. .Boundary := High(Word) )
Damit man in seinem Code nicht viel ändern muß, gibt es auch zwei Callback-Prozeduren.
So kann man z.B.
ProgressBar2.Position := x; einfach durch
ProgressBarScale.Position := x; ersetzen, und leitet dann in dem Callback via
ProgressBar2.Position := Sender.ScaledPos; den skalierten Wert weiter.
Der unteren ProgressBar wurden in der Demo die Werte unskalliert zugewiesen, weswegen sie oftmals den Bereich verlassen und auch noch was Falsches anzeigen.
Delphi-Quellcode:
var
S: TScale;
S := TScale.Create;
S.Max := $12345678901234;
S.Position := $1234567890;
ShowMessage(Format('%0.n %0.n %.5n%%'#13#10'%0.n %0.n %.5n%%', [
S.Position / 1, S.Max / 1, S.Position / S.Max * 100,
S.ScaledPos / 1, S.ScaledMax / 1, S.ScaledPos / S.ScaledMax * 100]));
S.Free;
raus kommt dabei dann sowas (oben die Originalwerte und unten skaliert)
Code:
. Position Max
normal 78.187.493.520 5.124.095.575.331.380 0,00153%
skaliert 18.641 1.221.679.586 0,00153%
MaxInt 2.147.483.647 2.147.483.647
Ach ja: bei automatischer berechnung, wird der Skalierungsfaktor so gelegt, daß ein "einfaches" Bitshifting ausreicht, statt 'ner "unständlicheren" 64 Bit-Integer-Division
Ein Therapeut entspricht 1024 Gigapeut.