Formular Scripts

<< Klicken Sie, um das Inhaltsverzeichnis anzuzeigen >>

Navigation:  Scripts >

Formular Scripts

Im Formular-Editor kann ein Script hinterlegt werden, das die Anzeigezeile des Formulars in der Akte berechnet - z.B. einen Score aus Ankreuzfeldern, eine Plausibilitätsprüfung über mehrere Felder oder eine formatierte Zusammenfassung. Dieses Kapitel beschreibt die Grundfunktion eines Formular-Scripts und enthält eine Befehlsreferenz mit Beispielen.

Die allgemeine Scriptsprache wird im Kapitel Scripting-Tutorial beschrieben - dieses Kapitel setzt das Grundwissen voraus.

Grundsätzliche Verarbeitung: finalScore befüllen

Das Script wird bei jeder Änderung im Formular ausgeführt (typischerweise beim Klick auf OK). Es liest die Werte der Formularfelder, berechnet daraus ein Ergebnis und weist dieses der vordefinierten Variablen finalScore zu. Der Inhalt von finalScore wird anschließend in der Akte als zusammengefasste Ergebniszeile angezeigt.

Wichtig: finalScore ist eine String-Variable - auch Zahlenergebnisse müssen vor der Zuweisung über Format oder IntToStr/FloatToStr in einen Text umgewandelt werden. Wenn finalScore nach Scriptende noch den Initialwert '????' trägt, wird die Anzeigezeile nicht aktualisiert - so kann das Script die Aktualisierung gezielt unterdrücken, indem es finalScore einfach nicht setzt.

Minimalbeispiel:

var

   score: Integer;

begin

   score := frageA + frageB + frageC;

   finalScore := IntToStr(score);

end.

Vordefinierte Variablen

Im Formular-Script sind die folgenden Variablen ohne var-Deklaration verfügbar:

finalScore: String - Ausgabevariable für die Anzeigezeile (s.o.).

Empty: Extended - vordefinierter Wert für "leeres" numerisches Feld (intern -NaN). Damit kann eine fehlende Eingabe von einer eingegebenen 0 unterschieden werden - siehe validNumber.

Formularfelder: Jedes mit einem Namen versehene Feld des Formulars ist als gleichnamige Variable verfügbar:Ankreuzfelder (TITCCheckBox) - Extended, Wert 1.0 (angekreuzt) oder 0.0 (nicht angekreuzt).

Numerische Texteingaben (TEdit mit Datentyp Ganzzahl oder Fließkomma) - Extended. Leere Felder werden als Empty (-NaN) übergeben.

Text-Eingaben (TEdit Textmodus) - String. Mit StrToIntDef/StrToFloatDef bei Bedarf in Zahlen umsetzen.

NRS-Skalen (TITCNRS) - Extended.

Comboboxen (TComboBox) - String. Der Wert ist der Code (Teil hinter dem #255-Trenner aus der Anzeige/Code-Definition), nicht der Anzeigetext.

Die Rückführung in das Formular erfolgt automatisch nach dem Script: Wird der Variableninhalt eines Feldes im Script geändert, übernimmt der Formular-Editor diesen Wert in das Formular. So kann das Script aus mehreren Eingaben einen abgeleiteten Wert berechnen und in ein Anzeigefeld schreiben.

Beispiel: Combobox-Score mit Validierung

Das folgende Beispiel zeigt die typische Struktur eines Score-Scripts mit zwei Comboboxen. Die Codes der Comboboxen sind als Ganzzahlen kodiert und werden zur Berechnung addiert. Wenn der Benutzer eine der Comboboxen nicht ausgewählt hat (Wert lässt sich nicht in eine nicht-negative Zahl wandeln), gilt das Formular als ungültig und es wird statt eines Scores der Text 'Ungültig' angezeigt:

var

   ok: Boolean;

   score, x: Integer;

begin

   score := 0;

   ok := true;

 

   x := StrToIntDef(combobox1, -1);

   if x < 0 then

     ok := false

   else

     score := score + x;

 

   x := StrToIntDef(combobox2, -1);

   if x < 0 then

     ok := false

   else

     score := score + x;

 

   if ok then

     finalScore := Format(score, 0)

   else

     finalScore := 'Ungültig';

end.

Die Codes der Combobox-Einträge werden im Formular-Editor als Anzeige/Code-Paare definiert. Wenn als Code numerische Werte verwendet werden (z.B. 0, 1, 2, 3), lassen sich diese im Script mit StrToIntDef bequem in eine Zahl wandeln; der default-Parameter (-1) deckt den Fall "keine Auswahl getroffen" sauber ab.

Beispiel: Numerischer Score mit fehlenden Eingaben

Bei numerischen Feldern (Ankreuzboxen, Zahlen-Edits, NRS-Skalen) sollte mit validNumber geprüft werden, ob ein Wert eingegeben wurde - leere Felder kommen als -NaN ins Script:

var

   sum: Extended;

begin

   if validNumber(frageA) and validNumber(frageB) and validNumber(frageC) then

   begin

     sum := frageA + frageB + frageC;

     finalScore := Format(sum, 1);

   end

   else

     finalScore := 'unvollständig';

end.

 

Befehlsreferenz

Neben den im Scripting-Tutorial beschriebenen Standardfunktionen stehen im Formular-Editor folgende Funktionen zur Verfügung:

 

function Format(f: Extended; x: Integer): String;

Formatiert eine Fließkommazahl f mit x Nachkommastellen und liefert sie als Zeichenkette zurück - direkt für die Zuweisung an finalScore oder an String-Felder geeignet.

finalScore := Format(3.5537 * 12.77 - 0.56473, 3);

// liefert '44.819'

 

function roundTo(f: Extended; x: Integer): Extended;

Rundet eine Fließkommazahl f auf die angegebene Stellenzahl und liefert wieder eine Fließkommazahl zurück. Achtung: um Nachkommastellen zu runden, muss ein negatives x angegeben werden. 1234.5678 wird bei x = 2 auf 1200 gerundet, bei x = -2 auf 1234.57. Bei f = -NaN bleibt das Ergebnis -NaN.

gewichtKg := roundTo(gewicht_g / 1000, -2);

 

function validNumber(f: Extended): Boolean;

Liefert true, wenn f einen echten Zahlenwert enthält, und false bei -NaN (leere Eingabe). Damit lässt sich vor einer Berechnung sauber prüfen, ob alle benötigten Felder ausgefüllt sind.

if not validNumber(frageA) then exit;

 

function StrToIntDef(const s: String; const default: Integer): Integer;

Wandelt einen String in eine Ganzzahl. Schlägt die Wandlung fehl (z.B. weil der String leer ist oder keine Zahl darstellt), wird der zweite Parameter default zurückgegeben. Besonders nützlich zum Auswerten von Combobox-Codes und Text-Edits.

x := StrToIntDef(combobox1, -1);

if x < 0 then ok := false;

 

function StrToFloatDef(const s: String; const default: Extended): Extended;

Pendant zu StrToIntDef für Fließkommazahlen. Liefert bei fehlgeschlagener Wandlung den angegebenen Vorgabewert.

f := StrToFloatDef(textfeldGewicht, -1.0);

if f < 0 then finalScore := 'Gewicht fehlt';