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 00: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: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 31.12.18 01: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 10: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: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 31.12.18 10: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 31.12.18 11:41 
Ausgehend von der Delphi-Version des TE's, ergibt string einen UnicodeString. Ein Ansi<>Unicode Problem kann somit nicht entstehen.
Einzig die Warnung wäre noch zu beachten, d.h. das eine Zeichen, welches der Zeichenkette zugewiesen wird, verlangt einen zusätzlichen string/WideString Cast.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
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 13: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: 381
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 31.12.18 14: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 31.12.18 17:48 
Wenn explizit Unicode-Zeichen verlangt werden, dann muss auch der Typ WideString bzw. UnicodeString für die Variable verwendet werden.
Wendet man stattdessen den Typ String an, so ergibt dieser ab Delphi 2009 einen UnicodeString, ansonsten AnsiString.
D.h. dass Komponenten wie z.B. TEdit in Delphi 2007 von Haus aus keine Unicode-Zeichen darstellen können,

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: gerd8888