如何覆盖自定义Firemonkey控件

时间:2015-10-29 20:25:50

标签: c++ firemonkey c++builder-xe8

我正在尝试创建一个自定义Firemonkey控件,该控件来自TListView控件。我想为控件添加一些功能,当用户点击控件时会自动执行该功能。因此,我的目标不是在我的控件表单上指定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");
}

这样可以正常使用,但根据文档:

  

如果用户已为控件的OnClick事件分配了处理程序,则单击该控件会导致调用该方法。

因此,如果设置了一个控件的click事件属性,那么我在控件的Click()方法中放置的任何其他逻辑都将丢失。

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

1 个答案:

答案 0 :(得分:1)

这是适合您的C ++ Builder解决方案。

这是类接口和实现:

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类的实例和必要的事件处理程序:

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
}

将显示两条消息。