我在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;
答案 0 :(得分:2)
您的控件直接由表单作为父级。而是创建一个alClient
对齐的面板,并将面板的Parent
设置为表单。
创建编辑控件时,请将Parent
作为面板。如果要隐藏编辑控件,请隐藏面板。
如果您不想或不能做出如此大的改动,那么您可以使用BeginDeferWindowPos
,DeferWindowPos
和EndDeferWindowPos
批量处理更改。您可能会在这些行中包含代码:
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;
显然,您将使用不同的机制来获取窗口句柄,但我不认为这会影响此示例。