Delphi RIO - Ansi ke string cast tidak berfungsi ketika string Ansi adalah bagian dari array const

Aug 20 2020

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

6 RemyLebeau Aug 20 2020 at 22:02

Seperti UnicodeStringdan WideString, an AnsiStringdisimpan dalam TVarRecsebagai penunjuk yang tidak diketik ke payload datanya. Anda harus mengarahkan penunjuk itu ke AnsiString(atau setidaknya ke PAnsiChar) agar RTL dapat mengakses AnsiStringdata dengan benar (termasuk StrRectajuknya, 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 UnicodeStringpayload, bukan ke AnsiStringpayload. Dengan demikian, Anda perlu mengetikkan penunjuk ke PAnsiCharatau AnsiStringagar RTL tahu untuk mengonversi data dari ANSI ke Unicode selama penugasan ke UnicodeString.