Copyright © 2010 Promsite. All Rights Reserved.


Синхронизация двух списков строк

Автор Матт Теллес                                                                     перевод Виктор Алексеев aka prom



       Для того, чтобы привязать сообщение к компоненту, надо добавить его в карту отображения сообщений. Borland предлагает макрос для облегчения этой задачи. В заголовочном файле компонента добавьте следующие строки в секцию protected определяемого компонента:

BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_VSCROLL, TMessage,
        HandleVScroll)
  END_MESSAGE_MAP(TCustomListBox)

       Этот блок кода определяет появление нового сообщения для класса с указателем на сообщение WM_VSCROLL .  Второй пункт в макросе MESSAGE_HANDLER  называемый (TMessage) показывает тип структуры сообщения метода, который может быть получен. Для некоторых сообщений, вы, вероятно создадите собственную структуру, основанную на TMessage, но в данном случае вы будете использовать имеющуюся структуру TMessage.

       Последний аргумент макроса - это имя метода, который вы хотите вызвать, когда получите сообщение. Как только вы указали компилятору, какой метод нужен при получении сообщения, вы должны определить этот метод. Добавьте следующую строку в секцию private заголовочного файла компонента:

  virtual void __fastcall HandleVScroll(
  TMessage& msg );

       Может вызвать удивление, почему метод размещен в секции private, если системе потребуется вызвать его. Причина простая: этот метод вообще не вызывается системой! В действительности, только внутренние объекты вызывают этот метод.

       Когда вы используете макрос BEGIN_MESSAGE_MAP в заголовочном файле, вы  определяете inline метод, называемый  Dispatch. C++Builder вызывает метод Dispatch каждый раз когда получает сообщение от компонента. Если вы не определили метод Dispatch, то тогда указатель автоматически установится на класс TObject, который является предком для всех компонентов.

       Если посмотреть на определение  методов BEGIN_MESSAGE_MAP, MESSAGE_HANDLER, и END_MESSAGE_MAP,  то можно обнаружить сгенерированный код для строк, которые вы уже добавили в заголовочном файле компонента, подобный этому:

virtual void __fastcall Dispatch(
  void *Message_)
{
  switch  (((PMessage)Message)->Msg)  
    case  WM_VSCROLL:
       HandleVScroll(*((TMessage *)Message)); 
       break;
    default:
      TCustomListBox::Dispatch(Message);
      break;
  }
}

       (Прим. переводчика: вышеприведенный код никуда не надо вставлять. Здесь автор статьи просто показывает как компилятор развернет макрос в код С++. Т.е. компилятор вместо макроса подставляет функцию Dispatch).

       Как можно видеть, когда получено сообщение, оператор switch  определяет какое это сообщение. Если действительно получено сообщение  WM_VSCROLL, то выполняется метод HandleVScroll. Поскольку метод Dispatch размещен в секции private, то он может безопасно вызываться. Всё что надо сделать далее - это написать реализацию класса.

Реализация метода обработчика скролла

       Давайте сначала создадим реализацию метода обработчика скролла, а затем допишем детали и недостающие фрагменты. Добавим реализацию метода в ваш класс (файл *.cpp) и введем следующий код в метод:




стр. 2
стр. 2
P  R  O  M  S  I  T  E
Статьи по С++Builder 6
страницы: 1   2   3   4
страницы: 1   2   3   4

Для отображения Облака ссылок
необходим
Adobe Flash Player 9
или выше.