![]() |
Delphi-Version: XE2
Variablen doppelt (float und str) verwalten?
Hallo,
eine Stil- oder Effizienz-Frage und eigentlich ein klassisches Thema. Man hat einen Haufen Variablen in einer Klasse, vorwiegend double, integer, einige wenige Strings (hier nicht relevant). Für das User-Interface, die Ausgabe, etc. braucht man eine String-Version der Variablen. Also FloatToStr/F. Dazu noch eine Umwandlung von SI in die passende Einheit (die Variablen liegen alle in SI vor, das UI stellt dem User passende Einheiten zur Verfügung). Im Grunde braucht es also sinngemäß so etwas:
Delphi-Quellcode:
Alles gut soweit.
edt_Value.Text := FloatToStrF(RoundTo(ConvertFromSI(SomeClass.Value, SomeClass.TargetUnit), -2);
Nun braucht man den oben erzeugten String (konvertiert und gerundet) an anderer Stelle nochmals, etwa in einem StringGrid. So, jetzt stellt sich die Frage: a) den gleichen Befehl von oben im Grunde rüberkopieren b) den String einmal erstellen und als weitere Variable in der Klasse mitführen c) eine eigene Klasse nur mit den Strings erzeugen d) den String von dort kopieren, wo er schon erzeugt ist e) für jede Variable eine eigene Funktion bauen, die sie als String zurückgibt. f) die Königslösung: eine generelle Funktion bauen, die eine beliebige Variable als String zurückgibt a) hat den augenscheinlichen Nachteil, dass Code vervielfacht wird. Da die Konvertierung von Einheiten über einen Datenbank-Zugriff geht, wird das auch etwas Performance kosten, weil mehrere hundert Zugriffe für alle Umrechnungsfaktoren aus der DB gelesen werden, und das dann eben zwei- oder mehrfach. b) hat den (ebenso offensichtlichen) Nachteil, dass jede Variable zweifach erzeugt wird, einmal der Originalwert (double, integer), einmal seine nach SI konvertierte, gerundete string-Fassung und die Klasse recht aufgeblasen wird. c) räumt den letzteren Nachteil auf und hat damit den Vorteil, dass ich das Objekt mit den Originaldaten übergeben kann. d) funktioniert nicht, da nicht alle Variablen gleichzeit im UI verfügbar sind. e) machbar, erscheint mir aber auch nicht beliebig elegant. f) wär ideal, bloß wie? Der Funktion müsste man eine beliebige Variable übergeben können. Vielleicht übersehe ich was, aber ich seh nicht, wie das gehen sollte. Habt ihr andere Idee? Danke im Voraus! |
AW: Variablen doppelt (float und str) verwalten?
Vielleicht ist es für mich noch zu früh am Morgen, aber bei uns bin ich hiermit eigentlich glücklich geworden:
Für Einheiten eigenen Typ definieren, wie z.B.
Delphi-Quellcode:
Wenn man das dann irgendwo auf dem Bildschirm oder anzeigt gibt es einen
type
/// <summary>Luftdruck in <b>kPa</b></summary> TAirPressure = Single; /// <summary>Temperatur in °C</summary> TTemperature = Single;
Delphi-Quellcode:
mit z.B
IUnitFormatter
Delphi-Quellcode:
Dann beschränkt sich das Anzeigen in Edit-Feldern, Grids usw. meist auf ein simples:
IUnitFormatter = interface
function format( const airPressure: TAirPressure; const digits: Byte = 0 ): String; overload; function format( const temperature: TTemperature; const digits: Byte = 1 ): String; overload; end;
Delphi-Quellcode:
Ist der Benutzer dann z.B. so verrückt dass er statt °C lieber diese komischen Ami-Einheiten (°F und so) haben will, wird zur Laufzeit einfach der Formatter ausgetauscht der dann als Ergebnis nicht "40,1 °C" sondern "60.4 °F" ausgibt.
Text := myFormatter.format(myTemperature);
|
AW: Variablen doppelt (float und str) verwalten?
Bau eine Converter-Klasse die alle Umwandlungsfaktoren einmal aus der Datenbank lädt und eine Formattierungsfunktion nach deinem Bedarf anbietet. Der Funktion übergibst Du Wert, Zieleinheit, Zahl Nachkommastellen.
|
AW: Variablen doppelt (float und str) verwalten?
Guten Morgen! :-D und danke!
Zitat:
Danke! |
AW: Variablen doppelt (float und str) verwalten?
Zitat:
Ansonsten hab ich genau so eine Klasse schon, die diversen Konversionen von und nach SI liefert. Aber ja, aktuell liefert sie wieder einen (double) Wert zurück. Stimmt aber, im Grunde kann man die Klasse etwas erweitern, sodass sie auch Strings liefert. Danke Dir! |
AW: Variablen doppelt (float und str) verwalten?
Zitat:
Delphi-Quellcode:
type
/// <summary>Luftdruck in <b>kPa</b></summary> TAirPressure = type Single; /// <summary>Temperatur in °C</summary> TTemperature = type Single; |
AW: Variablen doppelt (float und str) verwalten?
Zitat:
himitsus Tipp mit dem "eigener Typ" statt Alias hatte ich ganz vergessen, und das öffnet noch eine weitere Tür: Du kannst noch einen "record helper" für einen Typ wie z.B. eine Winkelposition
Delphi-Quellcode:
definieren, und dann noch mit Methoden ausstatten und Operator-Überladungen ausstatten. Sodass wenn man z.B. einen Winkel 190° und 180° addiert dass nicht 370 sondern 10 rauskommt.
type TAngularPosition = type Single
Aber nur falls einem langweilig ist 😉 |
AW: Variablen doppelt (float und str) verwalten?
Zitat:
|
AW: Variablen doppelt (float und str) verwalten?
Zitat:
Und dann gibt es bei uns noch Winkel die von -180° bis +180° gehen und welche von 0° bis 360° - und bei manchen kann der Anwender noch einstellen welche der beiden Varianten er will. :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 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