Autor |
Beitrag |
gerd8888
      
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: Mo 31.12.18 00:41
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
      
Beiträge: 381
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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:
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 
      
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: 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?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var st:string;
st:=wideChar($2657);
edit1.text:=wideChar($2657); st:=edit1.Text; |
|
|
Symbroson
      
Beiträge: 381
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
      
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
|
Verfasst: 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 
      
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: 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
      
Beiträge: 381
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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 
_________________ 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
      
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
|
Verfasst: 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
|
|