Cita:
Empezado por el-mono
La solucion profesional y mas adecuada para estos casos es implementar Hilos. aunque no comentas como lo estas haciendo ni de que manera.
|
Gracias por contestar "el-mono", aquí una descripción del problema.
Realizo el proceso en un timer que se ejecuta cada Segundo.
Se carga una consulta con N Cantidad de registros, los cuales son
acomodados en los 30 ListBox ( cada ListBox esta contenido dentro de un Panel, tanto como los ListBox y los Panel forman
parte de un arreglo)
Al finalizar el acomodo, habilito el "EndUpdate de los listBox afectados."
Bosquejo del Código
Código:
procedure TFExpo.Timer1Timer(Sender: TObject);
var
Tiempo:Double;
begin
try
Timer1.Enabled:=False;
//Query donde se obtienen los registro para llenar los ListBox
qExpo.Close;
qExpo.Params.ParamByName('FECHA').AsInteger:=gFecha;
qExpo.Params.ParamByName('IDLOCAL').AsInteger:=gIdlocal;
qExpo.Params.ParamByName('IDEXPO').AsInteger:=1;
qExpo.Open();
Gen.LockControl(Self,True);
Gen.BeginUpdate;
while not qExpo.Eof do
begin
//Código donde se llenan los ListBox
end;
finally
Gen.EndUpdate;
Gen.LockControl(Self,False);
Timer1.Enabled:=True;
end;
end;
//Clase donde se anexan rutinas
procedure TGenerico.LockControl(c: TWinControl; lock: boolean);
begin
if (c=nil) or (c.Handle=0) then exit;
if lock then
SendMessage(c.Handle,WM_SETREDRAW,0,0)
else
begin
SendMessage(c.Handle,WM_SETREDRAW,1,0);
RedrawWindow(c.Handle,nil,0,RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
end;
end;
procedure TGenerico.EndUpdate;
var M:Integer;
begin
for M := 1 to Limite-1 do
begin
LOrdenes[M].Items.EndUpdate;
LockControl(aPanel[M],False);
end;
end;
procedure TGenerico.BeginUpdate;
var M:Integer;
begin
for M := 1 to Limite-1 do
begin
LockControl(LOrdenes[M],True);
LockControl(aPanel[M],True);
LOrdenes[M].Items.BeginUpdate;
end;
end;