3

想象一下,您想分配自己的事件过程:

procedure TSuperObject.DoSomething(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('Yes, I am doing');
end;

到窗体上的任何 TWinControl。通常,如果您在表单上有 Panel1 (TPanel),您可以轻松完成:

Panel1.OnMouseDown:=SuperObject1.DoSomething;

但是,如果你想普遍做到,怎么可能做到呢?您无法访问 TWincontrol 的受保护成员,所以直观的答案:

AnyWinControl.OnMouseDown:=SuperObject1.DoSomething;

根本行不通。

RTTI可以做吗?如何?

谢谢

4

1 回答 1

8

你不需要RTTI。

任何代码都可以隐式访问同一单元中声明的任何类的受保护成员。TWinControl您可以通过在需要访问该类成员的单元中声明一个新的后代来利用这一点。声明非常简单:

type
  TProtectedWinControl = class(TWinControl);

然后将任何其他TWinControl后代类型强制转换为该新类型,您将可以访问它的任何受保护字段、属性和方法。受保护的成员TWinControl是自动受保护的成员TProtectedWinControl(通过继承),因此当前单元可以访问它们。

TProtectedWinControl(AnyWinControl).OnMouseDown := SuperObject1.DoSomething;

请注意,这适用于受保护的成员,但不适用于严格的受保护成员。

于 2013-08-05T21:05:59.047 回答