我正在创建一个源自TCustomListView
。
我需要覆盖一个方法,特别是GetImageIndex
方法,但我似乎无法访问它。
我正在创建的组件需要表现得像TListView
,但没有很多已发布的属性和方法,因为我将在组件中创建自己的组件,因此我从{{1}派生它而不是。
在我的组件中,我尝试访问TCustomListView
,如此:
GetImageIndex
显然,为了示例的目的,上述内容被缩短了。
我遇到了编译错误:
在基类
中找不到方法TMyListView = class(TCustomListView) strict protected procedure GetImageIndex(Sender: TObject; Item: TListItem); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; procedure TMyListView.GetImageIndex(Sender: TObject; Item: TListItem); begin inherited; // Make my changes end;
如何从我的组件访问和覆盖此方法?这些类型的方法将不会在运行时发布或可用,因为我将进行组件所需的更改,因此我想知道如何访问和更改它?
解决方案
根据David Heffernan提供的信息,我有一个有效的解决方案。他确实提供了一种实现此方法的代码和另一种方式的信息,提供的代码对我来说仍然很麻烦所以我试图做他所说的选项1。
这是:
GetImageIndex
和构造函数:
protected
procedure GetImageIndex(Sender: TObject; Item: TListItem); // note not to override
如果仍然有问题请告诉我,但是从快速初步测试中我发现没有问题。
答案 0 :(得分:8)
TCustomListView.GetImageIndex
方法是一种非虚方法。你无法覆盖它。
您的自定义选项包括:
OnGetImageIndex
事件提供事件处理程序。LVN_GETDISPINFOA
邮件处理程序中处理LVN_GETDISPINFOW
和CN_NOTIFY
通知代码,并在那里提供您自己的自定义行为。前一种选择应该是显而易见的。后一种选择如下:
type
TMyListView = class(TCustomListView)
protected
procedure CNNotify(var Message: TWMNotifyLV); message CN_NOTIFY;
end;
....
procedure TMyListView.CNNotify(var Message: TWMNotifyLV);
begin
case Message.NMHdr.code of
LVN_GETDISPINFOA, LVN_GETDISPINFOW:
; // add your customisation here
else
inherited;
end;
end;
请注意,您可以选择在所有方案中调用inherited,然后再应用自定义。这一切都取决于您的需求。