Hallo,
in den letzten Tagen habe ich mir über die Größenanpassung von Formularen Gedanken gemacht. Die Umrechnung verschiedener Einheiten ineinander ist dabei immer wieder Thema.
Hier ist die Lösung, die ich dazu gefunden habe:
in einem Standardmodul - ob es Sinn macht, es in eine Klasse zu packen, habe ich nicht erwogen - wird eine Enumeration und eine Funktion definiert.
Public Enum eUnit
einch = 10
emm = 254
ept = 720
etwips = 14400
End Enum
Function UnitConv(sngVal As Single, eFrom As eUnit, eTo As eUnit) As Single
UnitConv = sngVal * CSng(eTo) / CSng(eFrom)
End FunctionDie Konstanten der Enumeration habe ich auf die größte Einheit, das Inch, normiert, d.h. Inch ist 1, zumindest theoretisch. Da aber Enumerationskonstanten grundsätzlich als Long dimensioniert sind und 1 Inch 25,4 mm entsprechen, habe ich die Werte mit 10 multiplizieren müssen, woraus die etwas merkwürdig anmutende Numerierung (10, 254, 720, 14400 statt 1 Inch = 25,4 mm = 72 pt = 1440 twips) innerhalb der Definition resultiert.
Als Parameter der Funktion finden Eingang:
- der zu konvertierende Zahlenwert,
- die Einheit aus der und
- die Einheit in die konvertiert werden soll.
Die Einheiten sind mit dem Datentyp eUnit der Enumeration dimensioniert. Das hat den großen Vorteil, dass die möglichen Parameter der Enumeration bei der Eingabe von der IntelliSense angezeigt werden, was die Eingabe natürlich wesentlich vereinfacht.
Der eigentliche Clou steckt aber in der Umrechnung innerhalb der Funktion, die nur aus einer einzigen Zeile besteht: UnitConv = sngVal * CSng(eTo) / CSng(eFrom)
Da die den Enumerationsparametern zugeordneten Zahlenwerte auf Inch normiert sind, ist der Konvertierungsfaktor einfach dadurch zu bestimmen, das man den Enumerationsparameter der Ausgangseinheit durch den der Eingangseinheit dividiert.
Ja, viel Spaß damit. Vielleicht kann es außer mir ja noch jemand brauchen oder das Prinzip nutzen.
Georg