No możliwe, że nic nie ma, ale wcześniej napisałeś: pierwsza widoczna kolumna siedzi we właściwości LeftCol - nadanie jej wartości zmienia widok;
No bo zmienia, tyle że trzeba jej nadać indeks istniejącej kolumny, a nie indeks nieistniejącego wiersza :]
Faktycznie nie wspomniałem o tym, że szerokości kolumn są różne (wiersze takie same) bo nie sądziłem, że scrolling (czy widok) może brać ten parametr pod uwagę.
Miło wiedzieć, że na próżno się odpowiadało; BTW - przewijanie działa "płynnie" na zasadzie skoków, które wynoszą tyle, ile wynosi szerokość kolumny (HScroll
) lub wysokość wiersza (VScroll
);
W takim razie - skoro szerokości kolumn mogą być różne - niżej podaję rozwiązanie dla komponentu, który może zawierać kolumny o różnych szerokościach; Brane pod uwagę jest kilka elementów - liczba stałych (fixed
) kolumn, które zawsze widoczne są w komponencie, grubość linii siatki oraz szerokość klienta, czyli szerokość wnętrza komponentu, bez szerokości pionowego paska przesuwu;
Kopiuj
procedure TForm1.btnShowLastColumnsClick(Sender: TObject);
var
intGridLineWidth, intColWidths, intCurrColWidth, intColIdx: Integer;
begin
if Grid.ColCount - Grid.FixedCols > 0 then
begin
intGridLineWidth := Grid.GridLineWidth;
intColWidths := 0;
for intColIdx := 0 to Grid.FixedCols - 1 do
Inc(intColWidths, Grid.ColWidths[intColIdx] + intGridLineWidth);
if intColWidths <= Grid.ClientWidth then
begin
intColIdx := Grid.ColCount - 1;
Inc(intColWidths, Grid.ColWidths[intColIdx] + intGridLineWidth);
while (intColIdx >= Grid.FixedCols) and (intColWidths < Grid.ClientWidth) do
begin
intCurrColWidth := Grid.ColWidths[intColIdx - 1] + intGridLineWidth;
if intColWidths + intCurrColWidth <= Grid.ClientWidth then
begin
Inc(intColWidths, intCurrColWidth);
Dec(intColIdx);
end
else
Break;
end;
Grid.LeftCol := intColIdx;
end;
end;
end;
Pokrótce wytłumaczę jak to działa - pierwszy warunek sprawdza, czy oprócz FixedCols
są jeszcze jakieś kolumny - jeżeli nie to reszta kodu jest pomijana; Następnie pobierana jest grubość siatki; Kolejny krok to zliczenie szerokości wszystkich FixedCols
, razem z GridLineWidth
; Drugi warunek sprawdza, czy obliczona szerokość jest mniejsza od dostępnej szerokości komponentu (bez pionowego scrollbara) i jeśli tak - idziemy dalej; Kolejnym krokiem jest pobranie indeksu ostatniej kolumny oraz zwiększenie łącznej szerokości (intColWidths
) o szerokość ostatniej kolumny + grubość linii siatki; Ostatni krok to pętla While - w niej sumowane są szerokości kolumn od końca (oprócz ostatniej) do momentu, aż szerokość kolumny o indeksie intColIdx
dodana do łącznej szerokości będzie większa od ClientWidth
; Jeśli będzie większa, szerokość tej kolumny nie zostanie dodana, a indeks intColIdx
nie zostanie zdekrementowany; Ostatnim krokiem jest wpisanie wartości zmiennej intColIdx
do właściwości LeftCol
;
W testach powyższy kod wypada idealnie (co do piksela), jednak możliwe, że coś przeoczyłem; W razie, gdyby coś jeszcze nie było zabezpieczone - można pododawać warunki; W załączniku GridCols.zip aplikacja do przetestowania - plik wykonywalny, który według testów działa dobrze, a także źródła do skompilowania programu pod Delphi7;
Panowie z tego co widzę LeftCol=5 przylepia 5tą kolumnę do 1szej a reszta znika.
Nic podobnego - FixedCols
i FixedRows
zawsze są widoczne, natomiast LeftCol
oznacza pierwszą widoczną kolumnę ze standardowo białymi komórkami, zaraz obok ostatniej FixedCols
;
Mi chodzi o inny efekt kiedy jest przeciążenie okienka wierszami i mamy ich np: 100, które trzeba przewijać. Problem teraz w tym jak podwinąć wiersze do góry by np: pokazane były wiersze od od 80 do 100(koniec) a nie początek, który mieści po 20 wierszy i wyświetla je od 1 do 20...
Napisz to jeszcze raz, bo Bóg jeden wie co masz na myśli...