Format Tags
Einige von uns benutzen ja die ScuiLib, um dem Programm
GUI Elemente zu verpassen. Hier mal ein Beispiel:
Die Wörter sind in jedem Knopf zentriert, so sieht es
eigentlich nicht schlecht aus. Aber falls jemand nun
Format Tags benutzen möchte, kann das schrecklich
aussehen. Im nächsten Beispiel sind teilweise Buchstaben
unterstrichen, damit der Benutzer weiss, welche
Tastaturkürzel er benutzen könnte:
Warum nun diese Verschiebung des Textes? Der ScuiLib
werden nun mehr Zeichen übergeben, als nachher im
Knopf sichtbar sind. Nehmen wir mal die Zeile Sprache.
Sprache hat sieben Buchstaben. Die ScuiLib berechnet
nun für sieben Buchstaben die Verschiebung aus, damit
nachher Sprache zentriert im Knopf erscheint. Möchte
man allerdings zwei Buchstaben unterstreichen, dann
sieht das so aus:
Der ScuiLib werden somit 21 Buchstaben übergeben,
obwohl nachher nur sieben sichtbar sind. Das müssen
wir ändern.
Wir basteln uns eine p_NoFormatTags Funktion und fügen
diese in die ScuiLib ein. Ich persönlich habe sie vor die
Funktion helpers.GetBrushID() hineingesetzt.
Nun suchen wir in der ScuiLib jede Stelle (ca. 15), welche den
Hollywoodbefehl TextWidth() benutzt. Dann fügen wir eine Zeile
vorher den Befehl p_NoFormatTags() ein und übernehmen die
Variable, welche der Befehl TextWidth benutzt hat. Hier ein Beispiel
aus der ScuiLib:
CWidth = TextWidth(CChar)
Diese Zeile müssen wir nun neu als Zweizeiler schreiben:
NeuerText = p_NoFormatTags(CChar)
CWidth = TextWidth(NeuerText)
So, und wie sieht diese p_NoFormatTags Funktion aus?
Wir wollen in unserem Beispiel sämtliche
bei der Breitenberechnung ausklammern:
Function p_NoFormatTags(Text)
Text=ReplaceStr(Text,[u],"")
Text=ReplaceStr(Text,[/u],"")
Return(Text)
EndFunction
Das sieht dann bei den Knöpfen so aus:
Super. Und wenn man Italic und Bold auch noch
berücksichtigen möchte, dann sieht die Funktion
nicht viel anderst aus:
Function p_NoFormatTags(Text)
Text=ReplaceStr(Text,[u],"")
Text=ReplaceStr(Text,[/u],"")
Text=ReplaceStr(Text,[i],"")
Text=ReplaceStr(Text,[/i],"")
Text=ReplaceStr(Text,[b],"")
Text=ReplaceStr(Text,[/b],"")
Return(Text)
EndFunction
Toll. Falls wir sonst keine Format Tags brauchen, dann
haben wir bereits unsere Funktion gebastelt. Aber ich
muss gestehen, dass ich Bold und Italic nie getestet
habe. Gerüchten zufolge funktioniert das mit Bold nicht
ganz zufriedenstellend.
Wenn wir aber (und das wollen wir jetzt) noch andere
Format Tags wie
[color=<new color>], [/color]
[shadow=<shadow color>,<shadow size>,<shadow direction>][/shadow]
[edge=<edge color>,<edge size>] [/edge]
benutzen möchten, wird die Funktion etwas grösser:
Function p_NoFormatTags(Text)
Local TextArray=StrToArray(Text)
Local AnzahlArray=ListItems(TextArray)
Local NeuerText=""
Local On="ON"
Local Off="Off"
Local FormatTag=Off
Local KlammerAuf=Asc("[")
Local KlammerZu=Asc("]")
For ii=0 To AnzahlArray-1
If TextArray[ii]=KlammerAuf
FormatTag=On
EndIf
If FormatTag=Off
NeuerText=NeuerText..Chr(TextArray[ii])
EndIf
If TextArray[ii]=KlammerZu
FormatTag=Off
EndIf
Next
Return(NeuerText)
EndFunction
Die For-Next Schleife wird sooft durchlaufen, wie Zeichen
in der Variablen Text übergeben wurde. Dann wird in dieser
Schleife jedes einzelne Zeichen überprüft, ob es eine
öffnende eckige Klammer [ ist. Falls nicht, wird der Variable
NeuerText dieses Zeichen angefügt. Falls es aber doch ein [
ist, wird das Anfügen übersprungen, bis eine schliessende
eckige Klammer ] kommt. Ab da werden die Zeichen wieder
in der Variablen NeuerText angefügt.
Die beiden Variablen On und Off können auch etwas
anderes beinhalten, wie z.B. 1 und 0, "Ja" und "Nein",
"Franz" und "Sussi" oder was weiss ich. Auch ii als
Zähler kann natürlich anderst heissen.
Diese Funktion hat allerdings eine Schwäche. Falls im
Text neben den Format Tags die beiden eckigen Klammern
vorkommen, dann werden diese auch als Format Tags
behandelt. Das geht allerdings schief. In diesem Fall
hilft nur noch diese Funktion:
Function p_NoFormatTags(Text)
Local TextArray=StrToArray(Text)
Local AnzahlArray=ListItems(TextArray)
Local NeuerText=""
Local On="ON"
Local Off="Off"
Local FormatTag=Off
Local KlammerAuf=Asc("[")
Local KlammerZu=Asc("]")
For ii=0 To AnzahlArray-1
If TextArray[ii]=KlammerAuf
If Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])="[b]"
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])="[i]"
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])="[u]"
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])="[/b]"
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])="[/i]"
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])="[/u]"
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])..Chr(TextArray[ii+7])="[shadow="
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])..Chr(TextArray[ii+7])..
Chr(TextArray[ii+8])="[/shadow]"
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
Chr(TextArray[ii+4])..Chr(TextArray[ii+5])="[edge="
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])="[/edge]"
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])="[color="
FormatTag=On
ElseIf Chr(TextArray[ii])..Chr(TextArray[ii+1])..Chr(TextArray[ii+2])..Chr(TextArray[ii+3])..
Chr(TextArray[ii+4])..Chr(TextArray[ii+5])..Chr(TextArray[ii+6])..Chr(TextArray[ii+7])="[/color]"
FormatTag=On
EndIf
EndIf
If FormatTag=Off
NeuerText=NeuerText..Chr(TextArray[ii])
EndIf
If FormatTag=On
If TextArray[ii]=KlammerZu
FormatTag=Off
EndIf
EndIf
Next
Return(NeuerText)
EndFunction
Nun wird bei jeder öffnenden eckigen Klammer überprüft,
ob anschliessend ein Format Tag folgt. Falls ja werden alle
Zeichen bis zur schliessenden eckigen Klammer ignoriert.
Falls nein, dann wird diese Klammer in der Breitenberechnung
berücksichtigt.
Ich habe bei mir die letzte grosse Funktion eingepflanzt. Ich
glaube, ob bei 12835 Codezeilen der ScuiLib noch ca. 60 mehr
oder weniger dazukommen, spielt keine Rolle mehr.
So, das wärs. Falls jemand die Funktionen genauer erklärt
haben möchte, dann bitte melden.
----------------------------------------------------------
In der Zwischenzeit hat Allanon im englischen Hollywood-Forum
eine andere Variante vorgestellt:
https://forums.hollywood-mal.com/viewto ... 1505#p1505
Leider ohne Lösungsbeispiel, aber anscheinend gibt es eine
weitere Möglichkeit, die Format Tags nicht zu berücksichtigen.
https://forums.hollywood-mal.com/viewto ... Str#p17454
Aber das kann ich (vielleicht noch) nicht erklären.
Griessli
Tipsi
Tante Edit am Freitag 26. Mai 2017: Bilder wieder hinzugefügt, ein paar Schreibfehler entfernt.
Tante Edit2 am Mittwoch, 22. Sept. 2021: Nochmals die Bilder hinzugefügt.
Tante Edit3 am Montag, 11. Okt. 2021: Am Schluss noch zwei Verweise auf das englische Forum eingefügt.