Delphi RIO - Ansi ke string cast tidak berfungsi ketika string Ansi adalah bagian dari array const
Saya menggunakan Delphi RIO 10.3.3.
Ketika saya melewatkan string Ansi sebagai salah satu elemen array const, string () cast tidak berfungsi padanya. Untuk membuatnya bekerja, saya harus mentransmisikan VAnsiString ke AnsiString () terlebih dahulu dan kemudian menerapkan cast String ().
Sebagian besar contoh serupa yang pernah saya lihat di internet, menggunakan casting langsung String ().
Apakah ini bug di RIO atau saya melewatkan sesuatu?
function TForm1.VarRecToStr(AVarRec: TVarRec): string;
const
Bool : array[Boolean] of string = ('False', 'True');
begin
case AVarRec.VType of
vtInteger: Result := IntToStr(AVarRec.VInteger);
vtBoolean: Result := Bool[AVarRec.VBoolean];
vtChar: Result := AVarRec.VChar;
vtExtended: Result := FloatToStr(AVarRec.VExtended^);
vtString: Result := AVarRec.VString^;
vtPChar: Result := AVarRec.VPChar;
vtObject: Result := AVarRec.VObject.ClassName;
vtClass: Result := AVarRec.VClass.ClassName;
//vtAnsiString: Result := string(AnsiString(AVarRec.VAnsiString));
vtAnsiString: Result := string(AVarRec.VAnsiString);
vtCurrency: Result := CurrToStr(AVarRec.VCurrency^);
vtVariant: Result := string(AVarRec.VVariant^);
vtWideString: Result := string(WideString(AVarRec.VWideString));
vtUnicodeString:
Result := string(AVarRec.VUnicodeString);
else
result := '';
end;
end;
function TForm1.VarArrayToStr(AVarArray: array of const): string;
var
i : integer;
begin
result := '';
for i := 0 to High(AVarArray) do
result := result + VarRecToStr( AVarArray[i] );
end;
procedure TForm1.Button1Click(Sender: TObject);
var
w: WideString;
s: shortstring;
an: Ansistring;
begin
//
w := 'Wide';
s := 'Short';
an := 'Ansi';
ShowMessage(VarArrayToStr([w,s,an, 10]));
end;
Keluaran:

Kode kredit untuk: Bagaimana cara membangun sebuah array dari const?
Jawaban
Seperti UnicodeString
dan WideString
, an AnsiString
disimpan dalam TVarRec
sebagai penunjuk yang tidak diketik ke payload datanya. Anda harus mengarahkan penunjuk itu ke AnsiString
(atau setidaknya ke PAnsiChar
) agar RTL dapat mengakses AnsiString
data dengan benar (termasuk StrRec
tajuknya, jika diperlukan). Anda mencoba untuk mengetik-melemparkan untyped Pointer
sebagai-adalah langsung ke UnicodeString
, yang tidak akan bekerja. Kompilator akan menerimanya, tetapi ia akan menganggap pointer ke UnicodeString
payload, bukan ke AnsiString
payload. Dengan demikian, Anda perlu mengetikkan penunjuk ke PAnsiChar
atau AnsiString
agar RTL tahu untuk mengonversi data dari ANSI ke Unicode selama penugasan ke UnicodeString
.