如何阻止访问TCustomListView中的Items属性?

时间:2014-07-01 12:10:11

标签: delphi delphi-xe

我正在创建一个源自TCustomListView

的自定义组件

我不需要Items属性发布,也不需要在运行时通过代码访问,因为我的自定义组件将处理项目的填充和访问。

我知道UnlistPublishedProperty可以包含在您的组件的Register过程中。所以考虑到这一点,我试过了:

UnlistPublishedProperty(TMyListView, 'Items');

根据我的理解,上面只会使对象检查器隐藏属性,因此代码MyListView1.Items仍然存在。

如何让Items属性(或我认为的任何属性)成为用户不可见,不可访问的属性,但仍可由我的组件访问?

谢谢。

6 个答案:

答案 0 :(得分:6)

您不需要UnlistPublishedProperty来安排不发布的财产。您只需选择不发布该属性即可。

要将其隐藏在代码之外,以及设计师,你运气不好。你可以试试这个:

....
private
  property Items;
....

但它没有效果。来自documentation

  

您可以通过重新声明属性来提高后代类中属性的可见性,但不能降低其可见性。

坦率地说,如果您希望您的控件不公开此属性,则不应从TCustomListView开始。也许你需要封装而不是继承。

答案 1 :(得分:3)

对于派生类,您只能增加属性的可见性,但不能减少。由于Items属性在TCustomListView中是公开的,因此无法将其隐藏在组件的用户中。

答案 2 :(得分:2)

据我所知,这是不可能的。

有两种解决方法可以接近:

  1. 将ListView控件包装在您自己的控件中(例如,您创建一个内部包含列表控件的控件)。内部控件与客户区对齐,并且不使用任何框架/边框等。声明要在外部控件上公开/发布的属性。帧等的属性应该应用于外部控件,其他属性应该转发到内部的ListView控件
  2. 创建自己的" ListView"控件(内部转发到WinAPI ListView控件)。您可以复制VCL" TCustomListView"的几乎所有内容。控制和使用受保护的项目。 (如果您只是使用此控件,那不应该是一个问题。但是由于版权问题,您不应该使用它来创建第三方库。)

答案 3 :(得分:0)

你可以在Items getter中引发一个异常,告诉程序员他的错,并创建一个新的私有属性来存储你的列表内容......

并覆盖所有方法以正确引用新的右侧支柱

答案 4 :(得分:0)

好的,我想我可能已经解决了自己的问题。为此,我创建了一个名为TMyListViewItems的新类。

TCustomListView派生的组件中,我在受保护的字段中有Items属性,这是我上面描述的类。

类结构的片段看起来像这样:

  { TMyListViewItems }
  TMyListViewItems = class
  public
    constructor Create;
    destructor Destroy; override;
  end;

{ TMyListView }
  TMyListView = class(TCustomListView)
  private
    FItems: TMyListViewItems;
  protected
    property Items: TMyListViewItems read FItems;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    // publish default listview type properties if needed here..
    property Align;
    property BevelEdges;
    property BevelInner;
    property BevelKind;
    property BevelOuter;
    property BorderStyle;
    property Color;
    property Font;
    property HideSelection;
    property IconOptions;
    property MultiSelect;
    property ParentColor;
    property ParentFont;
    property TabStop;
  end;

Items属性在设计时或运行时不再可见或无法访问,这是我的主要目标。

我发现的唯一缺点是,任何人都可以将TListViewTCustomListView置换为原来的Items属性,但我可能不应该担心这个问题吗?

TListView(MyListView1).Items.Add.Caption := 'test';

答案 5 :(得分:-2)

您可以使用final来防止后代类覆盖您的任何方法。如果您将该方法声明为严格私有,那么Code Insight将不会在任何后代类中显示该方法。不确定这是否也适用于属性

  

Delphi编译器还支持最终虚方法的概念。   当关键字final应用于虚方法时,没有后代   class可以覆盖该方法。使用final关键字是一个   重要的设计决策,可以帮助记录课程的方式   打算使用。它还可以为编译器提供允许它的提示   优化它产生的代码。