Mit
String
bzw.
UnicodeString
geht das so leider nicht, weil hier eine Konvertierung IMMER automatisch stattfindet (Deshalb sind
String
-Objekte auf der Linken Seite auch immer ReadOnly).
Das ist wegen der Referenzzählung notwendig, damit du keine Speicherlöcher bekommst. Allerdings gibt es hier ein paar möglichkeiten, das zu umgehen.
Der einfachste Weg wäre es, Statt
String
bzw.
UnicodeString
einen anderen Typ für die Zuweisung zu verwenden.
Ich würde einen Zeigertypen wie
PAnsiChar
oder alternativ
PByte
empfehlen.
Delphi-Quellcode:
var
a: AnsiString;
s: String;
begin
a := #$95;
// s := a;
PAnsiChar(s) := PAnsiChar(a);
ShowMessage((Ord(s[1]).ToHexString)); // Gibt $95 zurück
Allerdings bekommst du so für das zweite, dritte, vierte, ... Zeichen der Zeichenkette nur Salat heraus, da die Zeichen ja andere Bytegrößen haben. Das kannst du durch eine einfache Zuweisung nicht beheben, da du jedes Zeichen auf
Unicode erweitern musst.
KLEINE ERGÄNZUNG: So könntest du es Implementieren, falls du die Werte Kopieren willst:
Delphi-Quellcode:
var
a: AnsiString;
s: String;
pa: PAnsiChar;
ps: PChar;
begin
a := #$95#22;
SetLength(s, length(a));
pa := PAnsiChar(a);
ps := PChar(s);
while pa^ <> #0 do
begin
PAnsiChar(ps)^ := pa^;
Inc(pa);
Inc(ps);
end;
ShowMessage((Ord(s[2]).ToHexString)); // Gibt $16 zurück
end;