Delphi RIO-Ansi文字列がconstの配列の一部である場合、Ansiから文字列へのキャストは機能しません

Aug 20 2020

Delphi RIO10.3.3を使用しています。

constの配列の要素の1つとしてAnsi文字列を渡すと、string()キャストが機能しません。これを機能させるには、最初にVAnsiStringをAnsiString()にキャストしてから、String()キャストを適用する必要があります。

私がネットで見た同様の例のほとんどは、直接String()キャストを使用しています。

それはRIOのバグですか、それとも何かが足りませんか?

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;

出力:

コードクレジット:constの配列を作成するにはどうすればよいですか?

回答

6 RemyLebeau Aug 20 2020 at 22:02

と同様UnicodeStringWideString、anAnsiStringはそのデータペイロードへの型なしポインタTVarRecとしてに格納されます。RTLがのデータ(必要に応じてヘッダーを含む)に適切にアクセスするには、そのポインタをに(または少なくともに)キャストする必要があります。型なしそのまま型キャストしようとしていますが、これは機能しません。コンパイラはそれを受け入れますが、ポインタがのペイロードではなく、のペイロードへのポインタであると想定します。そのように、あなたはへのポインタをキャスト入力する必要がありますまたはそのRTLはへの割り当て時にUnicodeにANSIからデータを変換するために知っていること。AnsiStringPAnsiCharAnsiStringStrRecPointer UnicodeStringUnicodeStringAnsiStringPAnsiCharAnsiStringUnicodeString