当编译器说“在基类中找不到”时,如何覆盖方法?

时间:2014-06-30 14:23:01

标签: delphi delphi-xe

我正在创建一个源自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

如果仍然有问题请告诉我,但是从快速初步测试中我发现没有问题。

1 个答案:

答案 0 :(得分:8)

TCustomListView.GetImageIndex方法是一种非虚方法。你无法覆盖它。

您的自定义选项包括:

  1. OnGetImageIndex事件提供事件处理程序。
  2. LVN_GETDISPINFOA邮件处理程序中处理LVN_GETDISPINFOWCN_NOTIFY通知代码,并在那里提供您自己的自定义行为。
  3. 前一种选择应该是显而易见的。后一种选择如下:

    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,然后再应用自定义。这一切都取决于您的需求。