当Ansi字符串是常量数组的一部分时,Delphi RIO-Ansi到字符串转换不起作用

当Ansi字符串是常量数组的一部分时,Delphi RIO-Ansi到字符串转换不起作用,delphi,Delphi,我使用的是DelphiRio10.3.3 当我将Ansi字符串作为常量数组的元素之一传递时,string()cast对它不起作用。要使其工作,我必须先将Vansisting转换为AnsiString(),然后应用String()转换 我在网上看到的大多数类似示例都使用直接字符串()转换 是里约热内卢的虫子还是我遗漏了什么 function TForm1.VarRecToStr(AVarRec: TVarRec): string; const Bool : array[Boolean]

我使用的是DelphiRio10.3.3

当我将Ansi字符串作为常量数组的元素之一传递时,string()cast对它不起作用。要使其工作,我必须先将Vansisting转换为AnsiString(),然后应用String()转换

我在网上看到的大多数类似示例都使用直接字符串()转换

是里约热内卢的虫子还是我遗漏了什么

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;
输出:


代码贷记到:

UnicodeStringWideString类似,AnsiString作为指向其数据有效负载的非类型指针存储在TVarRec中。您必须将该指针投射到
AnsiString
(或至少投射到
PAnsiChar
),RTL才能正确访问
AnsiString
的数据(如果需要,包括其
strec
头)。您正试图将非类型化的
指针
直接转换为
UnicodeString
,这将不起作用。编译器将接受这一点,但它将假定指针指向
UnicodeString
的有效负载,而不是
AnsiString
的有效负载。因此,您需要将指针键入cast到
PAnsiChar
AnsiString
,以便RTL知道在分配到
UnicodeString时将数据从ANSI转换为Unicode

谢谢Remy的解释。。。但这让我想知道,在这种情况下,Emb自己的示例不会像现在这样工作,至少对于数组中作为元素的Ansi字符串:@NamoRamana Correct,示例是错误的。在D2009之前,
string
仍然是
AnsiString
时,或者甚至在D2009和D2010中,
UnicodeString
支持ANSI有效负载时,它会像图中所示那样工作。但由于XE,所示的示例将不再有效,不会(该示例还缺少
WideChar
/
WideString
数据的一些
case
块)。我必须为此付出代价。