什么是1055德尔福错误,这是重要的吗?

lke*_*ler 5 delphi multithreading

我正在使用FindFile例程来搜索目录中的所有文件.原始代码可从Latium Software免费获得.它运行的FindFile是一个单独的Thread.

它一直很好,仍然继续工作正常.但是自从我从Delphi 4升级到Delphi 2009后,它现在给出了一个警告:

W1055: Published caused RTTI ($M+) to be added to type '%s' (Delphi)
Run Code Online (Sandbox Code Playgroud)

错误发生在此线程声明的"已发布"行:

  TThread1 = class(TThread)
  private
    OwnerForm: TFindFileForm;
    procedure Initialize;
    procedure AddFileName;
    procedure Finalize;
  protected
    procedure Execute; override;
  published
    constructor Create(Owner: TFindFileForm);
    destructor Destroy; override;
  end;
Run Code Online (Sandbox Code Playgroud)

德尔福帮助指出:

您在{$ M +}/{$ TYPEINFO ON}开关生效时未编译的类中添加了"PUBLISHED"部分,或者没有派生自使用{$ M +}/{$ TYPEINFO ON}编译的类切换有效.

TypeInfo标准过程需要类型标识符作为其参数.在上面的代码中,'NotType'不表示类型标识符.

要避免此错误,请确保在{$ M +}/{$ TYPEINFO ON}开关打开时进行编译,或者从使用{$ M +}/{$ TYPEINFO ON}开关编译的类派生.

好吧,我没有添加'PUBLISHED'部分.它一直在那里.我不是组件开发人员,我真的根本不明白这个消息的含义,它是否真的是一个问题,以及我应该或不应该做些什么.

这是重要的,如果是这样,我该怎么做才能解决它?或者我应该忽略它?

Del*_*ics 11

Barry的回答涉及这一特定问题的关键,但请注意W1055不是"错误",它是一个警告(如W所示).

编译器输出中使用以下前缀:

  • Hnnnn - 暗示
  • Wnnnn - 警告
  • 恩恩 - 错误
  • Lnnnn - 链接器错误
  • Unnnn - 意外(?)内部错误

我按照相对严重性和重要性的顺序列出了这些.提示和警告通常不会影响您的编译 - 它们会告诉您代码中的内容所带来的后果.

错误显然是阻止编译的错误.链接器错误相对不常见,但表明尽管编译成功,但在链接期间出现了问题.

U错误是坏男孩 - 你很少得到这些,他们表明编译器本身出现了严重或意外错误.

正如Barry所说 - 在你的情况下,你可以忽略1055,因为这是一个警告,只是告诉你使用"已发布"的方式后果,就像你在代码中找到的那样.通常,最好有一个"零警告"(或提示)的策略,因为那时您可以在编译中使用提示或警告作为"红旗",表示代码中可能存在错误(编译器以你可能不想要的方式解释某些东西.例如,在这种情况下,你没有意思发布方法并将RTTI引入你的类中).


Bar*_*lly 7

它向可执行文件添加了一些数据并稍微增加了它的大小.在极少数情况下,它可能是一种逆向工程风险,因为它允许第三方(例如,破解者)看到该类支持已发布部分中提到的方法.

您可以放心地忽略它,或者替换该published指令public以使其消失.

  • 谢谢,巴里。如果我代表一个典型的 Delphi 程序员,那么诸如此类的错误消息对我们没有帮助,除非建议做什么更好。帮助没有提到任何关于更改公开发布的内容 (2认同)