Cosmin Prundが説明しているように、長時間の原因は再描画の影響ではなく、コントロールの移動で必要な VCL の再調整の影響です。(実際にそれほど時間がかかる場合は、すぐに再描画を要求する必要があるかもしれません)。
再整列とすべてのチェックを一時的に防止し、アンカーに対して機能するようにするには、設定と Z オーダーを整列し、 と を使用DisableAlign
しEnableAlign
ます。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;