【问题标题】:Delphi RIO - Ansi to string cast does not work when Ansi string is part of array of constDelphi RIO - 当 Ansi 字符串是 const 数组的一部分时,Ansi 到字符串转换不起作用
【发布时间】:2020-08-20 12:59:01
【问题描述】:

我使用的是 Delphi RIO 10.3.3。

当我将 Ansi 字符串作为 const 数组的元素之一传递时,string() cast 不起作用。为了使它工作,我必须先将 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;

输出:

代码归功于:How do I build an array of const?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    UnicodeStringWideString 一样,AnsiString 存储在TVarRec 中作为指向其数据有效负载的无类型 指针。您必须将该指针转换为AnsiString(或至少转换为PAnsiChar),以便RTL 正确访问AnsiString 的数据(包括其StrRec 标头,如果需要)。您正在尝试将未键入的 Pointer as-is 直接类型转换为 UnicodeString,这将不起作用。编译器会接受这一点,但它会假定指针指向UnicodeString 的有效负载,而不是AnsiString 的有效负载。因此,您需要将指针类型转换为 PAnsiCharAnsiString,以便 RTL 知道在分配给 UnicodeString 期间将数据从 ANSI 转换为 Unicode。

    【讨论】:

    • 谢谢 Remy 的解释......但这让我想知道,在这种情况下,Emb 自己的示例将无法按原样工作,至少对于 Ansi 字符串作为数组中的元素:@ 987654321@
    • @NamoRamana 正确,示例错误。当 string 在 D2009 之前仍为 AnsiString 时,它会像所示那样工作,甚至在 D2009 和 D2010 中,当 UnicodeString 支持 ANSI 有效负载时。但是由于 XE,所示示例不再适用,不(该示例还缺少一些 WideChar/WideString 数据的 case 块)。为此我有submitted a ticket
    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2013-08-21
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    相关资源
    最近更新 更多