TListBoxなどのVCLコントロールでBeginUpdateとEndUpdateを使用すると、EndUpdateが呼び出されるまで、コントロールが再描画されないため、コントロールにItemsを設定するプロセスが高速化されることを理解しています。
例:
procedure TForm1.AddItems;
var
i: Integer;
begin
Screen.Cursor := crHourGlass;
try
for i := 0 to 5000 do
begin
ListBox1.Items.Add('Item' + IntToStr(i));
end;
finally
Screen.Cursor := crDefault;
end;
end;
上記はリストボックスの再描画が許可されているため遅延がありますが、次のように再描画を防ぐことで遅延を短縮できます。
procedure TForm1.AddItems;
var
i: Integer;
begin
Screen.Cursor := crHourGlass;
try
ListBox1.Items.BeginUpdate;
try
for i := 0 to 5000 do
begin
ListBox1.Items.Add('Item' + IntToStr(i));
end;
finally
ListBox1.Items.EndUpdate;
end;
finally
Screen.Cursor := crDefault;
end;
end;
次に、TStringListを使用してこれをテストしました。
procedure TForm1.AddItems;
var
SL: TStringList;
i: Integer;
begin
SL := TStringList.Create;
try
Screen.Cursor := crHourGlass;
try
SL.BeginUpdate;
try
for i := 0 to 5000 do
begin
SL.Add('Item' + IntToStr(i));
end;
finally
SL.EndUpdate;
end;
ListBox1.Items.Assign(SL);
finally
Screen.Cursor := crDefault;
end;
finally
SL.Free;
end;
end;
TStringListがBegindUpdateとEndUpdateを使用しているかどうかに関係なく、リストはほぼ同じ速度で読み込まれるようです。
TStringListは視覚的にではなくメモリ内で実行されるため、これらは本当に必要ですか。とにかくTStringListでBeginUpdateとEndUpdateを使用する必要がありますが、これを行うのは良い習慣ですか?
これを尋ねるのはばかげていると思いますが、なぜTStringListにBeginUpdateとEndUpdateのプロシージャがあるのですか?
私はここで私自身の質問に答えたかもしれないと思います。どちらにしても、あなたの意見を聞きたいと思います。
ありがとう :)