class 类型的单位名称停止工作
Unit name from class type stopped working
我有这个功能已经用了很久了,但是当我在一个新的项目中编译这个单元时突然停止了。我想可能是因为新项目是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}
使用默认项目设置,此代码会生成编译器警告,W1057。记录如下:
W1057 Implicit string cast from '%s' to '%s' (Delphi)
Emitted when the compiler detects a case where it must implicitly
convert an AnsiString (or AnsiChar) to some form of Unicode (a
UnicodeString or a WideString). This warning is on by default.
To avoid this warning, you need to explicitly typecast your AnsiString
to the new string type (UnicodeString), as follows:
<your_target_string> := string(<your_ansi_source);
The warning is also given for assigning a UTF8String value to an
instance of UnicodeString or WideString, in which case you can use an
explicit cast to UTF8String.
您的项目配置为将 W1057 视为错误。因此它被提升为 E1057 并且此代码导致编译器错误,而不是警告。此设置可以在代码中配置,也可以在 项目选项 对话框中的 提示和警告 页面下进行配置。
你有两个解决方案:
- 更改项目选项,以便忽略此条件或将其视为警告。
- 如上所述使用显式转换。
第二个选项通常更可取。看起来像这样:
Result := string(TD^.UnitName);
我有这个功能已经用了很久了,但是当我在一个新的项目中编译这个单元时突然停止了。我想可能是因为新项目是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}
使用默认项目设置,此代码会生成编译器警告,W1057。记录如下:
W1057 Implicit string cast from '%s' to '%s' (Delphi)
Emitted when the compiler detects a case where it must implicitly convert an AnsiString (or AnsiChar) to some form of Unicode (a UnicodeString or a WideString). This warning is on by default.
To avoid this warning, you need to explicitly typecast your AnsiString to the new string type (UnicodeString), as follows:
<your_target_string> := string(<your_ansi_source);
The warning is also given for assigning a UTF8String value to an instance of UnicodeString or WideString, in which case you can use an explicit cast to UTF8String.
您的项目配置为将 W1057 视为错误。因此它被提升为 E1057 并且此代码导致编译器错误,而不是警告。此设置可以在代码中配置,也可以在 项目选项 对话框中的 提示和警告 页面下进行配置。
你有两个解决方案:
- 更改项目选项,以便忽略此条件或将其视为警告。
- 如上所述使用显式转换。
第二个选项通常更可取。看起来像这样:
Result := string(TD^.UnitName);