|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Добавление VCL-классу метода-обработчика сообщений путем создания helper-а
Добрый день!
В одном старом проекте, который мне было поручено доработать, есть поле типа TScrollBox, выполняющее роль контейнера графических примитивов: Код:
FScroll : TScrollBox; Чтобы иметь возможность обрабатывать события кнопок навигации(вверх/вниз/вправо/влево чтобы двигать примитивы на FScroll), класс должен содержать обработчик сообщения WM_GETDLGCODE. Поэтому я создал новый класс: Код:
TScrollBoxArrowBtn = class(TScrollBox) protected procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; end; procedure TScrollBoxArrowBtn.WMGetDlgCode(var Message: TWMGetDlgCode); begin Message.Result := DLGC_WANTARROWS; end; И заменил TScrollBox на TScrollBoxArrowBtn: Код:
FScroll : TScrollBoxArrowBtn; Компонент начал реагировать на нажатие кнопок стрелок. Но методы копирования, удаления, SelectAll перестали работать. Это произошло потому, что предыдущий разработчик добавил к методам проверки типа: Код:
"VariableName".ClassType = TScrollBox; Я заменил их на: Код:
"VariableName" is TScrollBox; После этого методы редактирования стали отрабатывать. Но я не уверен, что такие проверки типа "ClassType =" не встретятся где-нибудь еще. Поэтому я решил оставить: Код:
FScroll : TScrollBox; И сделал TScrollBoxArrowBtn классом-хелпером: Код:
TScrollBoxArrowBtn = class helper for TScrollBox protected procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; end; Но это не сработало - реакция на нажатия стрелок пропала. Это я в чем-то ошибся описывая хелпер или же в хелперах принципиально нельзя добавлять методы-обработчики сообщений? Последний раз редактировалось _anger, 16.02.2018 в 14:11. |