vložil Radek Červinka
6. dubna 2022 10:31
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ý.