gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:04 24 4
gpt4 key购买 nike

我正在尝试创建一个继承自 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关于调用“点击事件”处理程序。我设置了一个像这样的简单示例:

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 解决方案。

类接口(interface)和实现如下:

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
}

两条消息都会显示。

关于c++ - 如何覆盖自定义 Firemonkey 控件的单击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33423922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com