Entwickler-Ecke

LCL-Komponenten - Sonderzeichen ausgeben


gerd8888 - Mo 31.12.18 01:41
Titel: Sonderzeichen ausgeben
Hallo,

ich möchte gerne eine Schachfigur (weisser König) wie folgt ausgeben lassen:


Delphi-Quelltext
1:
edit1. text:=chr($2655);                    


aber er zeigt etwas anderes an.
Woran liegt's. Wie lautet die richtige Nummer?

Gerd


Symbroson - Mo 31.12.18 02:42

Ein char hat eine Größe von 1Byte = 8bit = 256.
Wenn du versuchst $2655 auf einen char zuzuweisen entsteht ein 38-Facher Byte-Overflow und es wird im Endeffekt $2655 mod 256 = 85 = 'U' auf deine Zeichenkette zugewiesen. Soviel dazu was da passiert ist.

Was du brauchst ist ein WideChar mit einer Größe von 2Byte also 16 bit. Dann passt da auch dein Unicode-Zeichen 'Weiße Dame [https://www.compart.com/de/unicode/U+2655]' hinein:

Delphi-Quelltext
1:
edit1.Text := WideChar($2655);                    


Denke daran ggf. den Wert edit1.Font.CharSet im Objektinspektor auf UNICODE umzustellen


gerd8888 - Mo 31.12.18 11:18

ok danke. Noch eine Frage. Ich will dieses Sonderzeichen in ein String rein tun.
Nur über Umwege funktioniert es bei mir bislang. Warum?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var st:string;

//warumd geht das nicht
st:=wideChar($2657);

// das geht über Umweg
edit1.text:=wideChar($2657); st:=edit1.Text;


Symbroson - Mo 31.12.18 11:59

Aus dem gleichen Grund warum auch das erste Beispiel nicht funktionierte. string ist ein array of char [http://wiki.freepascal.org/String/de]. Wenn du versuchst ein WideChar[] auf einen char[] zuzuweisen, wird dieser implizit zu einem char[] gecastet und die einzelnen Unicode-Zeichen die ja eigentlich jeweils aus 2 Bytes bestehen werden in die einzelnen Bytes aufgeteilt interpretiert. Bei mir kommt dann eine Warnung 'Warning: Unicode constant cast with potential data loss' - also ein möglicher Datenverlust wegen Type-Casting.

Für Unicode-Zeichenketten gibt es analog zu WideChar den Datentyp WideString [http://wiki.freepascal.org/Widestring/de] der ein WideChar Array repräsentiert. Dann sollte es weniger Probleme geben.


Delete - Mo 31.12.18 12:41

- Nachträglich durch die Entwickler-Ecke gelöscht -


gerd8888 - Mo 31.12.18 14:01

Wenn der string schon ein UnicodString ist, bestehen wohl keine Bedenken, wenn ich es wie ganz oben gemacht habe ueber edit1 und anschliessend ueber einen string übergebe.
Oder ist das eine unsaubere Programmierart und ich sollte den string doch besser WideString deklarieren?


Symbroson - Mo 31.12.18 15:13

Ich empfehle es so zu Programmieren, dass keine Warnungen geschweigedenn Fehlermeldungen entstehen. Erstens verirrt das dich selbst unnötig und zweitens verwirrt es andere die deinen Quelltext ausprobieren. Drittens weiß man nie was eventuell für andere Fehler durch solche Warnungen entstehen können. Es ist nicht umsonst eine Warnung. Und was für ein Mensch wäre man wenn man so etwas einfach ignoriert :P


Delete - Mo 31.12.18 18:48

- Nachträglich durch die Entwickler-Ecke gelöscht -