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 :)