
Полоса прокрутки в DBGrid
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Есть подозрение, что плавность прокрутки пропорциональна числу строк в таблице 

Дрей, то была не ирония (тем более не желание пофлеймить, Боже упаси!), а просто дружеская улыбка. Коль скоро возникли такие подозрения, значит она была неуместной, за что приношу свои извинения.
По существу есть вопросы?
По существу есть вопросы?
Ну вот насколько приятнее отвечать на четко сформулированный вопрос! Сам я не использую Builder, так что все нижеизложенное на примере Delphi (на уровне VCL нет разницы).
У TDBGrid действительно есть проблема трекинга прокрутки: соответствующий вариант сообщения WM_VSCROLL просто игнорируется. При этом в базовом TCustomGrid трекинг реализован (см. TCustomGrid.Options, опция goThumbTracking), но к сожалению для TDBGrid недоступен, т.к. последний переопределяет свойство Options, закрывая доступ к унаследованному TCustomGrid.Options, а в конструкторе TDBGrid опция goThumbTracking сброшена. Здесь выскажу свое IMHO, зачем так сделано: прокрутка в TDBGrid предполагает выборку данных из базы, а эта операция может быть весьма небыстрой - соответственно при резвом перемещении движка скроллбара прокрутка будет постоянно тормозить.
Если все-таки трекинг очень нужен, то возможны 2 варианта действий:
1) в исходниках TDBGrid подправить конструктор (включить goThumbTracking в inherited Options) и перекомпилировать VCL; при этом данные в гриде, возможно, не будут синхронизированы с таблицей-источником;
2) породить свой производный класс от TDBGrid и подменить обработчик события WMVScroll на нечто подобное:
У TDBGrid действительно есть проблема трекинга прокрутки: соответствующий вариант сообщения WM_VSCROLL просто игнорируется. При этом в базовом TCustomGrid трекинг реализован (см. TCustomGrid.Options, опция goThumbTracking), но к сожалению для TDBGrid недоступен, т.к. последний переопределяет свойство Options, закрывая доступ к унаследованному TCustomGrid.Options, а в конструкторе TDBGrid опция goThumbTracking сброшена. Здесь выскажу свое IMHO, зачем так сделано: прокрутка в TDBGrid предполагает выборку данных из базы, а эта операция может быть весьма небыстрой - соответственно при резвом перемещении движка скроллбара прокрутка будет постоянно тормозить.
Если все-таки трекинг очень нужен, то возможны 2 варианта действий:
1) в исходниках TDBGrid подправить конструктор (включить goThumbTracking в inherited Options) и перекомпилировать VCL; при этом данные в гриде, возможно, не будут синхронизированы с таблицей-источником;
2) породить свой производный класс от TDBGrid и подменить обработчик события WMVScroll на нечто подобное:
Код: Выделить всё
procedure TMyDBGrid.WMVScroll(var Message: TWMVScroll);
begin
with Message do
if ScrollCode = SB_THUMBTRACK // Здесь может быть любой код,
ScrollCode := SB_THUMBPOSITION; // реализующий реакцию на SB_THUMBTRACK
inherited WMVScroll(Message);
end;
это LOWORD(wParam) для WM_VSCROLL, а в HIWORD(wParam) - current position (только для SB_THUMBPOSITION и SB_THUMBTRACK)