Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con Timage (https://www.clubdelphi.com/foros/showthread.php?t=57755)

JerS 26-06-2008 16:10:08

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

coso 26-06-2008 17:19:35

hola,

podrias poner el codigo?

saludos

PD: asignar a nil y liberar es mas o menos lo mismo.

roman 26-06-2008 17:48:35

Cita:

Empezado por coso (Mensaje 296423)
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

coso 26-06-2008 17:53:11

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

JerS 26-06-2008 17:55:12

Cita:

Empezado por roman (Mensaje 296438)
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?

roman 26-06-2008 17:55:43

¡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

coso 26-06-2008 17:56:01

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

roman 26-06-2008 18:11:48

Perdón, la verdad es que nada más estoy confundiéndolos. Y lo voy a hacer un poco más :o

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

JerS 26-06-2008 18:26:00

Cita:

Empezado por roman (Mensaje 296452)
Perdón, la verdad es que nada más estoy confundiéndolos. Y lo voy a hacer un poco más :o

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;

coso 26-06-2008 18:31:16

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?

JerS 26-06-2008 18:45:46

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

coso 26-06-2008 18:52:48

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.

JerS 26-06-2008 19:12:49

Cita:

Empezado por coso (Mensaje 296478)
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 franja horaria es GMT +2. Ahora son las 00:42:01.

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