Полоса прокрутки в DBGrid

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Есть подозрение, что плавность прокрутки пропорциональна числу строк в таблице :)
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Дрей, то была не ирония (тем более не желание пофлеймить, Боже упаси!), а просто дружеская улыбка. Коль скоро возникли такие подозрения, значит она была неуместной, за что приношу свои извинения.

По существу есть вопросы?
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Ну вот насколько приятнее отвечать на четко сформулированный вопрос! Сам я не использую 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 на нечто подобное:

Код: Выделить всё

procedure TMyDBGrid.WMVScroll(var Message: TWMVScroll);
begin
  with Message do
    if ScrollCode = SB_THUMBTRACK     // Здесь может быть любой код,
      ScrollCode := SB_THUMBPOSITION; // реализующий реакцию на SB_THUMBTRACK
  inherited WMVScroll(Message);
end;
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

это LOWORD(wParam) для WM_VSCROLL, а в HIWORD(wParam) - current position (только для SB_THUMBPOSITION и SB_THUMBTRACK)
Ответить