Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-04-2019
MartinHV MartinHV is offline
Registrado
 
Registrado: jun 2016
Posts: 6
Poder: 0
MartinHV Va por buen camino
Exclamation Parpadeo al llenar 30 ListBox

Hola estimados amigos.
Estoy realizando la carga de 30 ListBox de manera simultanea cada segundo.
El problema es que parpadean al terminar la carga, he intentado con la propiedad
Código:
ListBox.Items.BeginUpdate/EndUpdate
, pero
aún así el problema persiste.

He adicionado la instrucción
Código:
LockWindowUpdate
.

¿Alguna recomendación?, se los agradeceria mucho.

Saludos.
Responder Con Cita
  #2  
Antiguo 03-04-2019
el-mono el-mono is offline
Miembro
 
Registrado: abr 2008
Ubicación: Lules
Posts: 176
Poder: 17
el-mono Va por buen camino
La solucion profesional y mas adecuada para estos casos es implementar Hilos. aunque no comentas como lo estas haciendo ni de que manera.
Responder Con Cita
  #3  
Antiguo 03-04-2019
MartinHV MartinHV is offline
Registrado
 
Registrado: jun 2016
Posts: 6
Poder: 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
  #4  
Antiguo 03-04-2019
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
Hola, pon la propiedad del componente DoubleBuffered = True;

Saludos!
__________________
all your base are belong to us
Responder Con Cita
  #5  
Antiguo 04-04-2019
WHILENOTEOF WHILENOTEOF is offline
Miembro
 
Registrado: mar 2008
Posts: 229
Poder: 17
WHILENOTEOF Va camino a la fama
Hola, veo que paras el timer antes de rellenar, por lo que el proceso no se dispara antes de que se rellenen los listbox. Yo te propongo dos sugerencias:

- si puedes filtrar la información que recuperas cada segundo, para actualizar solo los cambios (no se si es el caso).
- pones todos los listbox en un panel, y antes de llenarlos pones panel.visible:= false y al terminar panel.visible:= true.


No se el código a nivel interno como funcina, pero el BeginUpdate y EndUpdate de la propiedad Items debe afectar a como se cargan las cadenas, pero no al dibujado del control. Podrías ver en el dibujado del control si puedes poner un flag para que no pinte con cada nueva adición y hacerlo todo al final, que sería lo esperado en un BeginUpdate - EndUpdate.
Responder Con Cita
  #6  
Antiguo 04-04-2019
MartinHV MartinHV is offline
Registrado
 
Registrado: jun 2016
Posts: 6
Poder: 0
MartinHV Va por buen camino
Cita:
Empezado por WHILENOTEOF Ver Mensaje
Hola, veo que paras el timer antes de rellenar, por lo que el proceso no se dispara antes de que se rellenen los listbox. Yo te propongo dos sugerencias:

- si puedes filtrar la información que recuperas cada segundo, para actualizar solo los cambios (no se si es el caso).
- pones todos los listbox en un panel, y antes de llenarlos pones panel.visible:= false y al terminar panel.visible:= true.


No se el código a nivel interno como funcina, pero el BeginUpdate y EndUpdate de la propiedad Items debe afectar a como se cargan las cadenas, pero no al dibujado del control. Podrías ver en el dibujado del control si puedes poner un flag para que no pinte con cada nueva adición y hacerlo todo al final, que sería lo esperado en un BeginUpdate - EndUpdate.
Gracias por contestar WHILENOTEOF, realizare tu sugerencia, y vere que efecto tiene. Saludos.
Responder Con Cita
  #7  
Antiguo 04-04-2019
MartinHV MartinHV is offline
Registrado
 
Registrado: jun 2016
Posts: 6
Poder: 0
MartinHV Va por buen camino
Cita:
Empezado por look Ver Mensaje
Hola, pon la propiedad del componente DoubleBuffered = True;

Saludos!
Gracias por contestar look, la propiedad ya la tengo habilitada, pero probare la sugerencia de WHILENOTEOF.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
llenado de formularios automaticamente ebanibaldo PHP 1 12-04-2013 17:07:04
Llenado de reporte en pdf axel77t Impresión 8 04-04-2011 08:08:02
Problema con el llenado de un dbgrid XaSu Varios 9 11-01-2008 22:02:41
dbgrid llenado de datos emenchi34 Conexión con bases de datos 14 16-11-2006 11:34:44
Llenado de formulario rastafarey Varios 4 12-03-2005 01:46:47


La franja horaria es GMT +2. Ahora son las 19:54:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi