Показать сообщение отдельно
  #1  
Старый 16.02.2018, 13:37
_anger _anger вне форума
Прохожий
 
Регистрация: 16.02.2018
Сообщения: 3
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Добавление 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;

Но это не сработало - реакция на нажатия стрелок пропала. Это я в чем-то ошибся описывая хелпер или же в хелперах принципиально нельзя добавлять методы-обработчики сообщений?
Ответить с цитированием