Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2020, 13:07   #11
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

сделал вот так:
Код:
  ScrollBar1.Max := (cubeHeight + gap) * RowsCount;
  ScrollBar1.PageSize := pnl1.Height;
Тогда скроллбар выглядит и таскается нормально. Но если нажимать на нижнюю стрелочку, то прокрутка идёт дальше, хотя визуально видно, что дальше некуда.
Такое впечатление, что не хватает каких-то свойств или какие-то свойства не настроены или работают не правильно.
BLACK_RAIN вне форума Ответить с цитированием
Старый 26.09.2020, 10:06   #12
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Но если нажимать на нижнюю стрелочку, то прокрутка идёт дальше, хотя визуально видно, что дальше некуда.
А если сделать, чтобы диапазон прокрутки соответствовал реальности, то тогда размер ползунка получается не правильный.
Никто не расскажет, как сделать правильно?
BLACK_RAIN вне форума Ответить с цитированием
Старый 26.09.2020, 12:57   #13
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Кажется, что проблема решена при помощи костыля
Код:
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
  if ScrollBar1.Position > ScrollBar1.Max - Panel1.Height then
  ScrollBar1.Position := ScrollBar1.Max - Panel1.Height;
  SortBlocks;
end;
на WinAPI эта проверка, почему-то, делается автоматически.
Вот полный код с исправлениями:
Код:
procedure TForm1.SortBlocks;
const
  gap = 4;
var
  i,n,xStart,x,y, PerRow, RowsCount, BlocksCount : Integer;
begin
  PerRow := Trunc(Panel1.Width / (BlockWidth + gap));
  if PerRow = 0 then
  PerRow := 1;
  BlocksCount := Length(ar);
  if BlocksCount mod PerRow = 0 then
  RowsCount := trunc(BlocksCount / PerRow) else
  RowsCount := trunc(BlocksCount / PerRow) + 1;
  i := (BlockHeight + gap) * RowsCount;
  if i > Panel1.Height then
  begin
    ScrollBar1.Max := i;
    ScrollBar1.PageSize := Panel1.Height;
    ScrollBar1.LargeChange := Panel1.Height;
    ScrollBar1.Enabled := True;
  end else
  begin
    ScrollBar1.Position := 0;
    ScrollBar1.Enabled := False;
  end;
  xStart := Round((Panel1.Width div 2) - (((BlockWidth + gap) * PerRow) div 2));
  x := xStart;
  y := -BlockHeight - gap;
  for i := 0 to BlocksCount - 1 do
  begin
    if i mod PerRow = 0 then
    begin
      inc(y, BlockHeight + gap);
      x := xStart;
    end;
    ar[i].Top := y - ScrollBar1.Position;
    ar[i].Left := x;
    inc(x, BlockWidth + gap);
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i, BlocksCount : Integer;
begin
//  Randomize;
  BlockWidth := 100;
  BlockHeight := 100;
//  BlocksCount := Random(400);
  BlocksCount := 21;
  SetLength(ar, BlocksCount);
  for I := 0 to BlocksCount - 1 do
  begin
    ar[i] := TPanel.Create(nil);
    ar[i].Parent := Panel1;
    ar[i].Font.Size := 12;
    ar[i].Caption := IntToStr(i + 1);
//    ar[i].Left := 0;
//    ar[i].Top := i * BlockHeight;
    ar[i].Width := BlockWidth;
    ar[i].Height := BlockHeight;
    ar[i].ParentColor := False;
    ar[i].Color := RGB(Random(255), Random(255), Random(255));
  end;
  Panel1.ParentColor := False;
  Panel1.Color := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i : Integer;
begin
  for I := 0 to Length(ar) - 1 do
    ar[i].Free;
end;

procedure TForm1.FormResize(Sender: TObject);
var
  n : Integer;
begin
  ScrollBar1.Left := Width - 40;
  ScrollBar1.Top := 0;
  ScrollBar1.Height := Height - 40;

  Panel1.Width := Width - 44;
  Panel1.Height := Height - 40;

  if ScrollBar1.Position >= ScrollBar1.Max - Panel1.Height then
  begin
    n := ScrollBar1.Max - ScrollBar1.Position;
    if Panel1.Height > n then
    ScrollBar1.Position := ScrollBar1.Position - (Panel1.Height - n);
  end;
  SortBlocks;
  Caption := IntToStr(ScrollBar1.Position) + ' / ' + IntToStr(ScrollBar1.Max) +
    ' / ' + IntToStr(Panel1.Height) + ' / ' + IntToStr(n);
end;

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
  if ScrollBar1.Position > ScrollBar1.Max - Panel1.Height then
  ScrollBar1.Position := ScrollBar1.Max - Panel1.Height;
  SortBlocks;
  Caption := IntToStr(ScrollBar1.Position) + ' / ' + IntToStr(ScrollBar1.Max);
end;
Однако, всё-равно остался глюк с неправильным миганием сколлинга. Он мигает не в том месте.

Последний раз редактировалось BLACK_RAIN; 26.09.2020 в 15:20.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не знаю как правильно сделать задания. Питон Kirkkki Помощь студентам 1 17.09.2020 01:13
Как это делать? АндрейН C# (си шарп) 1 14.09.2020 18:36
Как правильно подобрать жесткий диск? Shved77 Компьютерное железо 23 24.02.2010 14:33
Как изменить размер выделеного текста в twebbrowser правильно pervii Мультимедиа в Delphi 0 08.02.2010 09:09
Как правильно задать размер TextBox-a? Diego__ Microsoft Office Word 3 02.09.2009 11:27