如何覆盖自定义 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
}
两条消息都会显示。
我正在尝试创建一个继承自 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
}
两条消息都会显示。