Ustawienie poziomego ScrollBar w DBGrid

0

Cześć, po raz kolejny. Szukałem w necie, ale zakończyło się fiaskiem.

Jeszcze raz opiszę po krótce problem.
Mam tyle kolumn w Gridzie, że pojawia się poziomy pasek. I teraz, przeciągam go np. do połowy. I klikam na inny rekord. Naturalne działanie jest takie(przy RowSelect = true), że automatycznie scroll schodzi do zera, żeby pokazać pierwszą kolumnę. A ja nie chcę, żeby scroll mi się przesunął. Więc w BeforeScroll pobieram sobie jego pozycję za pomocą:

FScrollPos:=GetScrollPos(Grid.Handle, SB_HORZ);

I w OnMouseUp grida chcę go ponownie ustawić:
SetScrollPos(Grid.Handle, SB_HORZ, FScrollPos, true);

Efektem tego działania jest to, że owszem scroll sam w sobie ustawia się na odpowiednią pozycję, ale zawartość grida się nie przesuwa. Czyli w najgorszym wypadku scroll jest ustawiony najbardziej w prawo, a w gridzie widać pierwszą kolumnę.
Jak to można poprawić?

0
  1. lepiej zrób to w MouseDown, MouseUp.
  2. po odtworzenu pozycji scrolla zapodaj Invaliadte kontrolki.
0

W MouseDown i Up próbowałem najpierw. Ale się okazało, że OnMouseDown dzieje się za późno i w tym momencie scroll ma już pozycję zero.

Teraz ustawiam scrolla wysyłając komunikat WM_HSCROLL z wParam = (FScrollPos shl 16) or SB_THUMBPOSITION

I działa, ale problem jest taki, że widać za bardzo SKOK. Tzn. że zawartość grida idzie na początek, a dopiero potem w odpowiednie miejsce. To widać naprawdę bardzo mocno. Może MouseUp też jest złym zdarzeniem. Ale jeśli tak, to gdzie to ustawiać?

[dopisane]
OK, rozkminiłem to tak. Kod do ustawiania pozycji scrollBara wstawiłem do OnMouseDOWN. Sprawiło to, że miganie nie jest takie wielkie. Próbowałem dodać też DoubleBuffered, ale to nic nie dało. Miganie nadal jest, ale już dużo mniejsze i nie tak uciążliwe.

0

Ostatecznie, jeśli się nic odpowiedniego nie da zrobić, to użytkownik może przeciągnąć sobie kolumnę po jej nagłówku (nie wymaga to kodowania) i ustawić ją najbardziej na lewo (da się nawet zapamiętać pozycje poprzesuwanych kolumn i zapisać do pliku DBGrid.Columns.SaveToFile i odtworzyć ją przy ponownym starcie programu). Następnie już może normalnie przewijać w pionie, bo ta kolumna, już jako pierwsza z lewej, nie wymaga przewijania w poziomie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1