当Ansi字符串是常量数组的一部分时,Delphi RIO-Ansi到字符串转换不起作用
我使用的是DelphiRio10.3.3 当我将Ansi字符串作为常量数组的元素之一传递时,string()cast对它不起作用。要使其工作,我必须先将Vansisting转换为AnsiString(),然后应用String()转换 我在网上看到的大多数类似示例都使用直接字符串()转换 是里约热内卢的虫子还是我遗漏了什么当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]
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;
输出:
代码贷记到:与
UnicodeString
和WideString
类似,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
块)。我必须为此付出代价。