【问题标题】:Accessing protected event of TWinControl访问 TWinControl 的受保护事件
【发布时间】:2013-08-06 16:58:21
【问题描述】:

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

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 能做到吗?怎么样?

感谢

【问题讨论】:

  • 您可以创建一个发布受保护事件的类(从 TControls 继承)并通过强制转换为此类来分配事件。例如THack(MyClass).OnMouseDown := ... 这样做你的类必须是 TControl 的后代。
  • @bummi: 你也一样... :-)
  • 请注意,已经有一个 Delphi SuperObject 可以解析和写入 JSON

标签: delphi rtti


【解决方案1】:

您不需要 RTTI。

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

type
  TProtectedWinControl = class(TWinControl);

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

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

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

【讨论】:

  • 我觉得你可能是个天才... ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多