#delphi #firemonkey #delphi-10.1-berlin #scrollbox
#дельфи #огненный ключ #дельфи-10.1-берлин #окно прокрутки
Вопрос:
Я использую Delphi 10.1 и Firemonkey и хочу добавить элементы управления в TScrollBox во время выполнения и столкнулся с некоторыми странными поведениями.
Для этого примера я создаю метки и добавляю их в поле TScroll.
Метка установлена как TAlignLayout.Сверху, поэтому я предполагаю, что каждая новая созданная метка будет располагаться ниже предыдущей.
- Первая созданная метка идет наверх.
- Вторая метка, которая создается, идет ниже первой.
- Третья создаваемая метка проходит между первой и второй метками.
- Любые другие созданные метки затем складываются под Первой меткой.
Я хочу, чтобы ярлыки создавались сверху вниз в порядке создания. Есть идеи, что я сделал не так?
Это код для создания меток:-
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. Я сталкивался с подобным поведением, но мне пришлось использовать обходной путь. Я установил выравнивание нового компонента alBottom, а затем alTop.
Ответ №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;
Комментарии:
1. Спасибо за ответы. Это «lbFileDate. Позиция. Y := 1E10;» похоже, проблема решена.