gpt4 book ai didi

delphi - 当编译器说它是 "not found in base class"时,如何重写方法?

转载 作者:行者123 更新时间:2023-12-03 15:22:06 27 4
gpt4 key购买 nike

我正在创建一个自定义组件,该组件源自 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;

显然,出于示例的目的,上面的内容被缩短了。

我遇到了以下编译错误:

Method GetImageIndex not found in base class

如何从我的组件访问和重写此方法?这些类型的方法不会在运行时发布或可用,因为我将进行组件所需的更改,所以我想知道如何访问和更改它?

<小时/>

解决方案

根据 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 方法是非虚拟方法。你不能覆盖它。

此处的自定义选项是:

  1. OnGetImageIndex 事件提供事件处理程序。
  2. CN_NOTIFY 消息处理程序中处理 LVN_GETDISPINFOALVN_GETDISPINFOW 通知代码,并在其中提供您自己的自定义行为。

前一个选项应该是显而易见的。后一个选项如下所示:

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;

请注意,您可以选择在所有场景中调用继承,然后除此之外应用自定义。这一切都取决于您的需求。

关于delphi - 当编译器说它是 "not found in base class"时,如何重写方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24492353/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com