Delphi:在表单中隐藏/显示TWinControl对象非常慢。如何加快速度?

时间:2015-08-26 11:31:55

标签: performance delphi vcl

我在Delphi XE5中有简单的VCL表单应用程序。在主要形式中,有许多TEdit组件。现在我意识到设置所有这些编辑的可见性非常慢。隐藏/显示它时,我的计算机需要大约1秒钟。

请注意,此示例仅用于说明问题。我知道这可以通过向面板插入编辑并隐藏/显示面板来解决。但是在我们的应用程序中,这是不可能的,其中编辑由最终用户插入到表单中。此外,我们也不知道哪些编辑可见性将受到控制。

如何加快速度?

请注意,当我使用TLabel(TGraphicControl)而不是TEdit(TWinControl)时,它很快!

procedure TForm1.CheckBox1Click(Sender: TObject);
var
  C: TControl;
  i: Integer;
begin
  for i := 0 to ControlCount - 1 do
  begin
    C := Controls[i];
    if C.ClassName <> 'TCheckBox' then
      C.Visible := CheckBox1.Checked;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  C: TEdit;
  i: Integer;
  j: Integer;
begin
  for i := 0 to 60 do
    for j := 0 to 20 do
    begin
      C := TEdit.Create(Self);
      C.Width := 40;
      C.Left := 20 + 50 * j;
      C.Top := 50 + 25 * i;
      C.Parent := Self;
    end;
end;

1 个答案:

答案 0 :(得分:2)

您的控件直接由表单作为父级。而是创建一个alClient对齐的面板,并将面板的Parent设置为表单。

创建编辑控件时,请将Parent作为面板。如果要隐藏编辑控件,请隐藏面板。

如果您不想或不能做出如此大的改动,那么您可以使用BeginDeferWindowPosDeferWindowPosEndDeferWindowPos批量处理更改。您可能会在这些行中包含代码:

const
  Flags = SWP_NOZORDER or SWP_NOOWNERZORDER or SWP_NOACTIVATE or SWP_NOSIZE or 
    SWP_NOMOVE or SWP_HIDEWINDOW;
var
  i: Integer;
  wpi: HDWP;
  wnd: HWND;
begin
  wpi := BeginDeferWindowPos(10);
  Win32Check(wpi <> 0);
  Try
    for i := 1 to 10 do begin
      wnd := (FindComponent('Edit' + IntToStr(i)) as TWinControl).Handle;
      Win32Check(DeferWindowPos(wpi, wnd, 0, 0, 0, 0, 0, Flags) <> 0);
    end;
  Finally
    Win32Check(EndDeferWindowPos(wpi));
  End;
end;

显然,您将使用不同的机制来获取窗口句柄,但我不认为这会影响此示例。