Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-06-2008
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Problema con Timage

BUenas amigos mi problema es el siguiente yo hago una simple asignación de una ruta de una foto en jpg, (previamente agrego la unidad jpeg) y la mando a cargar
Código Delphi [-]
image1.picture.loadfromfile(ruta+foto);
//donde ruta es : c:\archivos de programa\miprograma\imagenes/
//donde foto es: archivo.jpg

ella carga de maravilla pero en cierto momento, porque este proceso se repite de 15 a 20 veces seguido con un lapso de diferencia como de 1 seg ya que es mostrar unas fichas del personal en pantalla, en cierto momento me da una excepción

Access violation at address 42E74800. Read of address 42E74800

pero en ningún momento yo mando a liberar el objeto Timagen lo mas que llego hacer es

Código Delphi [-]
image1.picture:=nil;

para limpiar la imagen y muchas veces cuando me da la excepción de arriba tambien se repite abajo cuando mando a limpiar la imagen
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #2  
Antiguo 26-06-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
hola,

podrias poner el codigo?

saludos

PD: asignar a nil y liberar es mas o menos lo mismo.
Responder Con Cita
  #3  
Antiguo 26-06-2008
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:
Empezado por coso Ver Mensaje
asignar a nil y liberar es mas o menos lo mismo.
Pero muy mas o menos. Poner una referencia a nil por sí mismo no hace nada, no libera memoria ni destruye nada, pero cualquier uso posterior que se quiera hacer de esa referencia causará un "Access violation".

// Saludos
Responder Con Cita
  #4  
Antiguo 26-06-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
hola roman, esta es una duda al respecto...

el 'garbage collection' sirve precisamente para estos casos no? por lo tanto, asignando a nil, quieras o no estas enviando este puntero 'a la papelera...', liberando su memoria. Es una duda, no una afirmacion.

saludos y gracias por la respuesta
Responder Con Cita
  #5  
Antiguo 26-06-2008
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Pero muy mas o menos. Poner una referencia a nil por sí mismo no hace nada, no libera memoria ni destruye nada, pero cualquier uso posterior que se quiera hacer de esa referencia causará un "Access violation".

// Saludos


Muchas gracias amigos , entonces que me recomiendan para limpiar mi Timagen?
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #6  
Antiguo 26-06-2008
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
¡Ah! Pues ahora que lo mencionas, quizá, en los nuevos Delphi. Yo estaba pensando en Delphi <= 7 en donde no hay recolección de basura, así que muy posiblemente estés en lo correcto, disculpa.

// Saludos
Responder Con Cita
  #7  
Antiguo 26-06-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
hola otra vez,

si pones el codigo quiza te podamos ayudar mejor

PD: para limpiar la imagen, personalmente dibujo un rectangulo negro o bien dibujaria la siguiente encima
PDD: pues no, segun wikipedia, delphi no usa el garbage collector. Asi pues, ni con el mas o menos: asignar a nil te deja espacio en memoria reservado, bloqueado e inaccesible.

saludos

Última edición por coso fecha: 26-06-2008 a las 19:06:38.
Responder Con Cita
  #8  
Antiguo 26-06-2008
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
Perdón, la verdad es que nada más estoy confundiéndolos. Y lo voy a hacer un poco más

En Delphi <=7 (el resto no sé), poner una referencia a nil, como digo, no libera memoria. Pero, en el caso de una propiedad como image1.picture, normalmente sí se liberará la memoria porque la asignación

Código Delphi [-]
image1.picture := nil;

se traduce en

Código Delphi [-]
image1.SetPicture(nil);

y muy probablemente el método SetPicture sí se encargue de liberar la memoria.

De todas formas, sigue siendo cierto que si posteriormente se intenta usar image1.picture se obtendrá el error mencionado. Así que, como dice coso, lo mejor es que muestres más código para saber qué pasa.

// Saludos
Responder Con Cita
  #9  
Antiguo 26-06-2008
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Perdón, la verdad es que nada más estoy confundiéndolos. Y lo voy a hacer un poco más

En Delphi <=7 (el resto no sé), poner una referencia a nil, como digo, no libera memoria. Pero, en el caso de una propiedad como image1.picture, normalmente sí se liberará la memoria porque la asignación

Código Delphi [-]image1.picture := nil;


se traduce en

Código Delphi [-]image1.SetPicture(nil);


y muy probablemente el método SetPicture sí se encargue de liberar la memoria.

De todas formas, sigue siendo cierto que si posteriormente se intenta usar image1.picture se obtendrá el error mencionado. Así que, como dice coso, lo mejor es que muestres más código para saber qué pasa.

// Saludos


BUeno en realidad el resto del codigo es irrelevante porque lo que hago es limiar unas variables que utilizo para asignar los nombres de las personas apellidos entre otros datos, pero yo voy documentando mi código en un archivo de texto(una especie de Log) y el codigo revienta exactamente en
Código Delphi [-]
                    try
                      image1.Picture.LoadFromFile(valor+foto);
                    except
                    on e: exception Do
                    escribir('*****Exepcion cargando la foto'+'  '+e.Message);
                    end;


después revienta otra vez
Código Delphi [-]
                    try
                      image1.Picture:=nill;
                    except
                    on e: exception Do
                    escribir('*****Exepcion limpiar la foto'+'  '+e.Message);
                    end;
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #10  
Antiguo 26-06-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
si eliminas el bloque

Código Delphi [-]
                    try
                      image1.Picture:=nil;
                    except
                    on e: exception Do
                    escribir('*****Exepcion limpiar la foto'+'  '+e.Message);
                    end;

te funciona correctamente?
Responder Con Cita
  #11  
Antiguo 26-06-2008
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
en realidad la excepcion sale es esporadicamente no sale siempre... te explico yo muestro una ficha de personal en pantalla cuando una persona muestra su carnet contra un lector de codigo de barra luego que muestro los datos se minimiza el formulario.. pueda que se repita este proceso como unas 20 veces en 5 min mas o menos, y como puede que de el error hoy puede que no lo de, es algo esporadico, por eso es que me tiene vuelto loco
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
  #12  
Antiguo 26-06-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Me da la impresion que lo que te pasa es que en cierto momento has destruido la asignacion de memoria del TImage, y al volver a intentar acceder a el (o a su picture) te da el error de acceso a memoria. Iria bien que pusieras el codigo completo, no solo donde te salta, pues es probable que el error lo generes antes aunque se te localize alla. Puedes probar de colocar estas lineas antes de los try, para ver si va por alla la cosa de nul asignment.

Código Delphi [-]
 
if (image1 = nil) then ShowMessage('image1 nil');
if (image1.Picture = nil) then showmessage('image1.picture nil');

saludos.

PD: lo dicho, si pones el codigo del recorrido entero, mejor que mejor.

Última edición por coso fecha: 26-06-2008 a las 20:06:17.
Responder Con Cita
  #13  
Antiguo 26-06-2008
JerS JerS is offline
Miembro
 
Registrado: may 2005
Ubicación: Venezuela
Posts: 254
Poder: 19
JerS Va por buen camino
Cita:
Empezado por coso Ver Mensaje
Me da la impresion que lo que te pasa es que en cierto momento has destruido la asignacion de memoria del TImage, y al volver a intentar acceder a el (o a su picture) te da el error de acceso a memoria. Iria bien que pusieras el codigo completo, no solo donde te salta, pues es probable que el error lo generes antes aunque se te localize alla. Puedes probar de colocar estas lineas antes de los try, para ver si va por alla la cosa de nul asignment.

Código Delphi [-]
if (image1 = nil) then ShowMessage('image1 nil');
if (image1.Picture = nil) then showmessage('image1.picture nil');


saludos.

PD: lo dicho, si pones el codigo del recorrido entero, mejor que mejor.

Bueno amigo coso voy a probar con esos condicionales a ver si se elimina el error
__________________
La vida es un simple pero complejo If

J=rS
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
problema al pintar en un TImage miguel_e Varios 1 17-05-2008 02:11:23
Problema con un TImage vivamotos C++ Builder 5 24-04-2008 17:45:32
Problema con TImageList y Timage Archangel Gráficos 1 08-11-2007 00:53:32
Problema con tImage en QReport! paulodb Impresión 2 08-12-2006 17:14:21
Problema con un TImage Jan_polero Gráficos 1 30-11-2004 00:15:11


La franja horaria es GMT +2. Ahora son las 17:33:34.


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