1

在我的应用程序中,我使用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;

禁用和启用TScrollBox.Visiblebefore 和 aftel 循环无效。

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

更新:大量意味着大约 500 件物品。

4

2 回答 2

3

使用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;

在此处输入图像描述

于 2012-05-02T11:00:16.573 回答
0

如果您只是创建 20 TLabel,添加 anApplication.Processmessages不是一个好主意,因为它会重新绘制它以立即显示新添加的组件...

使用常规应用程序,生成 2000 只需要不到 1 秒的时间TLabel……如果我设置自定义样式,则需要更长的时间……也许,这是你的问题……

因此,为了快速生成一代,我这样做了:

uses ...,  System.StrUtils, System.Diagnostics, Vcl.Themes, Vcl.Styles;


procedure TForm3.GenerateLabels(bNoStyle: Boolean);
var
  iLoop, iMax: Integer;
  aLabel     : TLabel;
  pointLeft  : Integer;
  pointTop   : Integer;
  timeSpent  : TStopwatch;
begin
  iMax      := 2000;
  pointLeft :=  3;
  pointTop  :=  3;
  timeSpent := TStopwatch.StartNew;     // how long does it take
  if bNoStyle then
    TStyleManager.TrySetStyle('Windows'); // = no style
  for iLoop := 1 to iMax do
  begin
    Application.ProcessMessages;
    // creating a labels in loop
    aLabel:=TLabel.Create(Self);
    labels.Add(aLabel); // TList for managing.
    with aLabel do
    begin
      Left    := pointLeft;
      Top     := pointTop;
      Caption := 'title';
      parent  := scrlbx1; //TScrollBox
    end;
    pointTop  := pointTop + 20;
  end;
  if bNoStyle then
    TStyleManager.TrySetStyle('Carbon');  // previous style
  labels[0].Caption := IfThen(bNoStyle, 'No style', 'Style');
  labels[1].Caption := IntToStr(timeSpent.ElapsedMilliseconds) + 'ms';   // display the spent time
  labels[2].Caption := IntToStr(labels.Count);
  timeSpent.Stop;
end;

有格调 如果我停用样式

于 2012-05-02T08:35:29.983 回答