【问题标题】:Access protected property访问受保护的财产
【发布时间】:2016-02-05 10:48:37
【问题描述】:

我有一个派生自 Tobject 的类。在我的课堂上,我想使用受保护的控制属性。这是我的代码

    type
    THack = class(Tcontrol);

    TMyClass = class(TObject)
    private
      A: string;
      B: string;
      C: string;
      D: string;
    public
      procedure DoSomthing(MyForm: TForm);
    end;

  procedure TMyClass.DoSomthing(MyForm: TForm);
  var
    I: Integer;
  begin
    for I := 0 to MyForm.ControlCount - 1 do
    begin
      // I want to read Font property
      showmessage(inttostr(THack(MyForm.Controls[I]).Font.Size));
   end; 
  end;

有没有其他方法可以访问受保护的属性

【问题讨论】:

  • 您可能想改用表单的公共Controls 属性。如果您真的想使用 protected 属性,请从拥有该属性的类继承,如下所示:TMyClass = class(TControl)TMyClass = class(THack)
  • @fantaghirocco 要访问字体属性,我必须输入 TMyClass(MyForm.Controls[I]).Font.size
  • @fantaghirocco - 字体在 TControl 中受到保护。
  • 而且我也可以访问其他字段,例如 TMyClass(MyForm.Controls[I]).A 这是错误的
  • 您想访问表单上所有控件的属性还是只访问特定的一组控件?如果需要特定的一堆,那么我建议更好地定义这些控件的选择。如果您知道这些控件的类,那么您很可能能够通过适当的转换更好地控制它们。

标签: delphi


【解决方案1】:

我知道可以执行此任务的选项是:

  1. 问题中演示的经典受保护的黑客攻击
  2. 新型 RTTI。
  3. 类助手。

【讨论】:

  • 我们使用 Helper 类的原因是为了扩展基类的功能。我不是专家,但您认为使用辅助类是正确的方法吗?
  • @RahulBajaj 很难给出这样的一般性建议。有时您可能更喜欢使用经典的 hack,有时使用助手代码可能会更清晰。助手也有缺点。在您的代码中的任何给定点,只有一个可以处于活动状态。这完全取决于您自己决定如何执行此操作。