Monday, March 8, 2010

Einfacher X++ Taschenrechner

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.

2 comments:

  1. Vielen Dank, dass Deine Artikeln auf Englisch und Deutsch geschrieben sind. Es hilft mir, meine Deutschkenntnisse zu verbessern:)

    ReplyDelete
  2. Your welcome.
    Your German skills seems more than just acceptable :)

    ReplyDelete