Lade...
 

FString

FString

FString(editMask, constantText), FString(STACK, STACK)

Stack
Stack Position Typ Beschreibung
Stack(In) Top STRING Eingabe
Stack(Out) Top STRING Formatierte Ausgabe

Dieser Befehl implementiert die Formatierungsfunktion, die intern vom FormattedString-Widget verwendet wird.

Diese Formatierungsfunktion übersetzt beliebige Zeichenketten in eine entsprechende formatierte Zeichenkette. Die Formatierung wird über die Parameter editMask und constantText definiert. Falls editMask leer ist, dann wird keine Formatierung angewandt und der String genauso wieder zurückgegeben.

Die FString-Funktion bildet unformatierte Zeichenketten in einen Raum aus formatierten Zeichenketten  (definiert durch editMask und constantText) ab. Bereits formatierte Zeichenketten werden durch diese Funktion nicht verändert. Die Funktion ist somit idempotent, was eine wichtige Eigenschaft der FString-Funktion ist, damit die Ausführung von PutValue&GetValue oder FillWindow&DrainWindow auf einem FormattedString-Widget einen bereits formatierten Wert nicht erneut verändert, da sich der Wert nur dann ändern sollte, falls der Nutzer eine Eingabe getätigt hat oder das Format geändert wurde. Die Notwendigkeit der Idempotenz dieser Funktion erklärt auch einige etwas merkwürdige Regeln bei der Verarbeitung der editMask.

Hinweis: Das hier beschriebene Verhalten entspricht dem Verhalten ab Dll-Version 224610. Vorher war FString nicht idempotent und die Semantik war nicht klar definiert. Das Verhalten der folgenden editMask-Zeichen hat sich dadurch geändert 0,#,K,L,N.

Funktionsweise

Die editMask definiert an welcher Stelle in der Eingabe/Ausgabe welche Art von Zeichen erwartet werden und damit auch die maximale Länge des formatierten Strings. Der formatierte Strings ist nie länger als die editMask. 

Der Eingabestring wird formatiert, indem die editMask Zeichen für Zeichen durchgegangen wird und je nach Maskenzeichen beginnnend von der letzten Position ein entsprechendes Zeichen in der Eingabe sucht und in den Ausgabetext übernimmt. Für jedes Zeichen, das in der editMask gelesen wird, wird auch ein entspechendes Zeichen an der gleichen Position aus der constantMask gelesen. Die constantMask sollte also unbedingt die gleiche Länge haben wie die editMask. Die Zeichen aus der constantMask werden im FString-Befehl nur für die Maske k,K gelesen.

Im FormattedString-Widget wird über die constantMask der Text definiert, der beim Löschen von Zeichen anstelle der gelöschten Zeichen eingefügt werden soll. Dementsprechend sollte die constantMask immer eine gültige Eingabe für die editMask darstellen.

Bei der Suche nach einem passenden Zeichen kann es auch vorkommen, dass die Eingabe kein passendes Zeichen mehr enthält. Die Eingabeposition wird dann an das Ende der Eingabe gestellt und alle nachfolgenden Elemente der editMask verhalten sich wie in der Tabelle in der Spalte "falls leer" beschrieben.

 

Maskenzeichen

Maske akzeptiert Eingabezeichen erzeugte Ausgabe falls leer1
Einfache Formate
a Blank oder Buchstabe (A...Z bzw. a...z) Das Zeichena aus der Eingabe ""
A Blank oder Buchstabe (A...Z bzw. a...z) Das Zeichen aus der Eingabe als Großbuchstabe ""
c Blank, Buchstabe (A...Z bzw. a...z) oder Ziffer (0...9) Das Zeichen aus der Eingabe ""
C Blank, Buchstabe (A...Z bzw. a...z) oder Ziffer (0...9) Das Zeichen aus der Eingabe als Großbuchstabe ""
n, N Ziffer (0...9) Die Ziffer aus der Eingabe2 "0"
x jedes druckbare Zeichen Das Zeichen aus der Eingabe ""
X jedes druckbare Zeichen Das Zeichen aus der Eingabe als Großbuchstabe ""
Erweiterte Formate
k, K Das Zeichen aus constantText an der aktuellen Position.
Diese Maske durchsucht die Eingabe NICHT3
Das entsprechende Zeichen aus constantText Das entsprechende Zeichen aus constantText
0...0 Eine Ziffernfolge mit 0 bis n Ziffern
n = Anzahl der 0-en
Die Ziffernfolge der Eingabe links mit Nullen auf eine Länge von n Ziffern aufgefüllt. n 0-en
#...# Ziffernfolge mit 0 bis n Ziffern, denen Leerzeichen vorangestellt sein können.
Die voranstehenden Leerzeichen zählen zu der Anzahl der Ziffern dazu.4
n = Anzahl der #-Zeichen
Die Ziffernfolge der Eingabe links mit Leerzeichen auf eine Länge von n Zeichen aufgefüllt. (n-1) Leerzeichen gefolgt von einer 0
Platzhalter
l, L Diese Maske wird in der editMask und constantMask einfach überlesen.
Die Position im Eingabetext ändert sich dadurch nicht.5
"" ""

1= "" bedeutet hier, dass nichts in die Ausgabe geschrieben wird und "0", dass nur eine 0 in die Ausgabe geschrieben wird.

2= Da N bei einer leeren Eingabe trotzdem eine Ausgabe produziert, wird es potenziell mehrfach ausgeführt (siehe Sonderregel K&N)

3= Dies bedeutet, dass die Eingabeposition um ein Zeichen weitergeschaltet wird, falls das aktuelle Zeichen der Eingabe mit dem Zeichen aktuellen Zeichen aus constantText übereinstimmt. Ist dies nicht der Fall, dann wird die Eingabeposition nicht verändert. In beiden Fällen wird aber die gleiche Ausgabe erzeugt. (Siehe Sonderregel K)

4= Die Leerzeichen müssen bei der Maske "####" mitgezählt werden, damit die Funktion idempotent ist. Anderenfalls würde die Maske "##0" mit der Eingabe "1" zuerst die Ausgabe " 10" generieren und bei erneuter Ausführung die Ausgabe "100". 

5= Dieser Platzhalter wird vom FormattedString-Widget verwendet, um an dieser Stelle im Textfeld den entsprechenden Platzhalter aus constantText einzufügen. Dieser Platzhalter wird jedoch nie in die Ausgabe übernommen.

 

Erläuterungen zu Sonderregeln

Maske k,K

Die Maske K schreibt immer das Zeichen aus der aktuellen Position im constantText in die Ausgabe. Falls dieses Zeichen auch mit dem aktuellen Zeichen aus der Eingabe übereinstimmt, dann wird die Position in der Eingabe um eine Stelle weitergeschaltet. Ansonsten wird die Eingabeposition nicht verändert (im Gegensatz zu A,C,N&X wird die Eingabe nicht nach dem Zeichen durchsucht).

Diese Sonderbehandlung ist notwendig, damit FString idempotent ist.
Beispiel:

"ab123"  FString("AAKNNN", "AA-000") //= "AB-123"
"AB-123" FString("AAKNNN", "AA-000") //= "AB-123"


Falls K die Eingabe nie weiterschalten würde, dann hätte die zweite Anwendung in dem Beispiel "AB––123" ergeben.
Falls K die Eingabe durchsuchen würde, dann hätte die erste Anwendung in dem Beispiel "AB-000" ergeben.

Es gibt keinen Unterschied zwischen der Verwendung von k und K. In beiden Fällen wird das Zeichen 1:1 aus der constantMask übernommen.

Implizite Mehrfachanwendung von k,K und n,N

Da die Masken A,C,X bei einer leeren Eingabe keine Ausgabe produzieren, kann die Maske K und N den Ausgabestring verlängern, da auch bei einer leeren Eingabe eine Ausgabe generiert wird. Durch geschickte Kombination mit anderen Masken lässt sich so ein Format definieren, welches bei einer leeren Eingabe erst nach mehrfacher Anwendung von FString einen vollständig formatierten Text liefern würde, der sich nicht mehr verändert. Da FString idempotent sein muss, werden solche Fälle erkannt und FString intern erneut auf dem Ergebnis aufgerufen.

Beispiele:

"" FString("XXXK", "...F")       //= "FFFF"    ("" ⟶ "F" ⟶ "FF" ⟶ "FFF" ⟶ "FFFF")
"" FString("XXKXXKK", "..A..BC") //= "ABACBBC" ("" ⟶ "ABC" ⟶ "ABACBC" ⟶ "ABACBBC")
"" FString("XXXN", "...0")       //= "0000"    ("" ⟶ "0" ⟶ "00" ⟶ "000" ⟶ "0000")

 

Maske #...#

Die Maske "#" definiert ein Formatierungsfeld, welches 0-n Ziffern akzeptiert, wobei n der Anzahl der #-Zeichen entspricht. Wird ein solches Feld in der editMask erreicht, dann werden in der Eingabe alle Zeichen, die keine Ziffern oder Leerzeichen sind übersprungen. Anschließend werden führende Leerzeichen aus dem Eingabetext eingelesen (werden wie führende 0-en behandelt) und anschließend die Ziffern selbst. Die führenden Leerzeichen werden dabei wie 0-en behandelt und ebenfalls zu der Anzahl der Ziffern gezählt.

Dieses Verhalten unterscheidet sich von der Maske "0...0", welche sehr ähnlich arbeitet, aber führende Leerzeichen komplett überspringt und nicht zu den Ziffern zählt. Diese Unterscheidung ist jedoch notwendig, damit FString idempotent ist. Sobald eine echte Ziffer gefunden wurde, werden alle Zeichen, die keine Ziffer sind als Ende der Eingabe für dieses Feld gewertet.

Beispiele:

"1"       FString("###000", "000000") //= "  1000"
"  1000"  FString("###000", "000000") //= "  1000"
"1"       FString("000###", "000000") //= "001  0"
"001  0"  FString("000###", "000000") //= "001  0"
"123 456" FString("###000", "000000") //= "123456"
"123 456" FString("000###", "000000") //= "123 45"

 

Würde #...# führende Leerzeichen nicht als Ziffern zählen, dann würde das Format "##0" mit der Eingabe "1" zunächst " 10" liefern und bei erneuter Ausführung "100".

Maske l,L

Die Maske L (und das dazugehörige Zeichen aus dem constantText) wird bei der Anwendung dieser Formatierungsfunktion komplett ignoriert. L definiert einen Platzhalter, der ausschließlich vom FormattedString-Widget beachtet wird und dafür sorgt, dass an dieser Stelle das Zeichen aus dem constantText als Platzhalter im Widget dargestellt wird. Dieser Platzhalter dient lediglich als Orientierungshilfe bei der Eingabe und bei GetValue wird der von L erzeugte Platzhalter nicht zurückgegeben und bei PutValue auch nicht in der Eingabe erwartet.

Da im Gegensatz zu K komplett überlesen wird, sorgt die explizite Angabe des Platzhalters bei PutValue dafür, dass die Eingabe manchmal nicht wie vom Nutzer erwartet interpretiert wird.

Beispiel:

"CB-123" FString("AALNNN", "AA-000") //= "CB123"
"CB-123" FString("AALXXX", "AA-...") //= "CB-12"

 

Würde L den Platzhalter in der Eingabe überlesen, falls er darin vorkommt, dann würde FString("LAA", "AAA") die Eingabe "AAA" schrittweise zu "" verkürzen, was nicht dem Verhalten eines Platzhalters entspricht, der nur für die Darstellung innerhalb verwendet wird.

 

 

Beispiele

Eingangsstring editMask constantText Ergebnisstring
"abc123XQW5%&#$!_*~" "" "abc123XQW5%&#$!_*~"
"1078" "K0000" "S0000" "S1078"
"C-12ab" "AK00000" ".=" "C=00012"
"b12ab" "AK00000" ".=" "B=00012"
"123" "00000" "00000" "00123"
"12345" "NNKNNKNN" "00-00-00" "12-34-50"
"1234567" "XXXXKXXKXXKXXX" "....-..-..-..." "1234-56-7––"
"B12" "AK0000" ".-" "B-0012"
"12co" "0000LAA" "0000-AA" "0012CO"
"12co" "0000KAA" "0000-AA" "0012-CO"
"B12" "AK####" ".-" "B-  12"
"123456" "000K00K00" "...-..-.." "123-45-06"
"1234560" 000K00K00" "...-..-.." "123-45-60"
"HALLO23" "AAAAAAA" "......." "HALLO"
"Y23" "XXK000" "EB-123" "Y2-003"
"Y23" "AAK000" "EB-123" "Y-000"
"CD23" "AAK000" "EB-123" "CD-023"
"AB" "x000x" "" "A000"
"" "XXKXXKK" "..A..BC" "ABACBBC"
"" "XXXN" "...0" "0000"
"ABAA" "LAAA" "AAAA" "ABA"
"" "KK0000" "23" "230000"
"1" "KK0000" "23" "230001"
"2" "KK0000" "23" "230000"k
"231" "KK0000" "23" "230001"k
"230001" "KK0000" "23" "230001"