Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Incompatible types beim Zusammensetzen von WideChars (https://www.delphipraxis.net/191680-incompatible-types-beim-zusammensetzen-von-widechars.html)

Shark99 9. Feb 2017 19:18

Incompatible types beim Zusammensetzen von WideChars
 
Kann mir bitte jemand erklären wieso dieser Code unter Delphi 7 nicht kompiliert (Incompatible types)
Delphi-Quellcode:
var s1,s2: widestring;

..

s1 := 'abc';
s2 := s1[1] + s1[2]; // fehler
Gibt es eine Alternative?

himitsu 9. Feb 2017 19:47

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 Delphi-Referenz durchsuchenCopy

Shark99 9. Feb 2017 19:49

AW: Incompatible types beim Zusammensetzen von WideChars
 
Hab ich nicht, das ist alles:

[Error] UppercaseUnit1.pas(60): Incompatible types

himitsu 9. Feb 2017 19:55

AW: Incompatible types beim Zusammensetzen von WideChars
 
Ohhh, ich dachte auch damals wurden schon beide Typen genannt. :oops:
Zitat:

[dcc32 Fehler] Unit6.pas(28): E2010 Inkompatible Typen: 'String' und 'WideChar'
Na dann isses ja blöd. :?

Shark99 9. Feb 2017 20:03

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.

himitsu 9. Feb 2017 20:05

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 (MSDN-Library durchsuchenAllocSysString usw.).

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.

t.roller 9. Feb 2017 20:13

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

Shark99 9. Feb 2017 21:27

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

uligerhardt 10. Feb 2017 05:46

AW: Incompatible types beim Zusammensetzen von WideChars
 
Hmmm... mit D2007 kompiliert das:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  s1, s2: WideString;
begin
  s1 := 'abc';
  s2 := s1[1] + s1[2]; // fehler
end.
In dem Thema ist Varianz drin. :mrgreen:

himitsu 10. Feb 2017 09:18

AW: Incompatible types beim Zusammensetzen von WideChars
 
Zitat:

Zitat von Shark99 (Beitrag 1361218)
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).

Nein. Surrogates bestehen aus 2 Zeichen (4 Byte).
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).


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz