Delphi 10.1 Firemonkey Создание элементов управления в TScrollBox во время выполнения запускает повторный заказ

Я использую Delphi 10.1 и Firemonkey и хочу добавить элементы управления в TScrollBox во время выполнения и столкнулся с некоторыми странными действиями.

В этом примере я создаю метки и добавляю их в поле TScroll.

Метка установлена ​​как TAlignLayout.Top, поэтому я предполагаю, что каждая новая созданная метка будет располагаться ниже предыдущей.

  • Первый созданный ярлык идет вверх.
  • Второй созданный ярлык располагается ниже первого.
  • Третья создаваемая метка находится между первой и второй метками.
  • Любые другие ярлыки, которые были созданы, затем складываются под первым ярлыком.

Я хочу, чтобы ярлыки создавались сверху вниз в порядке создания. Есть идеи, что я сделал не так?

Это код для создания ярлыков: -

      procedure TForm1.Button4Click(Sender: TObject);
var
  lbFileDate: TLabel;
begin
  ScrollBox2.BeginUpdate;
  lbFileDate := TLabel.Create(ScrollBox2);
  lbFileDate.Parent := ScrollBox2;
  lbFileDate.Align := TAlignLayout.Top;
  lbFileDate.Text := DateTimeToStr(Now);
  ScrollBox2.EndUpdate;
end;

Я сделал что-то очень похожее в Delphi 10.1 VCL, и процесс создания работает, всегда помещая последнюю метку наверх.

тиа

1 ответ

Похоже, что для уже размещенных элементов управления любые дополнительные элементы управления перемещаются туда, где их можно втиснуть в зависимости от их координат, которые по умолчанию равны 0,0. Вы можете дать новому элементу управления большой yпоэтому он начинается под остальными. Прежде чем они будут размещены, как внутри блока обновления начала/конца, они могут быть размещены друг над другом и будут размещены в соответствии с порядком создания.

      procedure TForm1.Button1Click(Sender: TObject);
var
  lbFileDate: TLabel;
begin
  ScrollBox2.BeginUpdate;
  for var I : integer := 1 to 10 do
  begin
    lbFileDate := TLabel.Create(ScrollBox2);
    lbFileDate.Parent := ScrollBox2;
    lbFileDate.Position.Y := 1E10;
    lbFileDate.Align := TAlignLayout.Top;
    lbFileDate.Text := DateTimeToStr(Now) + ' ' + IntToStr(I);
  end;
  ScrollBox2.EndUpdate;
end;
Другие вопросы по тегам