Tôi hiểu rằng việc sử dụng BeginUpdate và EndUpdate trên các điều khiển VCL chẳng hạn như TListBox tăng tốc quá trình điều khiển với các mục vì nó ngăn không cho kiểm soát được sơn lại, cho đến khi EndUpdate được gọi.Tại sao TStringList có BeginUpdate và EndUpdate?
Ví dụ:
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;
trên sẽ có một sự chậm trễ vì Listbox được phép được sơn lại, nhưng sự chậm trễ có thể thiếu bằng cách ngăn chặn sơn lại như vậy:
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;
Bây giờ tôi đã thử nghiệm điều này bằng cách sử dụng 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;
Dường như không phân biệt nếu TStringList sử dụng BegindUpdate và EndUpdate, danh sách này được phổ biến ở mức xấp xỉ với tốc độ tương tự ..
Họ có thực sự cần thiết mặc dù là TStringList được thực hiện trong bộ nhớ và không trực quan. Tôi có nên sử dụng BeginUpdate và EndUpdate trên TStringList hay không, liệu có thực hành tốt để làm điều này không?
Tôi cảm thấy ngớ ngẩn khi hỏi điều này nhưng tại sao TStringList lại có các thủ tục BeginUpdate và EndUpdate?
Tôi nghĩ rằng tôi có thể đã trả lời câu hỏi của riêng tôi ở đây, theo cách tôi muốn nghe quan điểm của bạn.
Cảm ơn :)
+1, Cũng ức chế sự kiện 'OnChange'. – RRUZ
@RRUZ, thực sự! Cảm ơn gợi ý. –
Cảm ơn tuyệt vời @UweRaabe Tôi sẽ không biết rằng –