Поиск:

Ответ в темуСоздание новой темы Создание опроса
> события OnClick 
:(
    Опции темы
QuadMan
Дата 27.1.2005, 11:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите, пожалуйста, в Builder'e создаю потомок от TImage и хочу переопределить событие OnClick, чтобы по нему вызывался не просто щелчок, но и дополнительные действия. Как это реализовать правильнее?
Спасибо.
  Вверх
Adil'
Дата 27.1.2005, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 4
Всего: 15



Я бы ввел член (поручик, молчать!) для хранения "пользовательского" OnClick, и задал бы "внутренний" обработчик для TContol::OnClick:
Код
class TCapImage : public TImage
{                            
 typedef TImage inherit;
protected:
 TNotifyEvent FUserOnClick;
 //обработчик для "внутреннего" использования
 void __fastcall InternalOnClick(System::TObject* Sender)
 {
   ShowMessage(__FUNC__);//что-то вытворяем
   if(FUserOnClick)
     FUserOnClick(Sender);//дергаем "пользовательский", последовательность можно поменять :)
 }
public:
 __fastcall TCapImage(TComponent* AOwner) : TImage(AOwner)
 {
   inherit::OnClick=InternalOnClick;//задаем  свой обработчик
   FUserOnClick=NULL;
 }
__published:
 __property TNotifyEvent OnClick = {read = FUserOnClick, write = FUserOnClick};//объявляем пользовательский OnClick
};
В об'жект инспекторе не проверял, какой из OnClick там виден (в дизайн тайме), но в ран-тайме
присвоение
TCapImage *ci=new TCapImage...
ci->OnClick=...; работает правильно, значит и в дизайн-тайме тоже должно, проверь.

Это сообщение отредактировал(а) Adil' - 27.1.2005, 12:23


--------------------
Удачи
PM MAIL WWW   Вверх
NiJazz
Дата 27.1.2005, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Цитата
но и дополнительные действия.

Для этого достаточно просто описать обработчик события.
PM MAIL   Вверх
Adil'
Дата 27.1.2005, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 4
Всего: 15



Цитата(NiJazz @ 27.1.2005, 13:30)
Для этого достаточно просто описать обработчик события.
А потом пользователь компонента вставит свой обработчик - и что тогда?



--------------------
Удачи
PM MAIL WWW   Вверх
Vyacheslav
Дата 27.1.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Если я правильно понял вопрос, то требуется, что бы до или после выполнения OnClick обязательно выполнялся какой либо дополнительный код? Если так, то надо переопределить соответсвующую виртуальную функцию, как и положено в С++. Для данного случай это Click(void) и является стандартным способом для VCL. Правда из-за дельфийных корней, она не virtual, DYNAMIC
Код

class TMyImage :: TImage
{
//...
private
 DYNAMIC void __fastcall Click(void);
//...
};


void __fastcall TMyImage ::Click(void)
{
   //здесь что то делаем до срабатывания OnClick
    TImage::Click();
  //здесь что то делаем после OnClick

}


На будущее. Если хотите изменить поведение событий в производных классах, ищите virtual или DYNAMIC функции, которые носят имена события без префикса On (OnClick <-> Click) либо с добавлением префикса Do (OnDock <-> DoDock)


Добавлено @ 15:47
Adil
Твой способ тоже будет работать и в инспекторе все будет в порядке, но он, скажем так, "идеологически" smile не выдержанный


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Adil'
Дата 28.1.2005, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 4
Всего: 15



Vyacheslav, да, про TControl::Click я и забыл ...


--------------------
Удачи
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.