我正在尝试创建一个自定义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()
方法中放置的任何其他逻辑都将丢失。
在扩展单击自定义控件时发生的功能的正确方法是什么?
答案 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
}
将显示两条消息。