delphi – 当编译器说“在基类中找不到”时,如何覆盖方法?
我有一个自定义组件,它是从TCustomListView派生的.
我需要覆盖一个方法,特别是GetImageIndex方法,但我似乎无法访问它. 我正在制作的组件需要表现得像TListView,但没有很多已发布的属性和方法,因为我将在组件中创建自己的组件,因此我从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. 这里是: protected procedure GetImageIndex(Sender: TObject; Item: TListItem); // note not to override 和构造函数: constructor TMyListView.Create(AOwner: TComponent); begin inherited Create(AOwner); OnGetImageIndex := GetImageIndex; end; 如果这仍然是错误的请告诉我,但从快速初步测试我认为没有问题. 解决方法
TCustomListView.GetImageIndex方法是一种非虚方法.你无法覆盖它.
您在此处进行自定义的选项包括: >为OnGetImageIndex事件提供事件处理程序. 前一种选择应该是显而易见的.后一个选项如下所示: 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,然后再应用自定义.这一切都取决于您的需求. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |