我正在创建一个源自TCustomListView
。
我不需要Items
属性发布,也不需要在运行时通过代码访问,因为我的自定义组件将处理项目的填充和访问。
我知道UnlistPublishedProperty
可以包含在您的组件的Register
过程中。所以考虑到这一点,我试过了:
UnlistPublishedProperty(TMyListView, 'Items');
根据我的理解,上面只会使对象检查器隐藏属性,因此代码MyListView1.Items
仍然存在。
如何让Items
属性(或我认为的任何属性)成为用户不可见,不可访问的属性,但仍可由我的组件访问?
谢谢。
答案 0 :(得分:6)
您不需要UnlistPublishedProperty
来安排不发布的财产。您只需选择不发布该属性即可。
要将其隐藏在代码之外,以及设计师,你运气不好。你可以试试这个:
....
private
property Items;
....
但它没有效果。来自documentation:
您可以通过重新声明属性来提高后代类中属性的可见性,但不能降低其可见性。
坦率地说,如果您希望您的控件不公开此属性,则不应从TCustomListView
开始。也许你需要封装而不是继承。
答案 1 :(得分:3)
对于派生类,您只能增加属性的可见性,但不能减少。由于Items属性在TCustomListView
中是公开的,因此无法将其隐藏在组件的用户中。
答案 2 :(得分:2)
据我所知,这是不可能的。
有两种解决方法可以接近:
答案 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
属性在设计时或运行时不再可见或无法访问,这是我的主要目标。
我发现的唯一缺点是,任何人都可以将TListView
或TCustomListView
置换为原来的Items
属性,但我可能不应该担心这个问题吗?
TListView(MyListView1).Items.Add.Caption := 'test';
答案 5 :(得分:-2)
您可以使用final来防止后代类覆盖您的任何方法。如果您将该方法声明为严格私有,那么Code Insight将不会在任何后代类中显示该方法。不确定这是否也适用于属性
Delphi编译器还支持最终虚方法的概念。 当关键字final应用于虚方法时,没有后代 class可以覆盖该方法。使用final关键字是一个 重要的设计决策,可以帮助记录课程的方式 打算使用。它还可以为编译器提供允许它的提示 优化它产生的代码。