|
Entisoft Units Source Code SampleThis is a sample of the Visual Basic source code that you will receive when you register Entisoft Units.
Function estConvertFindCat (ByVal vvarUnits As Variant) As Variant
' Return the name of the most common physical measurement described by the measurement expression.
' For example, the expression "meters/seconds" (and any other expression which involves a combination of length over
' time) is most commonly used to represent measurements of velocity.
' Copyright 1995 Entisoft
On Error GoTo Error_estConvertFindCat
' Display the opening nag screen in the when this conversion function is first used within Shareware versions of the library.
If Not estUnitsAdShown Then
If estSharewarVersion Then
MsgBox "Thank you for trying the Shareware version of Entisoft Units. If you find this program useful and you continue to use it past the 30 day trial period, you are obligated to register it for $39.95. Registered users receive complete source code, additional program versions, additional conversion factors definitions, and technical support. Please see the About box for ordering information. Thanks for your support.", estvbInformation + estvbSystemModal, "Entisoft Units Shareware UNREGISTERED"
End If
estUnitsAdShown = True
End If
' Return Null when the argument is Null.
If Not estFixUpVariantToStringFn(vvarUnits) Then
estConvertFindCat = Null
Exit Function
End If
' Initialize the measurement conversion system if necessary.
Call estConvertInitMaybe
' This function converts the definition of each Category-type unit into base units then caches (stores) that to
' speed future calls to this function.
If Not estConvParDefDone Then
' Clear the vector which stores the hashed value of the converted definition strings.
ReDim estConvParDefHash(0 To estConvParDefHashSize)
Dim avarFm() As Variant
Dim varToBaseRtn As Variant
Dim dblConst As Double
Dim dblSub As Double
' Go through all of the Category-type unit definitions.
Dim intCurUnit As Integer
For intCurUnit = 1 To estConvNumUnit
If StrComp(Trim$(estConvUnit(intCurUnit).sType), estConvertTypeCategory, estCompareText) = 0 Then
' Get the definition of the current Category-type unit.
Dim strDef As String
strDef = Trim$(estConvUnit(intCurUnit).sDef)
' Convert the category definition to base units.
ReDim avarFm(0 To 2, 0 To 32)
dblConst = 0
varToBaseRtn = estConvertToBaseUnits(avarFm(), dblConst, ByVal strDef, dblSub, ByVal True, ByVal False)
If VarType(varToBaseRtn) = estvbString Then
' Lower-level errors in the measurement expression are echoed to the calling routine.
estConvertFindCat = varToBaseRtn
Exit Function
End If
' Need to sort the base units in the measurement expression so that any user-defined order of operands
' within the definitions does not affect this function which must find matching combinations of units
' quickly.
' Store the definition of the category in terms of base units.
Dim strParDef As String
strParDef = estConvertUnitsToStringSorted(avarFm())
estConvUnit(intCurUnit).sParDef = strParDef
' Insert or update an entry within the category definitions hash table.
Dim intHashPos As Integer
intHashPos = estConvertHashSelectParDef(strParDef)
estConvParDefHash(intHashPos) = intCurUnit
End If
Next intCurUnit
' Record that this initialization has been completed.
estConvParDefDone = True
End If
' Convert measurement to base units, returning the result when there is an error.
ReDim avarFm(0 To 2, 0 To 32)
dblConst = 0
varToBaseRtn = estConvertToBaseUnits(avarFm(), dblConst, ByVal vvarUnits, dblSub, ByVal True, ByVal False)
If VarType(varToBaseRtn) = estvbString Then
estConvertFindCat = varToBaseRtn
GoTo End_estConvertFindCat
End If
' Look for the same combination of base units among the category definitions.
Dim intUnit As Integer
strParDef = estConvertUnitsToStringSorted(avarFm())
intUnit = estConvParDefHash(estConvertHashSelectParDef(strParDef))
If intUnit <> 0 Then
' There was a category whose definition contains the same combination of base units as the argument to this function.
estConvertFindCat = Trim$(estConvUnit(intUnit).sCode)
GoTo End_estConvertFindCat
End If
' Since no matching category was found, form the reciprocal of the measurement expression and see if its category is known.
' Form the reciprocal of each of the base units.
For intCurUnit = 1 To UBound(avarFm, 2)
avarFm(estConvExpCol, intCurUnit) = -avarFm(estConvExpCol, intCurUnit)
Next intCurUnit
' Look for the category of the reciprocal of the units.
strParDef = estConvertUnitsToStringSorted(avarFm())
intUnit = estConvParDefHash(estConvertHashSelectParDef(strParDef))
If intUnit <> 0 Then
' A category was found.
estConvertFindCat = Trim$("reciprocal of " + estConvUnit(intUnit).sCode)
GoTo End_estConvertFindCat
End If
' No category could be found; return "unknown"
estConvertFindCat = "unknown"
End_estConvertFindCat:
Exit Function
Error_estConvertFindCat:
estConvertFindCat = "Warning: I have encountered error #" & Err & " (" & Error$ & ") while performing the conversion."
Resume End_estConvertFindCat
End Function
Copyright © 1999-2005 Entisoft