Vielen Lesern dürfte die Rechenfunktion des Steuerlements vom Typ FormRealControl bekannt sein. Falls nicht, hier eine kleine Einführung: Wenn man in einem Feld vom Typ Gleitkommazahl eine komplette Kalkulation eintippt (Abb. a) und anschliessend die Eingabe bestätigt, wird dem Feld der ausgerechnete Wert zugewiesen (Abb. b).
Abb. a:
Abb. b:
So dachte ich, den Nutzen dieses Features dürfte auch durch x++ möglich sein. Das Resultat war schlussendlich eine statische Methode zum Auswerten von Kalkulationen.
So sieht die statische Methode aus:
/// <summary>
/// Calculates a simple math task
/// </summary>
/// <param name="_expression">
/// A simple mathematic expression. +-/* operators and brackets can be used
/// </param>
/// <returns>
/// The calculated result. If the expression does not match the expected format,
zero is returned.
/// </returns>
/// <remarks>
/// Uses functionality from <c>FormRealControl</c>, therefore client execution
is required.
/// </remarks>
static client real calcExpression(str _expression)
{
SysFormRun formRun;
Args args = new Args();
FormBuildControl buildCtrl;
FormRealControl realCtrl;
;
args.name(formstr(Dialog));
formRun = classFactory.formRunClass(args);
buildCtrl = formRun.form().design().addControl(FormControlType::Real,
classstr(FormRealControl));
formRun.init();
realCtrl = formRun.design().control(buildCtrl.id());
realCtrl.pasteText(_expression);
return realCtrl.realValue();
}Und so kann sie verwendet werden:
info(strfmt('%1', MyClass::calcExpression('5+(5*2)')));Als Anmerkung bleibt zu sagen, dass die Funktion über alle Einschränkungen verfügt, über die auch das Rechen-Feature des FormRealControl-Objekt verfügt.



Vielen Dank, dass Deine Artikeln auf Englisch und Deutsch geschrieben sind. Es hilft mir, meine Deutschkenntnisse zu verbessern:)
ReplyDeleteYour welcome.
ReplyDeleteYour German skills seems more than just acceptable :)