如何覆盖自定义 Firemonkey 控件的单击事件

How to override on click event of custom Firemonkey control

我正在尝试创建一个继承自 TListView 控件的自定义 Firemonkey 控件。我想向控件添加一些功能,当用户单击控件时自动执行这些功能。因此,我的目标不是在控件的窗体上指定 OnItemClick 方法,而是将功能直接添加到控件本身。

我很难理解我需要做什么才能利用 TListView 的点击处理程序。在我的脑海中,我想我的解决方案看起来类似于这个伪代码:

//somewhere in the base TListView code
void __fastcall TListView::ClickHandler()
{
    //logic for handling a click on the list view
}

//somewhere in my custom list view control
void __fastcall TMyListView::ClickHandler()
{ 
    TListView::ClickHandler(); //call base click handler so all the normal stuff happens

    //my additional logic goes here
}

但是,我似乎无法在文档中找到任何关于我应该尝试覆盖什么方法,或者我应该如何处理这个问题的任何内容。

我确实找到了 this information 关于调用 'Click-event' 处理程序的信息。我设置了一个简单的例子:

void __fastcall TFmListView::Click()
{
    ShowMessage("This is the control's click");
}

这工作正常,但是根据文档:

If the user has assigned a handler to a control's OnClick event, clicking the control results in that method being called.

因此,如果设置了控件的点击事件属性之一,我放置在控件 Click() 方法中的任何附加逻辑都将丢失。

扩展单击自定义控件时发生的功能的正确方法是什么?

这是为您提供的 C++Builder 解决方案。

这里是class接口和实现:

class TMyListView : public TListView
{
protected:
    virtual void __fastcall DoItemClick(const TListViewItem *AItem);
};

...

/* TMyListView */

void __fastcall TMyListView::DoItemClick(const TListViewItem *AItem)
{
    // write here the logic that will be  executed
    // even if the OnItemClick handler is not assigned
    ShowMessage("Internal itemclick");

    // call the OnItemClick handler, if assigned
    TListView::DoItemClick(AItem);
}

然后在表单声明中声明 TMyListView class 的实例和必要的事件处理程序:

TMyListView *LV;
void __fastcall MyOnItemClick(const TObject *Sender, const TListViewItem *AItem);

下面是事件处理程序和 LV 创建的实现:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    LV = new TMyListView(this);
    LV->Parent = this;
    LV->Position->X = 1;
    LV->Position->Y = 1;
    LV->Width = 100;
    LV->Height = 100;

    LV->Items->Add()->Text = "111";

    LV->OnItemClick = &MyOnItemClick;
}

void __fastcall TForm1::MyOnItemClick(const TObject *Sender, const TListViewItem *AItem)
{
    ShowMessage("Assigned itemclick"); //or any other event handler action
}

两条消息都会显示。