Wzorując się na przykładzie: http://stackoverflow.com/questions/12304727/catching-listview-beginscroll-and-endscroll-events
zrobiłem coś takiego:
PreviousWndProc(Message);
case Message.Msg of
WM_VSCROLL:
begin
if TWMVScroll(Message).ScrollCode = SB_ENDSCROLL then
begin
if IsScrolling then
begin
IsScrolling := False;
DBGrid.DataSource.DataSet.AfterScroll := IBQNOTATKAAfterScroll;
DBGrid.DataSource.DataSet.AfterRefresh := IBQNOTATKAAfterScroll;
DBGrid.DataSource.DataSet.OnCalcFields := IBQNOTATKACalcFields;
DBGrid.DataSource.DataSet.EnableControls;
Application.ProcessMessages;
end;
end
else if (not IsScrolling) and (not DBGrid.DataSource.DataSet.ControlsDisabled) then
begin
IsScrolling := True;
DBGrid.DataSource.DataSet.DisableControls;
DBGrid.DataSource.DataSet.AfterScroll := nil;
DBGrid.DataSource.DataSet.AfterRefresh := nil;
DBGrid.DataSource.DataSet.OnCalcFields := nil;
end;
end;
end;
Generalnie chodzi o to, żeby podczas przeciągania scrollbara na DBGridzie nie odświeżać wszystkich widocznych wierszy bo to długo trwa (chcę na początku wyłączyć zdarzenia a po puszczeniu dopiero odświeżyć)
I jeśli przeciągam pasek góra/dół to działa dobrze.
Ale jak kliknę na belkę (a nie przeciągam) to działa nie całkiem dobrze.
scrollbar przesunie się trochę, ale grid pozostaje zablokowany. Czyli wywołała się ta dolna część kodu, ale ta górna (czyli SB_ENDSCROLL) już nie.
Co ciekawe kolejne kliknięcie na pasek wywołuje tylko górną część kodu i wtedy grid zostaje odblokowany. Ale tak nie może być.
Macie jakiś pomysł co można z tym zrobić?