gpt4 book ai didi

delphi - 如何暂时停止控件的绘制?

转载 作者:行者123 更新时间:2023-12-03 14:45:04 25 4
gpt4 key购买 nike

我们有一个 win 控制对象,它将其客户端移动到其他一些坐标。问题是,当子级太多时 - 例如 500 个控件 - 代码真的很慢。这一定是因为每次我设置 Left 和 Top 属性时每个控件都会重新绘制。因此,我想告诉 WinControl 对象停止重新绘制,并且在将所有对象移动到新位置后,可能会再次绘制它(类似于用于备忘录和列表对象的 BeginUpdate )。我怎样才能做到这一点?这是移动对象的代码;这很简单:

for I := 0 to Length(Objects) - 1 do begin
with Objects[I].Client do begin
Left := Left + DX;
Top := Top + DY;
end;
end;

最佳答案

Cosmin Prund解释说,持续时间过长的原因不是重新绘制的影响,而是 VCL 在控制运动时的重新调整要求。 (如果确实需要这么长时间,那么您甚至可能需要请求立即重新绘制)。

要暂时阻止重新对齐以及 anchor 、对齐设置和 Z 顺序的所有检查和工作,请使用 DisableAlignEnableAlign 。并通过直接调用来将 SetBounds 的调用次数减半:

procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
Control: TControl;
begin
for I := 0 to 499 do
begin
Control := TButton.Create(Self);
Control.SetBounds((I mod 10) * 40, (I div 10) * 20, 40, 20);
Control.Parent := Panel1;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
C: TControl;
begin
// Disable Panel1 paint
SendMessage(Panel1.Handle, WM_SETREDRAW, Integer(False), 0);
Panel1.DisableAlign;
try
for I := 0 to Panel1.ControlCount - 1 do
begin
C := Panel1.Controls[I];
C.SetBounds(C.Left + 10, C.Top + 5, C.Width, C.Height);
end;
finally
Panel1.EnableAlign;
// Enable Panel1 paint
SendMessage(Panel1.Handle, WM_SETREDRAW, Integer(True), 0);
// Update client area
RedrawWindow(Panel1.Handle, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN);
end;
end;

关于delphi - 如何暂时停止控件的绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14520716/

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