访问受保护的TWinControl事件

时间:2013-08-05 20:47:13

标签: delphi rtti

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

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完成吗?怎么样?

感谢名单

1 个答案:

答案 0 :(得分:6)

您不需要RTTI。

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

type
  TProtectedWinControl = class(TWinControl);

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

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

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