PDA

Ver la Versión Completa : Cargar en un TImagen que está en otro modulo


Anunakis
11-02-2007, 19:20:04
Hola a todos,

os comento mi problema haber si me podeis ayudar:

tengo una funcion en el modulo de datos que carga una imagen de la base de datos, os pongo el codigo:
function TMMaestros.CargarFoto(Tabla, CodTabla, Titulo: String): TGraphic;
var
StrSQL: String;
Grafico : TGraphic;
Stream : TStream;
begin
Result := nil;
Tabla := Trim(UpperCase(Tabla));
CodTabla := Trim(CodTabla);
Titulo := Trim(Titulo);
StrSQL := 'SELECT * FROM Archivos '+
'WHERE Tabla = "'+Tabla+'"'+
' AND CodTabla = "'+CodTabla+'"'+
' AND Titulo = "'+Titulo+'"';
Funciones.AbrirQuery(Archivos,StrSQL);
if Archivos.RecordCount = 0 then
begin
StrSQL := 'SELECT * FROM Archivos '+
'WHERE Tabla = "CLIENTES"'+
' AND CodTabla = "BLANCO"'+
' AND Titulo = "FOTO"';
Funciones.AbrirQuery(Archivos,StrSQL);
end;
if Archivos.RecordCount > 0 then
begin
// CARGAR LOGO EN IMAGEN
try
Stream := Archivos.CreateBlobStream(ArchivosArchivo,bmRead);
if ExtractFileExt(ArchivosNombre.AsString) = '.bmp' then
Grafico := TBitmap.Create
else
if ExtractFileExt(ArchivosNombre.AsString) = '.jpg' then
Grafico := TJPEGImage.Create;
Grafico.LoadFromStream(Stream);
Result := Grafico;
Grafico.free;
Stream.Free;
except
Grafico.free;
Stream.free;
end;
end
else
Result := nil;
end;

Y despues lo que quiero hacer es desde un FormCliente cargar esa imagen que me devuelve la funcion en un TImagen, lo hago asi:
try
Foto.Picture.Graphic := MMaestros.CargarFoto('CLIENTES',MMaestros.Clientes.FieldByName('CodCliente').AsString,'FOTO');
except
end;

El error que me da es una violacion de acceso. Delphi 7 contra Access.

En cambio si meto la funcion en el mismo formulario y modifico este trozo de codigo si funciona la funcion:
// CARGAR LOGO EN IMAGEN
try
Stream := MMaestros.Archivos.CreateBlobStream(MMaestros.ArchivosArchivo,bmRead);
if ExtractFileExt(MMaestros.ArchivosNombre.AsString) = '.bmp' then
Grafico := TBitmap.Create;
Grafico.LoadFromStream(Stream);
Foto.Picture.Graphic := Grafico;
Grafico.free;
Stream.Free;
except
Grafico.free;
Stream.free;
end;

Gracias de antemano

seoane
11-02-2007, 22:19:30
No hay que olvidar que en el fondo los objetos no son mas que punteros. Así cuando asignas un objeto a otro, lo que haces es que ambos punteros pasan a apuntar al mismo objeto. Es decir, cuando tu haces esto:

Result := Grafico;
Grafico.free;

Result pasa a apuntar a un objeto que ya no existe.

Una posible solución es pasar el TImage como parámetro de la función. Algo así:

procedure TMMaestros.CargarFoto(Tabla, CodTabla, Titulo: String; Imagen: TImage);

// ......


// CARGAR LOGO EN IMAGEN
try
Stream := Archivos.CreateBlobStream(ArchivosArchivo,bmRead);
if ExtractFileExt(ArchivosNombre.AsString) = '.bmp' then
Grafico := TBitmap.Create
else
if ExtractFileExt(ArchivosNombre.AsString) = '.jpg' then
Grafico := TJPEGImage.Create;
Grafico.LoadFromStream(Stream);
Imagen.Picture.Graphic:= Grafico;
Grafico.free;
Stream.Free;
except
Grafico.free;
Stream.free;
end;

Anunakis
11-02-2007, 23:56:39
Muchas gracias, va perfecto, no habia caido en ese detalle, gracias de nuevo.:)