Mouse wheel, grid and hidden rows

0

Witam!
Mam taki problem, gdy używam kółka w myszy do przewijania DrawGrida w górę i w dół, kursor (podświetlony wiersz) przesuwa się o jeden wiersz w górę lub w dół przy każdym impulsie z kółka. Problem w tym, że wybrane wiersze mam ukryte i jeżeli przewijam przez taki wiersz, kursor "wchodzi do niego" i też staje się niewidoczny, podczas gdy ja chciałbym by ukryte wiersze niejako "przeskakiwał", czyli by kursor przewijał się tylko przez wiersze widoczne.
Nie mam pomysłu jak problem rozwiązać, a wujek google wydaje się być w tej kwestii bardzo skąpy.
Proszę o jakieś pomysły ewentualnie gotowy kod.
Krzysztof

0

miałem ten sam problem - rozwiązałem go tak, że przy przechodzeniu wiersz nizej/wyżej sprawdzamy czy jego wysokość =0, jeśli tak, to przechodzimy wyżej/nizej i w pętli znów sprawdzamy.

0

Też myślę o takim rozwiązaniu ale jak to sprawdzasz?
W D7 kółko nie było obsługiwane poprawnie w gridach i korzystałem z takiego rozwiązania http://delphi.about.com/cs/adptips2002/a/bltip1102_3.htm które raz zaimplementowane przy starcie aplikacji obsługiwało **wszystkie **gridy w aplikacji. W DXE2 zrezygnowałem z niego, gdyż kółko jest już obsługiwane. Chodzi więc o to jak przechwycić i poprawnie obsłużyć komunikat mousewheel, dla konkretnego grida.
Pozdrawiam,
Krzysztof

0
procedure TForm1.logiMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
var
i:integer;
begin
 for i:=logi.Row+1 to logi.RowCount-1 do if logi.RowHeights[i]<>0 then  begin logi.Row:=i; break end;
 Handled:=true;
end;

procedure TForm1.logiMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
var
i:integer;
begin
 for i:=logi.Row-1 downto 0 do if logi.RowHeights[i]<>0 then begin logi.Row:=i; break end;
 Handled:=true;
end;

na Delphi6 działa bez problemu.

0

Żeby Tobie nie chciało się sformatować kodu.....

procedure TForm1.LogiMouseWheelDown(Sender: TObject; Shift: TShiftState;
                                    MousePos: TPoint; var Handled: Boolean);
var
  I: Integer;
begin
  for I := Logi.Row + 1 to Logi.RowCount - 1 do
    if Logi.RowHeights[I] <> 0 then
    begin
      Logi.Row := I;
      Break;
    end;

  Handled := True;
end;

procedure TForm1.LogiMouseWheelUp(Sender: TObject; Shift: TShiftState;
                                  MousePos: TPoint; var Handled: Boolean);
var
  I: Integer;
begin
  for I := Logi.Row - 1 downto 0 do
    if Logi.RowHeights[I] <> 0 then
    begin
      Logi.Row := I;
      Break;
    end;

  Handled := True;
end;

Nieładnie...

0

Dzięki misiakufal!
Działa świetnie. Na XE2 przesiadłem się z D7 stosunkowo niedawno. Tam nie było takiego eventu jak OnMouseWheelDown. Nawet nie zauważyłem, że w XE2 już jest.
Pozdrawiam,
Krzysztof

0
krzynio napisał(a)

Tam nie było takiego eventu jak OnMouseWheelDown. Nawet nie zauważyłem, że w XE2 już jest.

Eee...? Jak to nie ma:

ObjInspector.png

Chyba, że ja mam jakieś dziwne te kontrolki... Wszystko jest, wystarczyło sprawdzić zanim się napisało;

0

Furious Programming
Przywykłem pisać krótkie i nieskomplikowane kawałki kodu w 1 linii. Oczywiscie jak cos jest trudnieszego, to wcięcia się pojawiają. Może to złe podejście, ale stosuje je tam, gdzie kod jest prosty.

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