Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Добавление своих параметров в обработчик события / 17 сообщений из 17, страница 1 из 1
21.02.2017, 04:23
    #39408210
Добавление своих параметров в обработчик события
Здравствуйте!

Вопрос по VCL, но связан с Билдером, поэтому пишу сюда.

Имеется автоматически созданный обработчик события клика по конктретному поп-ап меню (занимается удалением записи из таблицы):
Код: plaintext
1.
2.
3.
4.
5.
6.
void __fastcall Popup_DelClick(TObject *Sender);

void __fastcall TForm1::Popup_DelClick(TObject *Sender)
{
    // удаление строки из таблицы
}


При этом имеется обработка нажатия клавиши на форме, по нажатию которой вызывается вышеуказанный обработчик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
    if (Key == VK_DELETE)
    {
        Popup_DelClick(Sender);
    }
}


Однако у меня возникла необходимость отлавливать каким образом был вызван процесс удаления: по клику мышки через поп-ап меню или через клавишу Delete. Конечно, я могу вынести процесс удаления в процедруvoid-функцию, где в параметрах передавать флаг, идентифицирующий кто этот процесс вызывает. Но мне захотелось впихнуть этот флаг прямо в обработчик события клика по поп-ап меню:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
void __fastcall Popup_DelClick(TObject *Sender, bool fromkey);

void __fastcall TForm1::Popup_DelClick(TObject *Sender, bool fromkey)
{
    if (formkey)
    {
        // ...
    }
    else
    {
        // ...
    }
}

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
    if (Key == VK_DELETE)
    {
        Popup_DelClick(Sender, 1);
    }
}


На что я при компиляции справедливо получаю замечание: Mr. BuilderThe Popup_DelClick method referenced by Popup_Del->OnClick has an incompatible parameter list . Remove the reference? Жмякаешь "No" и всё в итоге компилится и работает. Но все же хотелось бы узнать:

1. Можно ли как-то IDE намекнуть, чтобы она не беспокоилась по поводу таких вещей?

2. Если делать по уму, то как это должно выглядеть? Например, сделать аналогичный обработчик события, но со дополнительными параметрами (помимо TObject)?

Спасибо!
...
Рейтинг: 0 / 0
21.02.2017, 04:32
    #39408211
Добавление своих параметров в обработчик события
НубикКонкретный2. Если делать по уму, то как это должно выглядеть?Ещё была идея детектить Sender'а (через dynamic_cast), но для этого надо знать к какому классу его кастовать... А в моих случаях я без понятия какие это классы =/
...
Рейтинг: 0 / 0
21.02.2017, 04:49
    #39408213
Добавление своих параметров в обработчик события
НубикКонкретныйв моих случаях я без понятия какие это классы =/А, ну в случае поп-ап меню Sender'ом будет выступать TMenuItem, наверное - и этого в принципе достаточно. Но а в случае такого вызова:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
    if (Key == VK_DELETE)
    {
        Popup_DelClick(Sender);
    }
}


Кто будет являться Sender'ом - TForm?
...
Рейтинг: 0 / 0
21.02.2017, 05:01
    #39408214
Добавление своих параметров в обработчик события
Ну в общем, да - dynamic_cast рулит:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void __fastcall TForm1::Popup_DelClick(TObject *Sender)
{
	TMenuItem *ptMenu = dynamic_cast<TMenuItem*>(Sender);
	//TForm *ptForm = dynamic_cast<TForm*>(Sender); 
	
	if (ptMenu) // if (ptForm)
	{
		// ...
	}
	else
	{
		// ...
	}
}



Ну а всё-таки: НубикКонкретныйcделать аналогичный обработчик события, но со дополнительными параметрами (помимо TObject)? - такое возможно?
...
Рейтинг: 0 / 0
21.02.2017, 05:27
    #39408215
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
НубикКонкретный,
нет, такое невозможно.
...
Рейтинг: 0 / 0
21.02.2017, 06:07
    #39408219
Добавление своих параметров в обработчик события
MasterZiv, т.е. все обработчики класса TForm (по каким-то совершенно мне непонятным причинам) должны в качестве параметра иметь исключительно объект класса TObject, так?
...
Рейтинг: 0 / 0
21.02.2017, 08:33
    #39408250
Добавление своих параметров в обработчик события
НубикКонкретныйMasterZiv, т.е. все обработчики класса TForm (по каким-то совершенно мне непонятным причинам) должны в качестве параметра иметь исключительно объект класса TObject, так?Тут имеются в виду обработчики события OnClick и ему схожих.
...
Рейтинг: 0 / 0
21.02.2017, 18:51
    #39408708
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
НубикКонкретный,
Ну где-то внутри VCL лежит уже скомпилированный код типа такого:
Код: plaintext
1.
if (OnClick != NULL) OnClick(this);


и если вы исхитритесь подсунуть в OnClick указатель на функцию с другим списком параметров, программа просто упадет из-за порчи стека.
...
Рейтинг: 0 / 0
22.02.2017, 00:51
    #39408820
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
НубикКонкретный,

Интерфейсы между подсистемами строго специфицированы, поэтому изменить сигнатуру обработчика невозможно:



Как, например, кнопка из недр VCL узнает о дополнительных параметрах?
...
Рейтинг: 0 / 0
22.02.2017, 02:01
    #39408834
Добавление своих параметров в обработчик события
Благодарю за пояснения!

Правда, я тут ещё решил копнуть и нашел на одном форуме фразу, связанную с моим вопросом:авторНе получится присвоить на OnClick обработчик, описанный отличнительно от типа TNotifyEvent
Потому на другом форуме я нахожу противоположное заявление:автортип обработчика события не обязательно должен быть TNotifyEvent. Можно свой тип создать. TNotifyEvent - обработчик этого типа обязательно должен являться методом какого-либо класса. Можно объявить свой тип обработчика, без этого ограничения.
Код: pascal
1.
2.
3.
4.
type TNotifyEvent = procedure (Sender: TObject) of object; // простой обработчик
type TMyShitEvent1 = procedure (Sender: TObject; const Param: <тип_параметра>)  of object; // не совсем простой обработчик
type TMyShitEvent2 = procedure (Sender: TObject; var Param: <тип_параметра>)  of object; // не совсем простой обработчик
type TMyFuncEvent = function (Sender: TObject<; другие параметры>): <тип> of object; // и даже так можно!


Правда, речь и там, и там о Delphi - но какая разница? Или она есть?

Что-то вышеуказанное меня в конец запутало...
...
Рейтинг: 0 / 0
22.02.2017, 10:48
    #39408939
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
Это тоже наследование.

По сути темы, надо копать в другом направлении - а "как сделать правильно", вместо "мне захотелось впихнуть".

Т.е. в сторону учебников
...
Рейтинг: 0 / 0
22.02.2017, 12:19
    #39409042
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
НубикКонкретный,

Задай себе вопрос: кто будет передавать корректные параметры, когда я их добавлю в обработчик? Система не знает о новых параметрах.

Если ты хочешь использовать код повторно,
1. определи обработчик


Код: plaintext
1.
2.
3.
void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) {
    CommonFormKeyDownHandler(Sender, Key, Shift, Foo(), Boo());
}



2. добавь обобщенный вариант с требуемыми параметрами:

Код: plaintext
1.
2.
void __fastcall CommonFormKeyDownHandler(TObject *Sender, WORD &Key, TShiftState Shift, Foo MyParam1, Boo MyParam2) {
}



3. и там где тебе требуется, вызывай руками обобщенный обработчик с дополнительными параметрами, не трогая стандартный обработчик

Код: plaintext
1.
    CommonFormKeyDownHandler(Sender, Key, Shift, correctFoo, correctBoo);
...
Рейтинг: 0 / 0
22.02.2017, 12:50
    #39409085
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
НубикКонкретныйПравда, речь и там, и там о Delphi - но какая разница? Или она есть?

Нету. Обработчик события в своём собственном компоненте (классе) ты можешь сделать с
абсолютно любой сигнатурой, поскольку потом его тебе же и вызывать. Event это вовсе не
магическая вещь, а простой указатель на метод класса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.02.2017, 14:43
    #39409164
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
НубикКонкретныйБлагодарю за пояснения!

Правда, я тут ещё решил копнуть и нашел на одном форуме фразу, связанную с моим вопросом:авторНе получится присвоить на OnClick обработчик, описанный отличнительно от типа TNotifyEvent
Потому на другом форуме я нахожу противоположное заявление:автортип обработчика события не обязательно должен быть TNotifyEvent. Можно свой тип создать. TNotifyEvent - обработчик этого типа обязательно должен являться методом какого-либо класса. Можно объявить свой тип обработчика, без этого ограничения.

Что-то вышеуказанное меня в конец запутало...

Ты больше по форумам всяким дурацким лазай, ещё больше запутаешься.
Нельзя верить всему, что написано в форумах, это надпись на заборе, написанная идиотами. Не забывай, что 95% людей на земле -- идиоты. Но тебе самому придётся разбираться, где правда, а где гон...

по вопросу -- разные события имеют разные интерфейсы (сигнатуры) обработчиков, которые зашиты в API соотв. фреймворка или библиотеки. Если это чужой обработчик, его сигнатуру ты поменять не можешь. Если ты делаешь свой обработчик для своего события, ты его можешь сделать какой угодно, но после того, как ты его сделаешь, поменять его уже нельзя будет (без изменения всех обрабатывающих форм).
...
Рейтинг: 0 / 0
22.02.2017, 15:01
    #39409173
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
MasterZiv.....Нельзя верить всему, что написано в форумах, это надпись на заборе, написанная идиотами. Не забывай, что 95% людей на земле -- идиоты.....У меня одного когнитивный диссонанс? =)
...
Рейтинг: 0 / 0
22.02.2017, 15:46
    #39409204
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
SiemarglУ меня одного когнитивный диссонанс? =)
да
...
Рейтинг: 0 / 0
27.02.2017, 05:28
    #39410549
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление своих параметров в обработчик события
НубикКонкретныйОднако у меня возникла необходимость отлавливать каким образом был вызван процесс удаления: по клику мышки через поп-ап меню или через клавишу DeleteА ты смотрел, что конкретно прилетает в каждом таком случае?
Насколько знаю, TObject - базовый класс всех классов в Дельфи? По клику мышки в Sender будет указатель на объект кнопки с формы? А что там будет при нажатии кнопки Del? А меню?

Общая идея такая: тебе нужен класс А, в котором будет передаваться информация. От этого класса надо отнаследовать все три Sender-а. В случае с кнопкой формы кнопке нужно просто задать ещё один родительский класс. Тогда при нажатии мышой в обработчик прилетит Sender, который можно кастовать к А и получать из него нужную информацию. Осталось понять, что будет в Sender в остальных случаях.
Это один вариант.

SiemarglУ меня одного когнитивный диссонанс? =)да, и там ещё процент сильно занижен :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Добавление своих параметров в обработчик события / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]