想象一下,您想要分配自己的事件过程:
procedure TSuperObject.DoSomething(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('Yes, I am doing');
end;
Run Code Online (Sandbox Code Playgroud)
到表单上的任何TWinControl.通常,如果表单上有Panel1(TPanel),您可以轻松完成:
Panel1.OnMouseDown:=SuperObject1.DoSomething;
Run Code Online (Sandbox Code Playgroud)
但如果你想普遍这样做,怎么能实现呢?您无法访问TWincontrol的受保护成员,因此直观答案:
AnyWinControl.OnMouseDown:=SuperObject1.DoSomething;
Run Code Online (Sandbox Code Playgroud)
根本行不通.
可以通过RTTI完成吗?怎么样?
感谢名单
你不需要RTTI.
任何代码都可以隐式访问在同一单元中声明的任何类的受保护成员.您可以通过TWinControl在单元中声明需要访问该类成员的新后代来利用此功能.声明非常简单:
type
TProtectedWinControl = class(TWinControl);
Run Code Online (Sandbox Code Playgroud)
然后将任何其他TWinControl后代类型转换为该新类型,您将可以访问其任何受保护的字段,属性和方法.受TWinControl保护的成员是TProtectedWinControl(通过继承)自动受保护的成员,因此当前单位可以访问它们.
TProtectedWinControl(AnyWinControl).OnMouseDown := SuperObject1.DoSomething;
Run Code Online (Sandbox Code Playgroud)
请注意,这适用于受保护的成员,但不适用于严格受保护的成员
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |