Entiendo que el uso de BeginUpdate y EndUpdate en controles VCL como TListBox acelera el proceso de llenar el control con Elementos, ya que impide que el control se vuelva a pintar, hasta que se llame a EndUpdate.¿Por qué TStringList tiene BeginUpdate y EndUpdate?
Ejemplo:
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;
Lo anterior tendrá un retraso porque se permite que el cuadro de lista para ser pintada, pero el retraso puede ser cortocircuitado mediante la prevención de repintado de este modo:
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;
Ahora he probado esto usando una lista de líneas de TSTR:
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;
Parece que no importa si el TStringList utiliza BegindUpdate y EndUpdate, la lista se llena aproximadamente a la misma velocidad ..
¿son realmente necesarios, ya que el TStringList se realiza en memoria y no visualmente. Si de todos modos utilizo BeginUpdate y EndUpdate en una TStringList, ¿es una buena práctica hacer esto?
Me siento tonto por preguntar esto, pero ¿por qué TStringList tiene los procedimientos BeginUpdate y EndUpdate?
Creo que puedo haber respondido mi propia pregunta aquí, de cualquier manera me gustaría escuchar sus opiniones.
Gracias :)
+1, también inhibe el evento 'OnChange'. – RRUZ
@RRUZ, de hecho! Gracias por la pista. –
Muchas gracias @UweRaabe No sabía que –