FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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 aún así el problema persiste. He adicionado la instrucción Código:
LockWindowUpdate ¿Alguna recomendación?, se los agradeceria mucho. Saludos. |
#2
|
|||
|
|||
La solucion profesional y mas adecuada para estos casos es implementar Hilos. aunque no comentas como lo estas haciendo ni de que manera.
|
#3
|
|||
|
|||
Cita:
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; |
#4
|
||||
|
||||
Hola, pon la propiedad del componente DoubleBuffered = True;
Saludos!
__________________
all your base are belong to us |
#5
|
|||
|
|||
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. |
#6
|
|||
|
|||
Cita:
|
#7
|
|||
|
|||
Gracias por contestar look, la propiedad ya la tengo habilitada, pero probare la sugerencia de WHILENOTEOF.
Saludos. |
|
|
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 |
|