CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - DBGrid - przewijanie rekordów Mouse Wheel
Strona 1 z 1

DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: piątek, 3 czerwca 2011, 10:48
przez butchermw
Witam,

Mam mały problem z obiektem DBGrid w Builder C++, problem dotyczy przewijania rekordów "kółkiem w myszce" tz. mam załadowanego DBGrid-a danymi i po przesunięciu scroll-em rekordów w górę lub w duł strony z rekordami się nie przewijają - chodzi o to ze zaznaczenie rekordu przesuwa się na samą górę lub duł obszaru DBGrid-a i nie chce pokazać pozostałych danych które są po za tym obszarem. Bardzo proszę o pomoc bo przyznam że jest to dość uciążliwe w użytkowaniu większej ilości rekordów :)

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: piątek, 3 czerwca 2011, 11:00
przez Cyfrowy Baron
Opisz jaśniej, pokaż jakiegoś screena bo nie rozumiem w czym problem.

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: piątek, 3 czerwca 2011, 11:15
przez butchermw
chodzi o to że podczas przewijania rekordów myszką(scrollem) to przesuwa się to szare zaznaczenie wiersza w obszarze tylko tym co jest widoczny, przykładowo przewijam kółko w górę i szare zaznaczenie idzie na samą górę okna DBGrid ale nie przesunie się strona tak by zobaczyć wcześniejsze rekordy...

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: piątek, 3 czerwca 2011, 11:21
przez Cyfrowy Baron
Rozumiem! By to zmienić musiałbyś chyba w opcjach dla DBGrid wyłączyć zaznaczanie całego wiersza.

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: piątek, 3 czerwca 2011, 15:34
przez butchermw
Niestety ale to nie to, musi być jakiś inny sposób. Zauważyłem że podczas przekręcania scrollem zmienia się tylko szare zaznaczenie wiersza ale punkt edycji wiersza(taka strzałka po lewej) stoi w miejscu, natomiast gdy przesyłam strzałkami na klawiaturze to wszystko jest ok (zmienia się zaznaczenie po lewej i kolor wiersza)

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: sobota, 4 czerwca 2011, 08:20
przez Cyfrowy Baron
Przeprowadź testy zmieniając inne opcje komponentu w sekcji Options.

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: sobota, 4 czerwca 2011, 13:27
przez Corvis
Sprawdź tutaj:

http://www.experts-exchange.com/Program ... 90770.html

W Delphi ale można dojść o co chodzi.

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: sobota, 4 czerwca 2011, 14:35
przez Cyfrowy Baron
Strona podana przez Corvis'a ma płatny dostęp, więc za darmo z niej nie skorzystasz. Poza tym sposób polegający na wykorzystaniu przechwytywania komunikatów nie jest tutaj akurat najlepszy.

Proste rozwiązanie. Tworzysz dla obiektu DBGrid1 trzy zdarzenia OnMouseMove, OnMouseWheelDown i OnMouseWheelUp, a następnie umieszczasz w nich taki kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::DBGrid1MouseMove(TObject *Sender, TShiftState Shift,
                int X, int Y) /* OnMouseMove */
{
  if(GetFocus() != DBGrid1->Handle)
  {
   DBGrid1->SetFocus();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DBGrid1MouseWheelDown(TObject *Sender, TShiftState Shift,
          TPoint &MousePos, bool &Handled) /* OnMouseWheelDown */
{
 DBGrid1->Perform(WM_VSCROLL, 1, 0);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::DBGrid1MouseWheelUp(TObject *Sender, TShiftState Shift,
          TPoint &MousePos, bool &Handled) /* OnMouseWheelUp */
{
 DBGrid1->Perform(WM_VSCROLL, 0, 0);
}


Ten kod działa u mnie prawidłowo. Niestety nie wiem, czy w Twojej wersji środowiska występuje metoda GetFocus(), oraz czy TDBGrid obsługuje zdarzenia OnMouseWheel... Jeżeli nie to podaj co nie działa, a poszukam innego rozwiązania.

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: sobota, 4 czerwca 2011, 15:38
przez Corvis
Baronie jak płatna. Przewiń w dół i będzie kod :-)

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: sobota, 4 czerwca 2011, 17:07
przez Cyfrowy Baron
U mnie wygląda to tak:

Mouse-wheel-on-dbgrid-_-delphi,-dbgrid,-mouse,-wheel.png

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: sobota, 4 czerwca 2011, 22:26
przez butchermw
Niestety ale nic z tego, w mojej wersji Buildera nie ma obsługi OnMouseMove, OnMouseWheelDown i OnMouseWheelUp. Szczerze to mnie trochę zdziwiło że nie ma obsługi scrolla w DBGrid, co tak naprawdę powinno być automatycznie zrobione tak jak to choćby jest w VB, zastanawiam się jeszcze nad skompilowaniem kodu w nowszej wersji Buildera, bo mam do niej dostęp. Co wy na to, może to coś pomóc??

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: niedziela, 5 czerwca 2011, 07:44
przez Cyfrowy Baron
A czy masz zdarzenie OnMouseWheel... dla formularza?



Póki co mogę Tobie zaproponować tylko rozwiązanie wykorzystujące komponent TApplicationEvents (zakładka Additionals):

Umieść na formularzu komponent ApplicationEvents1. Utwórz mu zdarzenie OnMessage, a potem umieść w nim ten kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
 static TPoint cPoint;
 static TRect wRect;

 if(Msg.message == WM_MOUSEMOVE)
 {
  GetCursorPos(&cPoint);

  GetWindowRect(DBGrid1->Handle, &wRect);
 }

 int left = cPoint.x;
 int top  = cPoint.y;

 if(Msg.message == WM_MOUSEWHEEL)
 {
  if( left > wRect.left && left < wRect.right &&
          top  > wRect.top  && top  < wRect.bottom)
  {
   if( (short)HIWORD(Msg.wParam) > 0) DBGrid1->Perform(WM_VSCROLL, 0, 0);
   if( (short)HIWORD(Msg.wParam) < 0) DBGrid1->Perform(WM_VSCROLL, 1, 0);
  }
 }
}

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: niedziela, 5 czerwca 2011, 18:30
przez butchermw
Dzięki wielkie za pomoc, jeśli nie ma innego sposobu to może tak zostać jak najbardziej.

A jeśli chodzi o zdarzenie OnMouseWheel dla formularza to mam możliwość wykorzystania.

Re: DBGrid - przewijanie rekordów Mouse Wheel

Nowy postNapisane: niedziela, 5 czerwca 2011, 20:18
przez Cyfrowy Baron
butchermw napisał(a):A jeśli chodzi o zdarzenie OnMouseWheel dla formularza to mam możliwość wykorzystania.


Miałem z tym pewien pomysł, ale nie działa dobrze, więc musi zostać z ApplicationEvents.