类类型的单元名称停止工作

时间:2017-05-10 15:33:30

标签: delphi delphi-10.1-berlin

我有这个功能已经工作了很长时间,但是当我在一个新项目中编译单元时它突然停止了。我想这可能是因为新项目是FMX项目,结果类型不同。

class function TUnit.UnitName(aClassInfo: Pointer): String;
var
  TD: PTypeData;
begin
  Result := '';
  TD := GetTypeData(aClassInfo);
  if TD <> nil then
    Result := TD^.UnitName;
end;

我现在收到错误
[dcc32错误] E1057从'TSymbolName'到'string'的隐式字符串 当我查看System.TypInfo时,我看到了类型定义

{$IFDEF NEXTGEN}
  TSymbolName = Byte;
{$ELSE  NEXTGEN}
  TSymbolNameBase = string[255];
  TSymbolName = type TSymbolNameBase;
{$ENDIF NEXTGEN}

1 个答案:

答案 0 :(得分:4)

使用默认项目设置,此代码将生成编译器警告W1057。记录如下:

  

W1057隐含字符串从'%s'转换为'%s'(Delphi)

     

当编译器检测到必须隐式的情况时发出   将AnsiString(或AnsiChar)转换为某种形式的Unicode(a   UnicodeString或WideString)。默认情况下,此警告处于启用状态。

     

要避免此警告,您需要明确地对您的AnsiString进行类型转换   到新的字符串类型(UnicodeString),如下所示:

<your_target_string> := string(<your_ansi_source);
     

还给出了将UTF8String值分配给的警告   UnicodeString或WideString的实例,在这种情况下你可以使用   显式转换为UTF8String。

您的项目已配置为W1057被视为错误。因此它被提升为E1057,并且此代码导致编译器错误,而不是警告。此设置可以在代码中配置,也可以在项目选项对话框中的提示和警告页面下进行配置。

您有两种解决方案:

  1. 更改项目选项,以便忽略此条件,或将其视为警告。
  2. 使用如上所述的显式强制转换。
  3. 第二种选择通常更可取。看起来像这样:

    Result := string(TD^.UnitName);