Performance Delphi:在表单中隐藏/显示TWinControl对象相当慢。如何让它更快?
我在DelphiXe5中有一个简单的VCL表单应用程序。在主要形式中,有大量的TEdit组件。现在我意识到设置所有这些编辑的可见性非常慢。当它们被隐藏/显示时,在我的计算机上大约需要1秒钟 请注意,此示例仅用于演示问题。我知道这可以通过向面板插入编辑并隐藏/显示面板来解决。但这在我们的应用程序中是不可能的,因为最终用户会将编辑插入表单。我们也不知道哪些编辑的可见性将被控制 如何让它更快 请注意,当我使用TLabel(TGraphicControl)而不是TEdit(TWinControl)时,速度很快Performance Delphi:在表单中隐藏/显示TWinControl对象相当慢。如何让它更快?,performance,delphi,vcl,Performance,Delphi,Vcl,我在DelphiXe5中有一个简单的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;
程序TForm1.CheckBox1Click(发送方:TObject);
变量
C:t控制;
i:整数;
开始
对于i:=0到ControlCount-1 do
开始
C:=对照[i];
如果C.ClassName“TCheckBox”,则
C.可见:=复选框1.选中;
结束;
结束;
过程TForm1.FormCreate(发送方:TObject);
变量
C:TEdit;
i:整数;
j:整数;
开始
对于i:=0到60 do
对于j:=0到20 do
开始
C:=TEdit.Create(Self);
C.宽度:=40;
C.左:=20+50*j;
C.顶部:=50+25*i;
C.父母:=自己;
结束;
结束;
您的控件由窗体直接作为父控件。相反,创建一个带有alClient
对齐的面板,并将面板的父级
设置为表单
创建编辑控件时,将其父控件设置为面板。如果要隐藏编辑控件,请隐藏面板
如果您不想或无法进行如此剧烈的更改,则可以使用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;
const
标志=SWP_NOZORDER或SWP_NOOWNERZORDER或SWP_NOACTIVE或SWP_NOSIZE或
SWP_NOMOVE或SWP_HIDEWINDOW;
变量
i:整数;
wpi:HDWP;
wnd:HWND;
开始
wpi:=BeginDeferWindowPos(10);
Win32Check(wpi0);
尝试
对于i:=1到10,开始
wnd:=(FindComponent('Edit'+IntToStr(i))作为TWinControl)。句柄;
Win32Check(windowpos(wpi、wnd、0、0、0、0、标志)0);
结束;
最后
Win32Check(endwindowpos(wpi));
结束;
结束;
显然,您将使用不同的机制来获取窗口句柄,但我不认为这会影响此示例。为什么不可能使用面板?您是否正确阅读了我的问题?@Sotirca,而不是
WM\u SETREDRAW
LockWindowUpdate
不用于此目的。IMHO,如果最终用户可以将编辑添加到表单中,您也可以将其添加到面板中……我想我做到了。我看不出让一个小组成为家长有什么困难。也许你需要敞开一点心扉。或者解释为什么这个选项真的不可能。除了你之外,没有人能理解为什么会这样。为人父母对我来说不是解决办法。我们不知道哪些编辑的可见性将被控制。问题并没有说清楚。无论如何,请使用WindowPos。谢谢。我刚刚更新了问题。对不起,我不知道如何在mys的情况下使用windowpos。你看过文档了吗?你有过Win32 API的使用经验吗?这里有一些讨论:显然你不是在移动窗口,而是在隐藏它们。因此,您需要使用这些标志来禁止移动、调整大小和z顺序更改。谢谢。我试试看,然后告诉你。在本例中,我们在计时器处理程序中解析组件端的可见性。在这个处理程序中,我们决定是显示还是隐藏组件。因此,切换到WindowPOS需要大量的时间和工作。但再次感谢你的建议。