Delphi RIO - Ansi to string cast no funciona cuando la cadena Ansi es parte de una matriz de const
Estoy usando Delphi RIO 10.3.3.
Cuando paso la cadena Ansi como uno de los elementos de la matriz de const, la conversión de cadena () no funciona en ella. Para que funcione, primero tengo que lanzar VAnsiString a AnsiString() y luego aplicar el lanzamiento de String().
La mayoría de los ejemplos similares que he visto en la red usan la conversión directa de String().
¿Es un error en RIO o me estoy perdiendo algo?
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;
Producción:

Codifique los créditos para: ¿Cómo construyo una matriz de const?
Respuestas
Al igual que UnicodeString
y WideString
, an AnsiString
se almacena en a TVarRec
como un puntero sin tipo a su carga útil de datos. Debe lanzar ese puntero a AnsiString
(o al menos a PAnsiChar
) para que el RTL acceda a los AnsiString
datos de forma adecuada (incluido su StrRec
encabezado, si es necesario). Está intentando convertir el tipo sin tipo Pointer
tal como está directamente en UnicodeString
, lo que no funcionará. El compilador aceptará eso, pero asumirá que el puntero es a UnicodeString
la carga útil de un, no a AnsiString
la carga útil de un. Como tal, debe escribir el puntero a PAnsiChar
o AnsiString
para que el RTL sepa convertir los datos de ANSI a Unicode durante la asignación a un archivo UnicodeString
.