Autor Beitrag
gerd8888
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205
Erhaltene Danke: 3

Win7
Delphi 10.1 Starter (kostenlos) Lazarus
BeitragVerfasst: Mo 31.12.18 01:41 
Hallo,

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

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


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

Gerd
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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' hinein:
ausblenden Delphi-Quelltext
1:
edit1.Text := WideChar($2655);					


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

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
gerd8888 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205
Erhaltene Danke: 3

Win7
Delphi 10.1 Starter (kostenlos) Lazarus
BeitragVerfasst: 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 31.12.18 11:59 
Aus dem gleichen Grund warum auch das erste Beispiel nicht funktionierte. string ist ein array of char. 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 der ein WideChar Array repräsentiert. Dann sollte es weniger Probleme geben.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 31.12.18 12:41 
- Nachträglich durch die Entwickler-Ecke gelöscht -
gerd8888 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205
Erhaltene Danke: 3

Win7
Delphi 10.1 Starter (kostenlos) Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: 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

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)

Für diesen Beitrag haben gedankt: gerd8888
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 31.12.18 18:48 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: gerd8888