Delphi 访问TWinControl的受保护事件

Delphi 访问TWinControl的受保护事件,delphi,rtti,Delphi,Rtti,想象一下,您希望分配自己的事件过程: procedure TSuperObject.DoSomething(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ShowMessage('Yes, I am doing'); end; 到窗体上的任何控件。通常,如果表单上有Panel1(TPanel),您可以轻松完成: Panel1.OnMouseDown:=SuperObject1.D

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

procedure TSuperObject.DoSomething(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('Yes, I am doing');
end;
到窗体上的任何控件。通常,如果表单上有Panel1(TPanel),您可以轻松完成:

Panel1.OnMouseDown:=SuperObject1.DoSomething;
但是,如果你想普遍做到这一点,如何才能做到呢?您无法访问TWincontrol的受保护成员,因此直观回答:

AnyWinControl.OnMouseDown:=SuperObject1.DoSomething;
根本不起作用

RTTI能做到这一点吗?怎么做

Thanx

您不需要RTTI

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

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

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

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

您可以创建一个发布受保护事件的类(从TControls继承),并通过强制转换到此类来分配事件。e、 g.
THack(MyClass).OnMouseDown:=…
要这样做,您的类必须是TControl的后代。@bummi:您也一样…:-)我猜这是一个多次重复的骗局:请注意,已经有一个德尔菲可以解析和编写我认为你可能是一个天才…;-)