Я пытаюсь создать собственный элемент управления 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()
метод элемента управления будет потерян, если будет установлено одно из свойств события нажатия элемента управления.
Как правильно расширить функциональность того, что происходит при нажатии на пользовательский элемент управления?
Вот решение 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
}
Оба сообщения будут показаны.
Других решений пока нет …