- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在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
为面板。当您希望隐藏编辑控件时,请隐藏面板。
如果您不想或不能进行如此大的更改,则可以使用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;
关于performance - Delphi:以表单隐藏/显示TWinControl对象非常慢。如何使其更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32225483/
我喜欢“覆盖”TWinControl.CNKeyDown,将 Enter 键用作 Tab,而不修改原始 VCL 源。我也这样做,使用 SetFocus,效果很好。 辅助类型声明为: type T
如何改 rebase 于 TWinControl 的控件的不透明度?为什么他们不将此功能添加到 TControl/TWinControl 级别(为什么只添加到 TForm)? 最佳答案 控制窗口的不透
我面临着必须拦截和处理 WM_GETOBJECT 的艰巨任务。每当发送到表单上的任何 TWinControl 时都会发送消息。 每个面板 每个嵌套面板 每个编辑框 每个组合框 每个按钮 每个工具栏 每
我想将已发布的属性添加到 TWinControl 中。有没有办法在不需要重新编译基本源代码的情况下做到这一点? 如果没有,有什么方法可以重新编译基本源代码而不用太麻烦? 感谢您的建议... 因新想法而
我正在创建一个 Delphi 服务。有没有办法在服务中使用从 TWinControl 派生的控件?最终,我放置在它上面的控件和任何控件都将保存到位图。但是我尝试的任何操作都会出现“控件没有父窗口”错误
使用伪函数进行子类化: CreateSpecialHandle(TWinControl *Control, const TCreateParams &Params, const AnsiString
谁能告诉我为什么第二次转换在 Delphi 7 中编译失败? var WebBrowser: TWebBrowser; begin WebBrowser := TWebBrowser.Crea
想象一下,您想要分配自己的事件过程: procedure TSuperObject.DoSomething(Sender: TObject; Button: TMouseButton; Shift:
我需要将焦点设置在 TEdit 控件上。通常,我在检查控件是否可以聚焦后使用TWinControl.SetFocus。最近,我注意到TCustomForm类提供了SetFocusedControl函数
我有这个代码: procedure TForm1.FormCreate(Sender: TObject); begin DoSomethingWithCombobox(ComboBox1.Hand
我试图在 TWinControl 中显示自定义提示,但我不知道如何获取它的位置。 使用位置 0,0 在屏幕顶部(窗口外)显示提示,所以我猜它一定是屏幕上控件的位置。 编辑: 我发现 TControl
我有一个高度多线程的 Delphi 6 应用程序。我创建了一个源自 TWinControl 的组件。当我第一次构建它时,我使用了一个隐藏窗口,它是 WndProc 来处理消息,并使用 Allocate
我是一名优秀的程序员,十分优秀!