Как переопределить событие click пользовательского элемента управления Firemonkey

Я пытаюсь создать собственный элемент управления 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
}

Тем не менее, я не могу найти что-либо в документации о том, какой метод я должен пытаться переопределить, или как я должен идти об этом вообще.

Я нашел эта информация о вызове обработчика Click-event. Я создал простой пример так:

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

Это работает нормально, однако согласно документации:

Если пользователь назначил обработчик событию OnClick элемента управления, при щелчке элемента управления вызывается этот метод.

Поэтому любая дополнительная логика, которую я поместил в Click() метод элемента управления будет потерян, если будет установлено одно из свойств события нажатия элемента управления.

Как правильно расширить функциональность того, что происходит при нажатии на пользовательский элемент управления?

2

Решение

Вот решение 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
}

Оба сообщения будут показаны.

1

Другие решения

Других решений пока нет …