PDA

Ver la Versión Completa : Liberar componente


Sick boy
13-05-2003, 02:54:22
Hola,

Necesito liberar dinamicamente un TImage, creado tambien en ejecución.

El caso es que los errores que recibo son cada vez diferentes, a veces son error del tipo "imposible leer la direccion de memoria", otros son "Error abstracto".
Tampoco da los mismos errores en todas las ocasiones.

Para borrarlo uso:
TImage( FindComponent('Foto'+inttostr(i)) ).free;

Probe a poner la propiedad picture a nil, pero sigue igual.:mad:

Aumente Max Stackfile en las opciones del complidor, y funciona mejor, hasta que hago unas cuantas pruebas y salta el error de acceso a memoria.

Por favor, alguno sabe como liberar correctamente un Timage??

gracias.

Ruben_Cu
13-05-2003, 06:07:02
Hola Sick boy, como lo tienes planteado debería liberarte la imagen Foto+i. Ahora bien si te salta el error de acceso de memoria parece ser que quieres destruir un objeto que no existe.
Revisa si están bien creados y si en algún paso anterior no se destruye o si los valores maximos de 'i' son los mismos para la creación que para liberarlos.
En cualquier caso, al menos para mi, necesitaría mas información para ver si pudiera ayudarte más.
Si se te mantiene el problema envia mas información para poder analizar mejor.
Saludos

Sick boy
13-05-2003, 15:31:46
Gracias, efectivamente, todo se libera bien, el error era otro.

Tras horas de traceo :confused: , me di cuenta de que una de las imagenes en el evento onmousedown borra TODAS las imagenes, incluyendo a ella misma. Despues todas se vuelven a crear con datos nuevos.

De modo que todo parece que funciona, hasta que sale del procedimiento y da (y solo a veces) los diferentes errores, incluido el "error abstracto".

La solucion fue no borrar la imagen que genera el borrado :p .

No entiendo por que unas veces se produce el error y otras no, ya que la imagen se destruye de todos modos.

Uso delphi 5, quizas delphi 6 y 7 tengan esto resuelto.

Saludos

delphi.com.ar
13-05-2003, 18:03:27
Sinceramente creo que primero tenemos que estar muy seguros de que el código que escribimos es correcto antes de echarle la culpa al lenguaje.

Saludos!

roman
13-05-2003, 18:28:49
Además de lo que dice delphi.com.ar yo recomendaría una reescritura. La línea


TImage( FindComponent('Foto'+inttostr(i)) ).free;


es muy osada. Presupone que FindComponent siempre regresará un objeto. Una de las formas de evitar errores como el que tenía sick boy es siempre verificando que los objetos son distintos de nil antes de referenciarlos. Aunque tome más lineas de código yo siempre reescribiría este código como:


var
Foto: TImage;

begin
Foto := TImage(FindComponent('Foto'+inttostr(i)));
if Foto <> nil then
Foto.Free;
end;


O bien, si estamos muy seguros de que FindComponent debe regresar un objeto distinto de nil, en la etapa de depuración del programa pondríamos:


var
Foto: TImage;

begin
Foto := TImage(FindComponent('Foto'+inttostr(i)));
Assert(Foto<>nil, 'Uy, me equivoqué, algo anda mal en mi código');
Foto.Free;
end;


De manera que sea más sencillo revisar por donde andan los errores.

// Saludos

Sick boy
13-05-2003, 23:31:10
No le echo la culpa al lenguaje, solo me estrañan algunas cosas.
Pienso que el problema era el que comente, ya que ahora todo va bien.

Creanme que casi todo el codigo estaba entre try... except.

Lo del findcomponent estaba especialmente protegido, ya que en un principio pense que ese era el problema.
Antes de hacer ese TImage( FindComponent('Foto'+inttostr(i)) ).free; comprobaba que existiera, etc...

Como dije, el error lo daba al salir del procedimiento (asi que todos los try...except no interceptaban ningun problema), y no siempre, que es lo mas estraño. Ademas el tipo de error cambiaba, y eso me desconcerto un poco.

Como no todos los que leen este foro estan muy seguros de su codigo, explico lo que me paso, por si alguien se encuentra en ese problema. De todas formas, es mas facil que el bug sea mio que de Delphi.

Gracias Roman, la verdad es que solo compuebo que existe, no que sea distinto de nil, aunque creo que tal y como esta escrito mi codigo los TImage siempre seran distintos de nil.

Siento haber abierto este hilo por un error mio, pero espero que le pueda servir a alguien.

Gracias a todos los que se interesaron.

roman
14-05-2003, 00:07:19
Escrito originalmente por Sick boy
Gracias Roman, la verdad es que solo compuebo que existe, no que sea distinto de nil, aunque creo que tal y como esta escrito mi codigo los TImage siempre seran distintos de nil.

Esta es justamente la labor de Assert.

A veces escribimos un código omitiendo algunas comprobaciones porque sabemos que debido a cómo lo diseñamos ciertas condiciones nunca se van a dar. Esto es bueno pues la ejecución no tiene que estar comprobando situaciones que nunca van a ocurrir.

Sin embargo, sobre todo cuando apenas estamos comenzado el diseño, podemos equivocarnos precisamente porque otras partes del programa provocaron que las condiciones no sean las esperadas.

El Assert nos dirá: "Cuidado: algo no trabaja acorde a tu diseño porque falló lo que no debería fallar"

Cuando el programa esté suficientemente depurado y probado podemos desactivar los Assert en las opciones del compilador y no se incluirán en el código ejecutable.

// Saludos

delphi.com.ar
14-05-2003, 00:36:51
No es un reproche, solo intento que cambies un punto de vista muy común entre los programadores, que a mi parecer, es erróneo.

PD:
¿Porqué no nos pasas el procedure para ver si podemos deducir porqué sucedía el problema?


Saludos!