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
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.
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
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.
Ż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...
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
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:
Chyba, że ja mam jakieś dziwne te kontrolki... Wszystko jest, wystarczyło sprawdzić zanim się napisało;
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.