Ver Mensaje Individual
  #3  
Antiguo 03-04-2019
MartinHV MartinHV is offline
Registrado
 
Registrado: jun 2016
Posts: 6
Reputación: 0
MartinHV Va por buen camino
Cita:
Empezado por el-mono Ver Mensaje
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;
Responder Con Cita