Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  2 536

•  TDictionary Custom Sort  4 762

•  Fast Watermark Sources  4 518

•  3D Designer  6 937

•  Sik Screen Capture  4 818

•  Patch Maker  5 310

•  Айболит (remote control)  5 319

•  ListBox Drag & Drop  4 207

•  Доска для игры Реверси  93 071

•  Графические эффекты  5 484

•  Рисование по маске  4 526

•  Перетаскивание изображений  3 717

•  Canvas Drawing  4 081

•  Рисование Луны  3 833

•  Поворот изображения  3 367

•  Рисование стержней  2 956

•  Paint on Shape  2 194

•  Генератор кроссвордов  3 036

•  Головоломка Paletto  2 388

•  Теорема Монжа об окружностях  3 165

•  Пазл Numbrix  2 075

•  Заборы и коммивояжеры  2 716

•  Игра HIP  1 696

•  Игра Go (Го)  1 616

•  Симулятор лифта  1 932

•  Программа укладки плитки  1 668

•  Генератор лабиринта  2 098

•  Проверка числового ввода  1 794

•  HEX View  2 045

•  Физический маятник  1 790

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Прокрутка таблицы - хитрость PeekMessage



На днях я решил поиграть с API-функцией PeekMessage(). Функция работает, но ловить ее нужно следующим образом.

Я прокручиваю таблицу, связанную с набором данных. "Поиск" в наборе данных замедляет процесс скролирования (условимся называть "поиском" синхронное перемещение табличного курсора в процессе скроллирования, при котором текущей записью становится запись, ближайшая к нажимаемой кнопке полосы прокрутки). Возникла задача: необходимо отменить "поиск" (процесс слежения) и переместить указатель на необходимую запись только в случае остановки пользователем процесса скроллирования, другими словами - пока пользователь осуществляет скроллирование, "поиск" необходимо отменить. Итак, ко мне в голову пришла мысль, что с помощью PeekMessage() можно выловить определенное сообщение и тем самым отменить поиск во время прокрутки. Звучит просто, но на самом деле все оказалось наоборот.

Я установил фильтр поиска сообщений на WM_MOUSEFIRST/LAST. Ситуация: пользователь непрерывно прокручивает DBGrid вниз, т.е. держит нажатой нижнюю кнопку скроллирования. В результате PeekMessage() возвращает False - нас это не устраивает, это не то, что мы хотим. Положительный результат можно получить только в случае сверхскоростных манипуляций мышью.

Если в фильтре использовать 0 и 0, чтобы поймать любое сообщение, результат всегда будет True. Причина, очевидно в том, что любой щелчок мыши в области DBGrid никак не обойдется без последствий, генерация системой сообщения PAINT яркий тому пример, поэтому PeekMessage может возвратить True в любое время, что тоже не может нам помочь.

Было бы хорошо, если бы дескриптор DBGrid получал событие OnMouseUp() во время его скроллирования. Обидно, но OnMouseUp() работает только с DBGrid, а не с полосами прокрутки. OnMouseUp() с TForm при KeyPreview:=true не работает, я проверял.

После пришла идея опросить состояние кнопок мыши с помощью функции GetKeyState(). Пока кнопка нажата (DOWN), "поиск" запрещен, и наоборот. UP (кнопка отжата) свидетельствует об окончании процесса скроллирования. Данный способ работы с окном во время манипуляций с его полосой прокрутки заработал без проблем. Теперь все в порядке: поиска во время прокрутки не происходит и табличный курсор также никуда не перемещается.

Рассмотренная тема имеет отношение к полосам прокрутки, а события OnKeyUp() и OnMouseUp() могут применяться где-нибудь еще.








Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте