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;
st:=wideChar($2657);
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 -
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!