![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Liberar componente
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. ![]() 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. |
#2
|
|||
|
|||
![]() 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 |
#3
|
|||
|
|||
Gracias, efectivamente, todo se libera bien, el error era otro.
Tras horas de traceo ![]() 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 ![]() 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 |
#4
|
||||
|
||||
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!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. ![]() |
#5
|
||||
|
||||
Además de lo que dice delphi.com.ar yo recomendaría una reescritura. La línea
Código:
TImage( FindComponent('Foto'+inttostr(i)) ).free; Código:
var Foto: TImage; begin Foto := TImage(FindComponent('Foto'+inttostr(i))); if Foto <> nil then Foto.Free; end; Código:
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; // Saludos |
#6
|
|||
|
|||
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. |
#7
|
||||
|
||||
Cita:
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 |
#8
|
||||
|
||||
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!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. ![]() |
![]() |
|
|
![]() |
|