Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-05-2003
Sick boy Sick boy is offline
Miembro
 
Registrado: may 2003
Ubicación: Cantabria
Posts: 245
Poder: 21
Sick boy Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 13-05-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Cool

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
Responder Con Cita
  #3  
Antiguo 13-05-2003
Sick boy Sick boy is offline
Miembro
 
Registrado: may 2003
Ubicación: Cantabria
Posts: 245
Poder: 21
Sick boy Va por buen camino
Gracias, efectivamente, todo se libera bien, el error era otro.

Tras horas de traceo , 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 .

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
Responder Con Cita
  #4  
Antiguo 13-05-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 13-05-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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;
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:

Código:
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:

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;
De manera que sea más sencillo revisar por donde andan los errores.

// Saludos
Responder Con Cita
  #6  
Antiguo 13-05-2003
Sick boy Sick boy is offline
Miembro
 
Registrado: may 2003
Ubicación: Cantabria
Posts: 245
Poder: 21
Sick boy Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 13-05-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
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
Responder Con Cita
  #8  
Antiguo 13-05-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:20:04.


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
Copyright 1996-2007 Club Delphi