Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Generar Mostrar listado lentamente (https://www.clubdelphi.com/foros/showthread.php?t=67369)

Kenobi 14-04-2010 00:09:43

Generar Mostrar listado lentamente
 
Hola amigos..
requiero llenar un listbox u otro control con un conjunto de resultados que se iran generando de un ciclo, la idea es simular dicha generacion para hacer mas claro el ejemplo a tal fin estoy utilizando
Código Delphi [-]
sleep(numero)
para conseguir que el proceso no sea tan rapido (por asunto de la simulacion del ejemplo que voy a implementar)
el problema es que el sleep me para el proceso de tal manera que solo veo los resultado al final y no es lo que quiero, quiero que se muestre una linea - pausa - otra linea - pausa y asi hasta el final

Gracias por su ayuda....

Casimiro Noteví 14-04-2010 00:47:26

¿Y podemos ver tu código? :)

ecfisa 14-04-2010 04:16:21

Hola kenobi.

Lo que sucede es que el retardo lo tenes que poner cuando "dibuja" el texto, interceptando el evento OnDrawItem del ListBox.

Asocia este código a dicho evento:
Código:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with ListBox1 do
    Canvas.TextRect(Rect,Rect.Left,Rect.Top,Items[Index]);
  Sleep(50); // o lo que quieras...
end;

Saludos.

Kenobi 14-04-2010 04:25:29

El codigo
 
Hola la solucion de colocar en el ondraw no me funciono
a tal fin coloco el fragmento de codigo ...

Código Delphi [-]
for i := 1 to elNumero do
begin
  if (elNumero mod i = 0) then ListaNumero.Items.Add(IntToStr(i));

  Sleep(2);
end;

Kenobi 14-04-2010 04:30:40

Yo mismo me respondo asi funciona
 
Código Delphi [-]
for i := 1 to elNumero do
begin
  if (elNumero mod i = 0) then
  Begin
  ListaNumero.Items.Add(IntToStr(i));
  listaNumero.Refresh;
  Sleep(100);
  End;
end;

todo consiste en refrescar el listbox en cada iteraccion

gracias por todo amigos

ecfisa 14-04-2010 04:36:39

Hola de nuevo.

Perdón,no funciona por que olvidé decirte que pongas la propiedad Style del ListBox a ibOwnerFixedDraw. (nosotros dibujamos)

Es más eficiente que hacer un Refresh por cada iteración, pero para pocos datos, va en gustos...


Saludos.

Caro 15-04-2010 02:15:38

Hola kenovi, puedes colocar Application.ProcessMessage en tu ciclo en ves del Refresh.

Código Delphi [-]
for i := 1 to elNumero do
begin
  Application.ProcessMessages;
  if (elNumero mod i = 0) then
  Begin
    ListaNumero.Items.Add(IntToStr(i));
    Sleep(100);
  End;
end;

Saluditos


La franja horaria es GMT +2. Ahora son las 16:45:02.

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