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:
Código Delphi
[-]
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í:
Código Delphi
[-]
procedure TMMaestros.CargarFoto(Tabla, CodTabla, Titulo: String; Imagen: TImage);
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;