想象一下,您想要分配自己的事件过程:
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完成吗?怎么样?
感谢名单
答案 0 :(得分:6)
您不需要RTTI。
任何代码都可以隐式访问在同一单元中声明的任何类的受保护成员。您可以通过在单元中声明需要访问该类成员的新TWinControl
后代来利用此功能。声明非常简单:
type
TProtectedWinControl = class(TWinControl);
然后将任何其他TWinControl
后代类型转换为该新类型,您将可以访问其任何受保护的字段,属性和方法。 TWinControl
的受保护成员是TProtectedWinControl
的自动保护成员(通过继承),因此当前单位可以访问它们。
TProtectedWinControl(AnyWinControl).OnMouseDown := SuperObject1.DoSomething;
请注意,这适用于受保护的成员,但不适用于 严格 受保护的成员。