删除已发布的空白部分始终安全吗?

Fab*_*zio 6 delphi access-modifiers

我正在一个旧的旧项目中工作,该项目有几个类,在其中published始终声明该节而内部没有任何内容,即:

TMyClass = class
public
   procedure DoSomething();
published
end;
Run Code Online (Sandbox Code Playgroud)

编译时,我收到以下警告消息:

[DCC警告] uMyUnit.pas(141):W1055发布导致RTTI($ M +)添加到类型'TMyClass'

我不知道前任开发人员是否published出于某些正当理由声明了这些部分。删除空白published部分始终是安全的,还是会导致应用程序行为发生某些变化?

Ste*_*nke 10

类本身没有区别-但是重要的是,任何继承自类的类的默认可见性{$M+}从公开变为公开!

请参见以下示例代码:

uses
  TypInfo;

type
  TMyClass = class
  private
    fName: string;
    property Name: string read fName;
  published
  end;

  TMyOtherClass = class(TMyClass)
    property Name;
  end;

var
  propCount, i: Integer;
  props: PPropList;
begin
  propCount := GetPropList(TypeInfo(TMyOtherClass), props);
  for i := 0 to propcount - 1 do
    Writeln(props^[i].Name);
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

你可以看到它列出的Name属性,但是当你删除从公布TMyClass它不会-这是因为一旦TMyClass得到{$M+}补充,而不明确说明,将公布反对公众知名度声明的任何成员。

同样,其他声明为不可见的成员(例如字段)也将被发布。这在Delphi用于表单等的流系统中正在使用。例如,您可以然后调用TObject.FieldAddressTObject.MethodAddress传入字段或方法的名称,并获取指向该字段或方法的指针。它仅适用于已发布的字段和方法。

这是如何从DFM套起来像所有那些IDE生成的字段加载Button1或连接Button1Click方法的Button1.OnClick-他们是在没有从继承的窗体顶部明确的知名度TComponent已经{$M+}宣布。