Scroll myszki a DBGrid

0

Przeglądnąłem forum, ale niestety nie znalazłem odpowiedzi na "wkurzający" problem w Delphi 7:
Może ktoś z Was miał kłopot i znalazł rozwiązanie. Proszę o pomoc.
Na formatce mam komponent DBGrid z aktywnymi rekordami tabeli bazy danych.
Po lewej stronie komponentu DBGrid jak wiadomo znajduje się znacznik (trójkącik), który wskazuje rekord
aktualny (bez trybu mulitiselekt, gdzie może być ich więcej).
Jeśli klikam myszką to zmieniam rekord aktywny (przesuwa się zarówno RowSelect jak i wspomniany znacznik). Natomiast jeśli używam kółka myszki (scroll'a) to RowSelect (podświetlana belka) przechodzi na kolejne rekordy, ale zaznaczony jest cały czas ten sam aktywny rekord.
W rezultacie wszystkie operacje dotyczą rekordu aktywnego a nie tego, który jest aktualnie podświetlony. Tworzy to taki efekt rozjeżdżania się i użytkownik głupieje bo nie wie dlaczego operacje dotyczą innego rekordu niż zaznaczony przez RowSelect.
Moim zdaniem coś jest skopane w komponencie DBGrid Delphi7 bo w Delphi3 nie było tego problemu.
Sądzę, że rozwiązaniem byłoby wyłączenie kółka scroll'a w myszce. Tylko ja to zrobić?
Jak wyłączyć kółko scroll'a w myszce, a potem je załączyć?
Bardzo proszę o podpowiedź.

0

przechwycic komunikat WM_WHEEL (czy jakos tak) i go zablokowac.
nie znam dbGrid'a ale nasuwa sie jedno pytanie: czy nie mozna w czasie scrollowania programowo przesuwac tego trojkacika?

0

Mylisz sie kolego zarowno zaznaczenie jak i uzycie scrolla powoduje zmiane aktywnego rekordu. Jesli zaznaczysz sobie rekord nr 3 a nastepnie przeskrolujesz go od 6 rekordu to aktywnym rekordem bedzie rekord nr 6 a nie rekord numer 3 jesli masz problem z wyswietlaniem to ustaw rowselect oraz allwaysshowselection w opcjach dbgrid na true

0

cimak : przesunąć "trójkącik" dla się programowo, ale niestety przykorzystaniu ze scroll'a nie generuje się żadne zdarzenie do obsłużenia, które zwracałoby informacje, gdzie RowSelect (belka) jest aktualnie przesunięta :( Pewno przechwycenie komunikatu mogłoby pomóc, tylko nie mam pojęcia jak to zrobić.

woolfik : Nie myle się, jest tak jak piszę, przynajmniej w Delphi 7. Sprawdzałem w ten sposób, że przesunąłem scroll'em RowSelect (belkę) na inny rekord niż zaznaczony przez "trójkącik" i ustawiłem zdarzenie OnDblClick tak, że pokazywał komunikat z ID rekordu. Zawsze pokazywane jest ID rekordu aktywnego (a więc tego gdzie znajduje się "trójkącik") a nie aktualnie przesuniętego przez scroll'a. :(
Ustawienie opcji dbgrid'a wskazanych przez Ciebie jak też innych niestety nic nie pomaga :( To bardzo upierdliwy problem.

0

Chcesz powiedziec ze masz dbgrida przewijasz go scrollem a podswietlony zostaje dalej ten rekord ktory zaznaczyles? poza tym aktywny record mozesz sprawdzic ustawiajac na zdarzeniu OnDataChange(czy jakos tak) komponentu TDataSource taki kod:

Self.Caption := qrNazwa.Fieldbyname('idx_recordu').AsString;

wtedy bedziesz mial pewnosc czy ci sie rekord zmienia czy nie

0

Poradziłem sobie "tymczasowo", do czasu znalezienia lepszego rozwiązania w ten sposób, że w zdarzeniu OnDrawColumnCell umieściłem kod :

if ((gdFocused in State) or (gdSelected in State)) and
   (Column.Field.DataSet.FieldByName('ID').AsString<>zmienna_pamietajaca_ID) then
   begin
    zmienna_pamietajaca_ID:=Column.Field.DataSet.FieldByName('ID').AsString;
    Query1.Locate('ID',zmienna_pamietajacaID);
   end;

Jednakże rozwiązanie przesłane przez b0bik'a znajdujące się adresem :

http://delphi.about.com/cs/adptips2002/a/bltip1102_3.htm

jest tym, o co mi chodziło (sednem sprawy). Przez takie "perełki" w programie siedzi się tracąc czas, który powienien być
poświęcony na główny algorytm programu :) No, ale jak pewno większość z Was nie lubię niedopracowanych programów.
W Delphi 3 problem nie wystąpił ponieważ nie było tam obsługi scroll'a myszki.
B0bik : Przyznaje, że szukałem w googl'ach, ale przeglądając jedynie strony polskojęzyczne.
WIELKIE DZIĘKI WSZYSTKIM ZA POMOC

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