Delphi RIO-Ansi 문자열이 const 배열의 일부인 경우 Ansi에서 문자열로 캐스트가 작동하지 않습니다.

Aug 20 2020

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 배열을 어떻게 빌드합니까?

답변

6 RemyLebeau Aug 20 2020 at 22:02

추천 UnicodeString하고 WideString,는 AnsiString(A)에 저장된 TVarRecint로서 지정되지 않은 데이터 페이로드 포인터. RTL 이의 데이터 ( 필요한 경우 헤더 포함)에 올바르게 액세스하려면 해당 포인터를로 AnsiString(또는 적어도로 PAnsiChar) 캐스팅 해야합니다. 유형이 지정되지 않은 그대로으로 직접 유형 캐스팅하려고하는데 작동하지 않습니다. 컴파일러는이를 받아들이지 만 포인터가 의 페이로드가 아니라의 페이로드 에 대한 것이라고 가정합니다 . 따라서, 당신은 포인터를 캐스팅 입력해야 하거나 그래서 RTL가에 할당하는 동안 유니 코드 ANSI에서 데이터를 변환 할 알고 .AnsiStringStrRecPointer UnicodeStringUnicodeStringAnsiStringPAnsiCharAnsiStringUnicodeString