Delphi RIO-Ansi 문자열이 const 배열의 일부인 경우 Ansi에서 문자열로 캐스트가 작동하지 않습니다.
Delphi RIO 10.3.3을 사용하고 있습니다.
const 배열의 요소 중 하나로 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 배열을 어떻게 빌드합니까?
답변
추천 UnicodeString
하고 WideString
,는 AnsiString
(A)에 저장된 TVarRec
int로서 지정되지 않은 데이터 페이로드 포인터. RTL 이의 데이터 ( 필요한 경우 헤더 포함)에 올바르게 액세스하려면 해당 포인터를로 AnsiString
(또는 적어도로 PAnsiChar
) 캐스팅 해야합니다. 유형이 지정되지 않은 그대로으로 직접 유형 캐스팅하려고하는데 작동하지 않습니다. 컴파일러는이를 받아들이지 만 포인터가 의 페이로드가 아니라의 페이로드 에 대한 것이라고 가정합니다 . 따라서, 당신은 포인터를 캐스팅 입력해야 하거나 그래서 RTL가에 할당하는 동안 유니 코드 ANSI에서 데이터를 변환 할 알고 .AnsiString
StrRec
Pointer
UnicodeString
UnicodeString
AnsiString
PAnsiChar
AnsiString
UnicodeString