gpt4 book ai didi

performance - Delphi:以表单隐藏/显示TWinControl对象非常慢。如何使其更快?

转载 作者:行者123 更新时间:2023-12-03 18:35:48 25 4
gpt4 key购买 nike

我在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;

最佳答案

您的控件直接由表单作为父项。而是使用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;


显然,您将使用其他机制来获取窗口句柄,但我认为这不会损害本示例。

关于performance - Delphi:以表单隐藏/显示TWinControl对象非常慢。如何使其更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32225483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com