Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Вопрос по VCL, но связан с Билдером, поэтому пишу сюда. Имеется автоматически созданный обработчик события клика по конктретному поп-ап меню (занимается удалением записи из таблицы): Код: plaintext 1. 2. 3. 4. 5. 6. При этом имеется обработка нажатия клавиши на форме, по нажатию которой вызывается вышеуказанный обработчик: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Однако у меня возникла необходимость отлавливать каким образом был вызван процесс удаления: по клику мышки через поп-ап меню или через клавишу Delete. Конечно, я могу вынести процесс удаления в процедруvoid-функцию, где в параметрах передавать флаг, идентифицирующий кто этот процесс вызывает. Но мне захотелось впихнуть этот флаг прямо в обработчик события клика по поп-ап меню: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. На что я при компиляции справедливо получаю замечание: Mr. BuilderThe Popup_DelClick method referenced by Popup_Del->OnClick has an incompatible parameter list . Remove the reference? Жмякаешь "No" и всё в итоге компилится и работает. Но все же хотелось бы узнать: 1. Можно ли как-то IDE намекнуть, чтобы она не беспокоилась по поводу таких вещей? 2. Если делать по уму, то как это должно выглядеть? Например, сделать аналогичный обработчик события, но со дополнительными параметрами (помимо TObject)? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 04:23 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретный2. Если делать по уму, то как это должно выглядеть?Ещё была идея детектить Sender'а (через dynamic_cast), но для этого надо знать к какому классу его кастовать... А в моих случаях я без понятия какие это классы =/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 04:32 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретныйв моих случаях я без понятия какие это классы =/А, ну в случае поп-ап меню Sender'ом будет выступать TMenuItem, наверное - и этого в принципе достаточно. Но а в случае такого вызова: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Кто будет являться Sender'ом - TForm? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 04:49 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
Ну в общем, да - dynamic_cast рулит: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Ну а всё-таки: НубикКонкретныйcделать аналогичный обработчик события, но со дополнительными параметрами (помимо TObject)? - такое возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 05:01 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретный, нет, такое невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 05:27 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
MasterZiv, т.е. все обработчики класса TForm (по каким-то совершенно мне непонятным причинам) должны в качестве параметра иметь исключительно объект класса TObject, так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 06:07 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретныйMasterZiv, т.е. все обработчики класса TForm (по каким-то совершенно мне непонятным причинам) должны в качестве параметра иметь исключительно объект класса TObject, так?Тут имеются в виду обработчики события OnClick и ему схожих. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 08:33 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретный, Ну где-то внутри VCL лежит уже скомпилированный код типа такого: Код: plaintext 1. и если вы исхитритесь подсунуть в OnClick указатель на функцию с другим списком параметров, программа просто упадет из-за порчи стека. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 18:51 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретный, Интерфейсы между подсистемами строго специфицированы, поэтому изменить сигнатуру обработчика невозможно: Как, например, кнопка из недр VCL узнает о дополнительных параметрах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 00:51 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
Благодарю за пояснения! Правда, я тут ещё решил копнуть и нашел на одном форуме фразу, связанную с моим вопросом:авторНе получится присвоить на OnClick обработчик, описанный отличнительно от типа TNotifyEvent Потому на другом форуме я нахожу противоположное заявление:автортип обработчика события не обязательно должен быть TNotifyEvent. Можно свой тип создать. TNotifyEvent - обработчик этого типа обязательно должен являться методом какого-либо класса. Можно объявить свой тип обработчика, без этого ограничения. Код: pascal 1. 2. 3. 4. Правда, речь и там, и там о Delphi - но какая разница? Или она есть? Что-то вышеуказанное меня в конец запутало... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 02:01 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
Это тоже наследование. По сути темы, надо копать в другом направлении - а "как сделать правильно", вместо "мне захотелось впихнуть". Т.е. в сторону учебников ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 10:48 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретный, Задай себе вопрос: кто будет передавать корректные параметры, когда я их добавлю в обработчик? Система не знает о новых параметрах. Если ты хочешь использовать код повторно, 1. определи обработчик Код: plaintext 1. 2. 3. 2. добавь обобщенный вариант с требуемыми параметрами: Код: plaintext 1. 2. 3. и там где тебе требуется, вызывай руками обобщенный обработчик с дополнительными параметрами, не трогая стандартный обработчик Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 12:19 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретныйПравда, речь и там, и там о Delphi - но какая разница? Или она есть? Нету. Обработчик события в своём собственном компоненте (классе) ты можешь сделать с абсолютно любой сигнатурой, поскольку потом его тебе же и вызывать. Event это вовсе не магическая вещь, а простой указатель на метод класса. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 12:50 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретныйБлагодарю за пояснения! Правда, я тут ещё решил копнуть и нашел на одном форуме фразу, связанную с моим вопросом:авторНе получится присвоить на OnClick обработчик, описанный отличнительно от типа TNotifyEvent Потому на другом форуме я нахожу противоположное заявление:автортип обработчика события не обязательно должен быть TNotifyEvent. Можно свой тип создать. TNotifyEvent - обработчик этого типа обязательно должен являться методом какого-либо класса. Можно объявить свой тип обработчика, без этого ограничения. Что-то вышеуказанное меня в конец запутало... Ты больше по форумам всяким дурацким лазай, ещё больше запутаешься. Нельзя верить всему, что написано в форумах, это надпись на заборе, написанная идиотами. Не забывай, что 95% людей на земле -- идиоты. Но тебе самому придётся разбираться, где правда, а где гон... по вопросу -- разные события имеют разные интерфейсы (сигнатуры) обработчиков, которые зашиты в API соотв. фреймворка или библиотеки. Если это чужой обработчик, его сигнатуру ты поменять не можешь. Если ты делаешь свой обработчик для своего события, ты его можешь сделать какой угодно, но после того, как ты его сделаешь, поменять его уже нельзя будет (без изменения всех обрабатывающих форм). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 14:43 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
MasterZiv.....Нельзя верить всему, что написано в форумах, это надпись на заборе, написанная идиотами. Не забывай, что 95% людей на земле -- идиоты.....У меня одного когнитивный диссонанс? =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 15:01 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
SiemarglУ меня одного когнитивный диссонанс? =) да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2017, 15:46 |
|
||
|
Добавление своих параметров в обработчик события
|
|||
|---|---|---|---|
|
#18+
НубикКонкретныйОднако у меня возникла необходимость отлавливать каким образом был вызван процесс удаления: по клику мышки через поп-ап меню или через клавишу DeleteА ты смотрел, что конкретно прилетает в каждом таком случае? Насколько знаю, TObject - базовый класс всех классов в Дельфи? По клику мышки в Sender будет указатель на объект кнопки с формы? А что там будет при нажатии кнопки Del? А меню? Общая идея такая: тебе нужен класс А, в котором будет передаваться информация. От этого класса надо отнаследовать все три Sender-а. В случае с кнопкой формы кнопке нужно просто задать ещё один родительский класс. Тогда при нажатии мышой в обработчик прилетит Sender, который можно кастовать к А и получать из него нужную информацию. Осталось понять, что будет в Sender в остальных случаях. Это один вариант. SiemarglУ меня одного когнитивный диссонанс? =)да, и там ещё процент сильно занижен :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 05:28 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39408834&tid=2018270]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 16ms |
| total: | 145ms |

| 0 / 0 |
