Array of TImage
Hola, qué hay?
En el momento de eliminar completamente las imágenes de un Array of TImage (dinámico) insertadas en un ScrollBox, ¿es suficiente con eliminar dicho ScrollBox o es conveniente eliminar cada imagen individualmente (For i:= High(fotos) DownTo Low(fotos) Do fotos[i].Free)? Es que he hecho las dos versiones y no sé con cual quedarme :) |
Al liberar un array normal no se liberan las cosas a las que apunta... por lo tanto entiendo que deberías liberar cada imagen.
Para comprobarlo puedes hacer un bucle que carge y elimine el ScrollBox sin la parte de la liberación de memoria de los TImage asociados y vas mirando cuanta memoria consume windows. Si sube, ya sabes la respuesta. |
Lo malo es que un ordenador con 16 GB de RAM ni se iba a enterar :D... y encima las imágenes cargadas son en realidad miniaturas :) no se nota aunque cargues cientos... y en este caso es significativamente lento eliminarlas una a una.
|
En teoría no se libera la memoria de las imágenes, ya que estas han sido creadas antes, y asignada después al scrollbox.
Yo las eliminaría, no puede ser lento como dices, debe ser algo instantáneo. Y lo de que tiene 16 Gb no puede ser ninguna excusa :confused: |
Lento sí que es, tarda sus buenos cinco segundos en deshacerse de unos pocos cientos de miniaturas... claro que solo va a un tercio de la velocidad del microprocesador, lógicamente... En cuanto pueda, hago las pruebas que me sugiere Duilioisola en una máquina virtual...
|
También puedes cargar imágenes grandes en formato BMP a todo color.
Con el Paint crea un cuadrado blanco de 1000x1000 y guárdalo en formato BMP de 24 bits. La imagen pesará 2.86MB. En la carga de miniaturas fuérzalo a cargar esta imagen. |
Cita:
¿Por qué tienes que hacer las pruebas en una máquina virtual? :confused: |
¡Hola, Wellnic!
Como alternativa al Array, puedes hacer uso de la clase TOBjectList<T> Cita:
|
Cita:
Y las creo así: Nada del otro jueves :D Como ves, además de las fotos, creo TEdit asociados, que muestran un ID para cada foto. ¿Serán los que ralentizan el borrado? (Lo curioso es que, cuando se crean muchos de esos elementos, los Tedit centrales y finales no suelen aparecer...) Si quieres pongo el procedimiento completo, pero no creo que te fuera a aclarar mucho más... |
Cita:
|
Cita:
Otra opción podría ser crear un thread sencillo que realizara la liberación y así el programa podría continuar (habría que ver en qué momento se libera). |
Sí... se ve como la barra de desplazamiento vertical se va moviendo y distendiendo en orden inverso, hasta que todas las imágenes desaparecen. Así que se me ocurrió ocultar el ScrollBox y mostrar la interfaz principal (un Memo :D) antes del proceso de borrado y (al parecer) asunto arreglado ^\||/:)
|
En esos casos se puede mirar si se puede "desactivar" el refresco visual. Dependiendo de los componentes poseen un EnebleControls/Disablecontrols o BeginUpdate/EndUpdate o algo similar. Porque seguramente la mayor parte del tiempo se está "gastando" en el refresco de la parte visual, no en la propia destrucción de las imágenes.
|
La franja horaria es GMT +2. Ahora son las 00:52:38. |
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