Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Delphi:在表单中隐藏/显示TWinControl对象相当慢。如何让它更快?_Performance_Delphi_Vcl - Fatal编程技术网

Performance Delphi:在表单中隐藏/显示TWinControl对象相当慢。如何让它更快?

Performance Delphi:在表单中隐藏/显示TWinControl对象相当慢。如何让它更快?,performance,delphi,vcl,Performance,Delphi,Vcl,我在DelphiXe5中有一个简单的VCL表单应用程序。在主要形式中,有大量的TEdit组件。现在我意识到设置所有这些编辑的可见性非常慢。当它们被隐藏/显示时,在我的计算机上大约需要1秒钟 请注意,此示例仅用于演示问题。我知道这可以通过向面板插入编辑并隐藏/显示面板来解决。但这在我们的应用程序中是不可能的,因为最终用户会将编辑插入表单。我们也不知道哪些编辑的可见性将被控制 如何让它更快 请注意,当我使用TLabel(TGraphicControl)而不是TEdit(TWinControl)时,速

我在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需要大量的时间和工作。但再次感谢你的建议。