AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte kleiner Integer-Scalierer (TScale)
Thema durchsuchen
Ansicht
Themen-Optionen

kleiner Integer-Scalierer (TScale)

Ein Thema von himitsu · begonnen am 2. Nov 2009 · letzter Beitrag vom 2. Nov 2009
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#1

kleiner Integer-Scalierer (TScale)

  Alt 2. Nov 2009, 13:29
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
Miniaturansicht angehängter Grafiken
demo_168.png  
Angehängte Dateien
Dateityp: 7z scale_189.7z (152,8 KB, 26x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:27 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