Einzelnen Beitrag anzeigen

Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
482 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: AnsiString zu String zuweisen ohne Konvertierung?

  Alt 7. Dez 2019, 18:20
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;
Dennis

Geändert von Dennis07 ( 7. Dez 2019 um 18:32 Uhr)
  Mit Zitat antworten Zitat