【问题标题】:Creating Controls in a TScrollBox at Runtime Starts to ReOrder在运行时在 TScrollBox 中创建控件开始重新排序
【发布时间】:2022-01-13 15:45:46
【问题描述】:

我正在使用 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 中做了一些非常相似的事情,创建过程总是将最后一个标签放在顶部。

tia

【问题讨论】:

  • 我遇到了类似的行为,但我不得不使用一种解决方法。我已经设置了新组件 alBottom 然后 alTop 的对齐方式。

标签: delphi firemonkey delphi-10.1-berlin scrollbox


【解决方案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;

【讨论】:

  • 感谢您的回复。这个“lbFileDate.Position.Y := 1E10;”似乎解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2011-01-02
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多