![]() |
Incompatible types beim Zusammensetzen von WideChars
Kann mir bitte jemand erklären wieso dieser Code unter Delphi 7 nicht kompiliert (Incompatible types)
Delphi-Quellcode:
Gibt es eine Alternative?
var s1,s2: widestring;
.. s1 := 'abc'; s2 := s1[1] + s1[2]; // fehler |
AW: Incompatible types beim Zusammensetzen von WideChars
Du hast vergessen die ganze Fehlermeldung zu kopieren.
Und ich wette da steht die Lösung drin. :roll: Expliziter Typecast oder ![]() |
AW: Incompatible types beim Zusammensetzen von WideChars
Hab ich nicht, das ist alles:
[Error] UppercaseUnit1.pas(60): Incompatible types |
AW: Incompatible types beim Zusammensetzen von WideChars
Ohhh, ich dachte auch damals wurden schon beide Typen genannt. :oops:
Zitat:
|
AW: Incompatible types beim Zusammensetzen von WideChars
Die Fehlermeldung verstehe ich trotzdem nicht.
s2 ist doch ein widestring. s1[1] und s1[2] sind widechars. Wieso darf ich zwei widechars nicht zu einem widestring zusammensetzen? es klappt schließlich mit chars und strings. |
AW: Incompatible types beim Zusammensetzen von WideChars
Nicht für alle Typen sind alle Operationen gleich implementiert.
String/AnsiString ist ein LongString (intern ein aufgemotztes dynamisches Char-Array). Der Typ "String[123]" und ShortString sind ShortString (intern ein Record). UnicodeString (seit D2009) ist auch ein LongString. WideString ist die Kapseltung einer WinAPI ( ![]() Ich hatte mal das Problem, dass für String und Variant die Reihenfolge von "OR" anders ausgewertet wird. Beim String->Variant kam erst das OR und dann der implizite Typcast und bei Variant->String erst der Typcast und dann das OR, was dann fröhlich knallte. |
AW: Incompatible types beim Zusammensetzen von WideChars
Zitat:
"WideString Der Typ WideString repräsentiert einen dynamisch zugewiesenen String mit 16-Bit-Unicode-Zeichen. In einigen Punkten entspricht er mit dem Typ AnsiString. In Win32 ist der Typ WideString kompatibel mit dem COM-Typ BSTR. WideString ist für COM-Anwendungen geeignet. WideString verfügt aber über keinen Referenzzähler, deshalb ist UnicodeString für andere Anwendungstypen flexibler und effizienter. Eine zuverlässige Indizierung von WideString-Multibyte-Strings ist nicht möglich, da S[i] das i-te Element (und nicht notwendigerweise das i-te Zeichen) in S repräsentiert. Die Typen Char und PChar sind in Delphi WideChar- bzw. PWideChar-Typen." ms-help://embarcadero.rs_xe7/rad/String-Typen_(Delphi).html |
AW: Incompatible types beim Zusammensetzen von WideChars
Eine zuverlässige Indizierung von WideString-Multibyte-Strings ist nicht möglich, da S[i] das i-te Element (und nicht notwendigerweise das i-te Zeichen) in S repräsentiert.
Das finde ich verwirrend. Wenn man auf WideString per s[i] zugreift ist i immer das i-te Zeichen im s (so lange korrekte UTF16-Daten im S vorliegen). D.h. bei einem string "ab" UTF16: $61 00 $ 62 00 ist s[2] = $62 00 und nicht 00 |
AW: Incompatible types beim Zusammensetzen von WideChars
Hmmm... mit D2007 kompiliert das:
Delphi-Quellcode:
In dem Thema ist Varianz drin. :mrgreen:
program Project1;
{$APPTYPE CONSOLE} uses SysUtils; var s1, s2: WideString; begin s1 := 'abc'; s2 := s1[1] + s1[2]; // fehler end. |
AW: Incompatible types beim Zusammensetzen von WideChars
Zitat:
Was in den "User defined character ranges" sich versteckt, dass weiß Keiner. Ja, in Delphi fangen Strings bei 1 an, als Kompatibilität auf den ersten Delphi-Stringtypen (ShortString), aber da sei Crossplatform können Strings plötzlich auch mal bei 0 anfangen (standardmäßig auf Android und iOS). |
AW: Incompatible types beim Zusammensetzen von WideChars
So geht es mit Delphi 7, man muss die einzelnen Zeichen zunächst einer WideString-Variablen zuweisen, danach kann man sie verbinden.
Delphi-Quellcode:
Hier das Ergebnis
program Project2;
{$APPTYPE CONSOLE} uses SysUtils; var s1, s2: WideString; s21, s22 : WideString; s : String; begin s1 := 'abc'; s21 := s1[1]; s22 := s1[2]; s2 := s21 + s22; WriteLn('s1=',s1); WriteLn('s1[1]=',s1[1]); WriteLn('s1[2]=',s1[2]); WriteLn('s21=',s21); WriteLn('s22=',s22); WriteLn('s2=',s2); ReadLn(s); end.
Code:
s1=abc
s1[1]=a s1[2]=b s21=a s22=b s2=ab |
AW: Incompatible types beim Zusammensetzen von WideChars
Zitat:
Delphi-Quellcode:
s21, s22 : WideChar;
|
AW: Incompatible types beim Zusammensetzen von WideChars
Ich habe noch etwas gespielt, ich denke s21 und s22 sind schon WideString, keine WideChar.
Wenn ich die beiden WideChar s1[1] und s1[2] nacheinander s3 zuweise ( statt s3 := s1[1]+s1[2] ), dann klappt das auch - siehe s3. Bei s4 funktioniert es auch. Wenn man WideChar mit + verknüpft, dann muss offenbar mindestens ein WideString in der + - Kette dabei sein, es funktioniert auch ein Leerstring, wie in dem Beispiel. Hier der Code
Delphi-Quellcode:
und hier das Ergebnis
program Project2;
{$APPTYPE CONSOLE} uses SysUtils; var s1, s2, s3, s4: WideString; s21, s22 : WideString; s : String; begin s21 := '<<<'; s22 := '>>>'; s1 := 'abc'; s21 := s21+s1[1]; s22 := s1[2]+s22; s2 := s21 + s22; s3 := s1[1]; // statt s3 := s1[1]+s1[2] s3 := s3+s1[2]; s4 := ''; s4 := s4+s1[1]+s1[2]; // statt s4 := s1[1]+s1[2] WriteLn('s1=',s1); WriteLn('s1[1]=',s1[1]); WriteLn('s1[2]=',s1[2]); WriteLn('s21=',s21); WriteLn('s22=',s22); WriteLn('s2=',s2); WriteLn('s3=',s3); WriteLn('s4=',s4); ReadLn(s); end.
Code:
s1=abc
s1[1]=a s1[2]=b s21=<<<a s22=b>>> s2=<<<ab>>> s3=ab s4=ab |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz