Delphi-PRAXiS

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).

kwhk 10. Feb 2017 16:27

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:
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.
Hier das Ergebnis
Code:
s1=abc
s1[1]=a
s1[2]=b
s21=a
s22=b
s2=ab

t.roller 10. Feb 2017 17:37

AW: Incompatible types beim Zusammensetzen von WideChars
 
Zitat:

Zitat von kwhk (Beitrag 1361288)
So geht es mit Delphi 7, man muss die einzelnen Zeichen zunächst einer WideString-Variablen zuweisen, danach kann man sie verbinden.

Bei einem WideString hat S[i] den Typ WideChar.
Delphi-Quellcode:
s21, s22 : WideChar;

kwhk 11. Feb 2017 07:50

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:
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.
und hier das Ergebnis
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 13:20 Uhr.

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