![]() |
s:string, s[i] <> string[1] ?!
Bin (immer noch) dabei eine Scripter-Library von D5 auf Delphi XE zu portieren und nach gefühlten 1000 Char und PChar umwandlungen auf Ansi/Wide und vielen weiteren spaßigen Sachen bin ich auf folgendes gestoßen:
Code:
Der Code sieht nun eigentlich recht unspektakulär aus, aber der Compiler meckert nun bei dem letzten else ("S[i] := a[1];") dort sieht er S[i] als Char und a[1] als AnsiChar.
procedure TCustomxyz.FToggleStrCase(var S : string);
var i : integer; len : integer; a : string[1]; b : string[1]; begin len := Length(S); i := 1; while i <= len do begin {...} b := S[i]; a := AnsiUpperCase(b); if a = b then S[i] := AnsiLowerCase(b)[1] else S[i] := a[1]; inc(i); end; end; Schauen wir uns deren Deklaration mal genauer an: S ist ein String, a ist auch ein String, allerdings als String[1] deklariert. WTF?! Der kastet also automatisch ein String[1] als Ansi und ein String als normalen (Unicode) Char. Sehe ich das so richtig? Das verwirrt mich doch jetzt ein wenig... |
AW: s:string, s[i] <> string[1] ?!
.. ein String in Delphi >= 2009 ist ein UnicodeString
Mach daraus einen AnsiString dann wird auch S[i] ein AnsiChar sein. Nachtrag:
Delphi-Quellcode:
Grüße
procedure TCustomxyz.FToggleStrCase(var S : AnsiString);
var i : integer; len : integer; //a : string[1]; //b : string[1]; a : AnsiChar; b : AnsiChar; begin len := Length(S); i := 1; while i <= len do begin {...} b := S[i]; a := AnsiUpperCase(b); if a = b then S[i] := AnsiLowerCase(b)[1] else S[i] := a[1]; inc(i); end; end; Klaus |
AW: s:string, s[i] <> string[1] ?!
Hallo,
Ja das war anfangs auch etwas verwirrend für mich. ShortStrings (d.h. auch Variablen vom Typ String[n]) sind AnsiStrings. Ist leider sehr irreführend. "Wide-ShortStrings" gibt es also quasi gar nicht. @Klaus01: Es ist ja gerade genau anders rum ;-) String[1] = AnsiChar |
AW: s:string, s[i] <> string[1] ?!
Zitat:
|
AW: s:string, s[i] <> string[1] ?!
String[...] ist ein
![]() ![]() ![]() ![]() ![]() Ein ShortString ist nunmal nur ANSI und daran hat sich selbst in D2009+ nicht geändert. PS: Einen String zu nehmen, wo doch eh nur ein Char benötigt wurde, war eh nicht das Wahre.
Delphi-Quellcode:
wobei es so wesentlich optimaler arbeiten würde
procedure TCustomxyz.FToggleStrCase(var S : String);
var i : Integer; a, b : String; begin for i := 1 to Length(S) do begin b := S[i]; a := AnsiUpperCase(S[i])[1]; if a = b then S[i] := AnsiLowerCase(b)[1] else S[i] := a; end; end;
Delphi-Quellcode:
procedure TCustomxyz.FToggleStrCase(var S : String);
var i : Integer; U, L : Char; begin U := AnsiUpperCase(S); L := AnsiLowerCase(S); for i := 1 to Length(S) do if S[i] = U[i] then S[i] := L[i] else S[i] := U[i]; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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 by Thomas Breitkreuz