Delphi RIO - Ansi to string cast no funciona cuando la cadena Ansi es parte de una matriz de const

Aug 20 2020

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

6 RemyLebeau Aug 20 2020 at 22:02

Al igual que UnicodeStringy WideString, an AnsiStringse almacena en a TVarReccomo 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 AnsiStringdatos de forma adecuada (incluido su StrRecencabezado, 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 UnicodeStringla carga útil de un, no a AnsiStringla carga útil de un. Como tal, debe escribir el puntero a PAnsiCharo AnsiStringpara que el RTL sepa convertir los datos de ANSI a Unicode durante la asignación a un archivo UnicodeString.