Copyright © 2010 Promsite. All Rights Reserved.


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

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



       Как синхронизировать два списка строк, чтобы, когда один из них прокручивался, другой также синхронно изменялся?

       Ответы варьировались от простого захвата изменений в списке до перерисовки списка. Мне было интересно наблюдать, как много людей ищут решение не такой уж простой задачи. Хорошее решение, в конце концов, было найдено, но перед этим я уже создал собственный вариант.

       Суть этого решения лежит в понимании системы сообщений Windows. Вы действительно не сможете программировать в Windows без достаточных знаний о том, что происходит под этой "завесой". (Для более детальной информации о сообщениях, смотрите статью "Incorporate Custom Message-Handling in Your Applications" в первом выпуске журнала C++Builder Developer's Journal.) однако с появлением сред разработок таких как C++Builder, Delphi, и даже Visual Basic, программисты стали защищены от "ужасов" реального программирования в Windows. Поскольку проблема синхронизации списков смогла позволить мне в какой-то мере затронуть программную модель и прояснить некоторые аспекты без написания многотомных трудов (что-то я уже сделал), то я решил написать просто статью.

Что происходит на самом деле?

       Когда вы щелкаете на вертикальной полосе прокрутке, происходит много событий. В-первых, Windows фиксирует факт щелчка в окне. Далее, окно посылает запрос, где это событие произошло. Когда сообщение отправлено полосе прокрутки, то полоса прокрутки информирует родительское окно (в данном случае список), что пользователь запрашивает прокрутку списка.

       Эта информация формируется через Windows сообщение. Windows сообщения лежат в основе всей системы обработки событий, которые VCL использует для общения с внешним миром. События, по сути, являются обработчиками Windows сообщений,  и вы можете их использовать без знаний о них. Если вы хотите работать с сообщениями, которые не используют обработчики непосредственно, то это прибавит вам работы.

Создание компонента синхронизации списка.

       Для решения проблемы синхронизации прокрутки двух списков значений, необходимо создать компонент, основанный на классе  TCustomListBox.

Создание из существующих компонентов

       Когда вы хотите создать компонент для расширения функциональности из других компонентов, надо, в первую очередь, посмотреть на TCustomxxx версию этого компонента (где ххх - имя расширяемого компонента). Все функции базового компонента передадутся на уровень вниз без всякой потери.

       Если вы никогда не создавали компонент с нуля, не волнуйтесь, это просто! (для детальной информации смотрите третью часть "Building Components" серий статей в сентябрьском, октябрьском и ноябрьском выпусках 1997 г. журнала C++Builder Developer). Во-первых, в главном меню (для BCB6) откройте: Component - New Component. Вы увидите вкладку где надо ввести имя нового компонента; combo box  предлагает сделать выбор класса для расширения.

       Введите TSyncListBox в качестве нового имени компонента, затем выберите TCustomListBox для базового класса и нажмите OK. Мастер создаст заготовку компонента: сгенерирует основные файлы (прим. переводчика: "основные файлы" - это всего два файла - один заголовочный с расширением *.h, а другой с расширением *.cpp) для создания и регистрации компонента в C++Builder.

Добавление сообщения обработчика

       Как только вы создали заготовку компонента, следующим шагом станет написание кода, расширяющего возможности этого компонента. В данном случае это означает захват определенного сообщения Windows и при получении этого сообщения выполнения каких-либо действий.

       Рассмотрим сообщение системы Windows VM_VSCROLL, которое посылается системой, когда пользователь кликает на полосе прокрутки. Содержание сообщения включает типы  действий (перемещение вверх или по горизонтали, страница вверх или вниз, перемещение ползунка вверх или вниз) и имя элемента управления которому предназначена эта информация.

       Вся эта информация содержится в структуре Windows сообщения. В среде Borland Delphi/C++Builder, эта информация содержится, кроме того, в классе TMessage.



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

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