在我的应用程序中,我使用TLabel对象运行时。

有一个问题:代表20个标签会花费很多时间(大约1-2秒)。

父组件上的DoubleBuffered没有帮助。 Application.ProcessMessages仅允许查看创建过程,而不查看冻结的窗口。

// creating a labels in loop
aLabel:=TLabel.Create(scrlbx);
labels.Add(aLabel); // TList for managing.
with aLabel do begin
Left:=pointLeft;
    Top:=pointTop;
    Caption:='title';
    parent:=scrlbx; //TScrollBox
end;
pointTop:=pointTop+20;


将父级从循环外分配到另一个循环后会产生一些效果,但并不能解决问题。

for I := 0 to labels.Count-1 do begin
    TLabel(labels[i]).Parent:= scrlbx;
end;


在aftel循环之前禁用和启用TScrollBox.Visible,并且aftel循环无效。

PS:
创建对象的时间不花时间。
瓶颈是父母分配。

upd:大量表示大约500个项目。

最佳答案

使用ScrollBox.DisableAlign.EnabledAlign

procedure TForm1.CreateLabels2;
var
  I: Integer;
  ALabel: TLabel;
  ATop: Integer;
begin
  ATop := 0;
  ScrollBox2.DisableAlign;
  for I := 0 to 2000 do
  begin
    ALabel := TLabel.Create(ScrollBox2);
    FLabels.Add(ALabel);
    with ALabel do
    begin
      Caption := 'Title';
      SetBounds(0, ATop, Width, Height);
      Parent := ScrollBox2;
    end;
    Inc(ATop, 20);
  end;
  ScrollBox2.EnableAlign;
end;

10-06 10:19