Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   kleiner Integer-Scalierer (TScale) (https://www.delphipraxis.net/142719-kleiner-integer-scalierer-tscale.html)

himitsu 2. Nov 2009 13:29


kleiner Integer-Scalierer (TScale)
 
Liste der Anhänge anzeigen (Anzahl: 2)
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. :angel:

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

turboPASCAL 2. Nov 2009 15:11

Re: kleiner Integer-Scalierer (TScale)
 
Wozu brauchst'n du denn das ? :stupid:
Ich mach mir da immer so 'ne klene Scale-Funktion.

himitsu 2. Nov 2009 15:27

Re: kleiner Integer-Scalierer (TScale)
 
Hatte ich bisher auch immer so gemacht.
Nur wenn du vorher nicht weißt, wie groß der "äußere" Bereich letztendlich wird, dann muß man sich ja jedesmal 'ne Funktion basteln, welche einen passenden Skalierungsfaktor berechnet, da eine feste Skalierung da nicht geht.
Dazu muß man auch irgendwo diese Werte Speichern und dann muß man auch noch überall diese Skalierung mit einrechnen.

Und du kennst doch diese OOP-Dingsbums-Regeln "wenn etwas mehrfach vorkommt, dann lagere es aus".
Tja und nun isses 'ne eigenständige Klasse und man muß sich um nix mehr kümmern. :angel:

turboPASCAL 2. Nov 2009 15:33

Re: kleiner Integer-Scalierer (TScale)
 
Gerade mal getestet. :thumb:

himitsu 2. Nov 2009 16:13

Re: kleiner Integer-Scalierer (TScale)
 
Zitat:

Zitat von turboPASCAL
Gerade mal getestet. :thumb:

:-D


so, nur noch die Demo etwas umgebastelt und 'nen Bild davon rangehängt (falls da unbedingt wer was sehn will)


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