Delphi.cz

Český portál Delphi

TWinControl.LockDrawing a TWinControl.UnlockDrawing

Při představení Delphi 11 jsem prakticky vynechal přidání TWinControl.LockDrawing a TWinControl.UnlockDrawing, což ovlivňuje provádění windows zprávy WM_SETREDRAW.

V What's New se píše:

  • metoda TWinControl.LockDrawing zakazuje control updating
  • metoda TWinControl.UnlockDrawing povoluje control updating
  • property TWinControl.IsDrawingLocked vrací True pokud LockDrawing byl volán (a UnlockDrawing ne)
  • property TWinControl.RedrawDisabled vrací True když Win32 control drawing je disabled

Některé kontejnery komponent mají zdřívějška BeginUpdate/EndUpdate, ale to nebyl případ obecného TWinControl.

Test

Mějme formulář s panelem, dvěma tlačítky, které volají následující metodu s rozdílným parametrem:

procedure TForm47.DoRecreate(bDisable: Boolean);
var
  iCnt: Int64;
  x: Integer;
  btn: TButton;
begin
  iCnt := GetTickCount64;
  if bDisable then
    Panel1.LockDrawing;
  try
    while panel1.ControlCount > 0 do
      Panel1.Controls[0].Free;
    for x := 1 to 100 do
    begin
      btn := TButton.Create(Panel1);
      btn.Caption := IntToStr(x);
      btn.SetBounds(x*3, x*3, 70, 20);
      btn.Parent := Panel1;
    end;

  finally
    if bDisable then
      Panel1.UnlockDrawing;
    Label1.Caption := IntToStr(GetTickCount64 - iCnt);
  end;

end;

Výsledkem programu je 100 přidaných tlačítek (případně vyčištění předtím). Výsledek je lepší samozřejmě s LockDrawing a UnlockDrawing, ale jak? Nejmenší rozdíl je na monitoru s DPI, s kterým to je navrženo (v tomto případě 62 x 80 ms pokud byl panel prázdný, resp. 80 x 125ms pokud se předtim provádí uvolňování) . Pokud se DPI liší tak mi to vyšlo 110 x 234 ms včetně čištění.

Osobně přikládám největší význam při provozování aplikace na vzdáleného připojení, což byl i důvod proč jsem se s tím začal zabývat. Přijde mi, že tam je benefit velmi významný.

Datum: 2022-04-06 09:31:00 Tagy: D11, vcl

Novinky v Delphi