类类型的设备名称停止工作



我有这个函数,它已经工作了很长时间,但是当我在新项目中编译单元时它突然停止了。我认为这可能是因为新项目是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"转换为"字符串">
当我在System.TypInfo中查看时,我看到这个类型定义

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

使用默认项目设置,此代码将生成编译器警告 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. 如上所述使用显式强制转换。

第二种选择通常更可取。它看起来像这样:

Result := string(TD^.UnitName);

最新更新