Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#11

AW: CE 12: constructor und Free vertragen sich nicht mit den destructor ?

  Alt 7. Aug 2024, 15:36
Oder man nimmt z.B. TBytes.

Delphi-Quellcode:
    constructor Create(c: Char); overload; // hier
    constructor Create(c: AnsiChar); overload; // und da: entspricht Char
    constructor Create(c: WideChar); overload; // und nu ? - kein Char, kein AnsiChar, nur Wide ?
Bis Delphi 2006/2007 Char=AnsiChat und seit Delphi 2009 Char=WideChar, da Delphi standardmäßig auf Unicode umgestellt wurde.
Ebenso ist nun MessageBox ein alias für MessageBoxW und früher war es ein MessageBoxA.

Also ich würde einfach das Char weglassen ... oder das WideChar, aber ohne Char wäre es eindeutiger.



Delphi 12 prüft einige Typen anders/genauer,
darunter vor allem nun Alias, welche eigentlich "identisch" sind, aber nun doch nicht mehr.

Drum wird z.B. bei SendMessage nun auch LPARAM und WPARAM als Typ angezeigt, welche früher als LongInt im CodeInsight standen.



PChar ist seit 2009 ein PWideChar,
so wie auch Char ein WideChar
und String ein UnicodeString.

Vor 2009 waren sie Alias zu den ANSI-Typen.

WideString ist der BSTR vom OLE32, siehe MSDN-Library durchsuchenSysAllocString


Früher gingen Overloads mit "gleichen" Typen garnicht, also Char und WideChar sind ja "eigentlich" gleich, bzw. das Eine ist nur ein Alias des Anderen und keine eigenständigen Typen,
aber solche Typen lassen sich JETZT dennoch unterscheiden (Fluch und Segen zugleich).



Bei Lazarus/FreePascal muß man aufpassen, denn die sind bei ANSI geblieben, bzw. nutzen an vielen Stellen nun UTF8String, welches einen AnsiString entspricht.



Es gibt ShortString (bis 255 Zeichen) bzw. String[x] (ein ShortString mit definierter Maximallänge)
die LongString (AnsiString und UnicodeString)
den WideString (der OLE32-API-Wrapper)
und irgendeinen UCS4-String (4 Byte pro Char, aber da ist nichts richtig implementiert)

Und mit AnsiString(x) ein paar Ableitungen des AnsiString, mit definierter Codepage.
der normale AnsiString mit CP_ACP (in einer ConsolenApp könnte es auch CP_OEM sein, jenachdem wie die WinAPIs konfiguriert sind)
UTF8String mit CP_UTF8
RawByteString mit CodePage $FFFF, wobei hier die Chars von #0 bis #255 einfach 1:1 konvertiert/kopiert werden.

die WideString und UnicodeString sind normal UTF-16 (PS, man kann auch einen AnsiString mit der UTF-16-Codepage definieren, in BigEndian oder LittleEndian)

Und beim Zuweisen der verschiedenen Stringtypen untereinander, konvertiert Delphi dann automatisch, entsprechend ihrer "aktuellen" CodePages.
$2B or not $2B

Geändert von himitsu ( 7. Aug 2024 um 15:55 Uhr)
  Mit Zitat antworten Zitat