Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Actualizar ProgressBar segun se rellena una StringGrid ó DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=51420)

jaimeh 14-12-2007 20:30:31

Actualizar ProgressBar segun se rellena una StringGrid ó DBGrid
 
Buenas a todos

Por mas que estoy buscando información en internet no he encontrado nada que me pueda orientar.

El tema en cuestión es que se vaya rellenando una barra de progreso mientras se rellenan las celdas de una StringGrid.

A ver si alguien podría orientarme o decirme donde puedo encontrar información al respecto.


Muchas Gracias a todos

ixMike 14-12-2007 20:43:48

Bueno, deduzco que para llenar el StringGrid utilizas un bucle, ¿no? un for, un while o un repeat.

Pues coloca una TProgressBar, dale a su propiedad Max el número de iteraciones del bucle (esto es, las veces que se repite) y cada vez que el bucle se ejecute una vez, pues pones una de estas tres cositas:

Código Delphi [-]
ProgressBar.StepIt; //Coloca antes la propiedad Step en 1
ProgressBar.Position:=ProgressBar.Position;
Inc(ProgressBar.Position);


Y después, si mal no recuerdo, para que se vea el efecto tienes que llamar al método Refresh o Repaint (no recuerdo bien :o) del Form donde esté o el suyo propio (el de la progressbar, digo).

Espero que te sirva de ayuda. Y mira en la ayuda de Delphi para más información.

Saludos.



Por cierto... ¡¡¡bienvenido al club!!!. Dale un repaso a la guía de estilo (esto de la barra de progreso ya está muy visto ;))

(vaya, yo dando la bienvenida a alguien... :))

enecumene 14-12-2007 21:20:39

Cita:

Empezado por ixMike (Mensaje 252737)
(vaya, yo dando la bienvenida a alguien... :))

Es la Primera Vez amigo Ix?:eek::confused::eek::confused::eek:.

jaimeh 14-12-2007 21:58:00

No funciona
 
Gracias pero eso no funciona.
Yo utilizo el evento onDrawCell para rellenar las celdas cogiendo la informacion de un array global. Y dentro de onDrawCell no he podido actualizar ninguna progressbar.

TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);

L := Rect.Left + (Rect.Right - Rect.Left - bmp[5*ARow+ACol].Width) div 2;
T := Rect.Top + (Rect.Bottom - Rect.Top -bmp[5*ARow+ACol].Height) div 2;
with StringGrid1.Canvas do
Draw(L, T, bmp[5*ARow+ACol]);

Asi es como la relleno mas o menos.

He buscado en todos los foros del club delphi con la busqueda de progressbar y no he encontrado nada que me oriente.

Gracias

maeyanes 14-12-2007 22:15:34

Hola...

Ya leiste Guía de Estilo de estos foros?

También te recomiendo que uses las etiquetas [ delphi ] [ /delphi ] (sin los espacios en blanco) cuando quieras agregar código fuente en Delphi...

Sobre tu problema, usas algún for o while para ir llenando el StringGrid?

Algo como:

Código Delphi [-]
for I := 0 to 10 do
begin
  // Agrego dato al StringGrid...
  // Incrementamos el valor de posición de la progressbar
  ProgressBar1.StepIt;
  // Permitimos que se procesen los mensajes para que se refresque la barra de progreso
  Application.ProcessMessages
end;


Saludos...

jaimeh 14-12-2007 23:08:20

Mi StringGrid esta formada por bmps, como el xp o el acdsee (thumbnails). Las celdas tienen el fondo de color con el bmp centrado.
Entonces de la forma que pones no se como pasar el bmp a la StringGrid

Gracias de nuevo

jaimeh 14-12-2007 23:16:35

Perdon por si hace falta

Código Delphi [-]
bmp: Array [0..1000] of TBitmap;

gracias

ixMike 15-12-2007 01:53:00

Cita:

Empezado por enecumene (Mensaje 252749)
Es la Primera Vez amigo Ix?:eek::confused::eek::confused::eek:.

En el club, creo que esta es la segunda vez (o la tercera, ¡si es que todos se me adelantan siempre!)


Cita:

Empezado por jaimeh
bmp: Array [0..1000] of TBitmap;

yo creo que declarar eso puede ser peligroso... piénsalo... sólo con que cada bitmap ocupe 100KB en memoria, ¡la variable bmp ocupará 100MB! eso es mucha memoria. Pero bueno, como mucho se ralentizaría la máquina (creo, ya he dicho).

Si utilizas DrawCell para dibujar las celdas, entonces, antes de cada dibujado, tendrías que asignar la propiedad Max de la progressbar al número de celdas, y la propiedad position a cero, y cada vez que se dibuje una celda (esto es, en el evento OnDrawCell) incrementar en uno la posición del progressbar. Pero recuerda llamar después de esto a Refresh, Repaint, ProcessMessages o algo similar, porque sino no verás el resultado en pantalla.


Para más información con progressbar mira la ayuda de Delphi.


Saludos.

jaimeh 19-12-2007 13:35:51

Si, posiblemente sea mucha memoria, debería mantener solo en memoria los bmps que se visualizaran en la stringgrid por defecto, que son 30 celdas, e ir agregando y quitando bmps segun los necesitara o no.
Está claro que al programa le falta mucho, pero solo quería construir un simple visualizador de fotografías que fuera ligero.
Al final, la actualización de la ProgressBar la hago en un procedimiento donde genero los bmps en memoria, que eso es lo que realmente tarda, y antes no se porque, no me dejaba (funcionaba).


Gracias a todos por las respuestas.


La franja horaria es GMT +2. Ahora son las 02:29:42.

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