Impressão de fotos utilizando o QuickReport

Delphi

28/03/2013

Prezado,
Tenho uma tabela em paradox onde o campo FOTO (string, 20 posições) guarda o nome do arquivo da foto (ex.: gilberto.jpg).

No relatorio usando o quickreport, utilizei o componente QrImage como também o QrDbImage e em ambos não funciona.

Por favor, preciso de sua orientação em imprimir esta foto

Para teste, fiz a seguinte linha de comando: QrDbImage1.Picture.LoadFromFile('D:\NovaIEAD\Dados\gilberto.jpg');
e sempre retorna uma mensagem de erro " UNKNOWN PICTURE FILE EXTENSION(.JPG)". Também testei a seguinte linha de comando:
QrDbImage1.Picture.LoadFromFile('gilberto.jpg'). O mesmo erro acima.

Aguardo e agradeço.

Gilberto Moreira

Gilberto Moreira

Curtidas 0

Respostas

Vagner Almeida

Vagner Almeida

28/03/2013

Olha, no Paradox eu não sei, até porque eu nunca quis ter o trabalho de montar um software para depois migrar de Banco de Dados.
Esforcesse um pouco para usar o FireBird que é um banco mais chegado ao paradox, mas anos luz melhor.

Tanto no FireBird como no MySQL eu uso o seguinte código:

procedure Tfrm_printpromissoria.qckrpDuplicataBeforePrint(
  Sender: TCustomQuickRep; var PrintReport: Boolean);
var
 BlobStream: TStream;
 JPEGImage:  TJPEGImage;
begin
 with dm.qEmpresa do begin // Componente que fica no DataModule contendo o script "select" que possui o campo com a foto
   Close; // Fecha a tabela se estiver aberta
   Open; // Abre a tabela

   if FieldByName('foto').AsString <> '' then begin
      BlobStream:= FieldbyName('foto').DataSet.CreateBlobStream(FieldbyName('foto'),bmRead);
      JPEGImage := TJPEGImage.Create;
      try
        JPEGImage.LoadFromStream(BlobStream);
        dFoto.Picture.Assign(JPEGImage);
        fFoto.Picture.Assign(JPEGImage);
      finally
        BlobStream.Free;
        JPEGImage.Free;
      end;
   end;
 end;
end;

OBS.: Declare em USES as libs "JPEG" e "Classes"




Tá fácil de entender, mas como eu disse, no PARADOX eu não sei se é a mesma coisa, até porque nunca usei.
GOSTEI 0
Marcio

Marcio

28/03/2013

é só declarar a unit JPeg no uses...

uses
...., JPeg;
GOSTEI 0
Vagner Almeida

Vagner Almeida

28/03/2013

isso
GOSTEI 0
João Victor

João Victor

28/03/2013

Com esse seu codigo esta aparecendo a mesma imagem para todos os registro cadastrados, o que faço?
GOSTEI 0
Vagner Almeida

Vagner Almeida

28/03/2013

João Victor, detalhe melhor seu problema para que eu possa ajuda-lo.
GOSTEI 0
João Victor

João Victor

28/03/2013

Ao abrir o relatório so esta aparecendo a primeira imagem para todos os registro cadastrados
GOSTEI 0
João Victor

João Victor

28/03/2013

[img]http://arquivo.devmedia.com.br/forum/imagem/412794-20150220-140312.jpg[/img]
GOSTEI 0
João Victor

João Victor

28/03/2013

Tipo assim(imagem), vagner_rj.
Agradeço.
GOSTEI 0
Vagner Almeida

Vagner Almeida

28/03/2013

Grave imagens totalmente diferentes nos registros e faça o teste, porque o nome que está aparecendo na imagem não está se repetindo.
Veja se o objeto da imagem está totalmente dentro da banda que você está utilizando.
Se não resolver mande um print da tela do form.
GOSTEI 0
João Victor

João Victor

28/03/2013

[img]http://arquivo.devmedia.com.br/forum/imagem/412794-20150220-205120.png[/img]




Verifiquei tudo, mas infelizmente aparentemente está tudo de acordo.
GOSTEI 0
João Victor

João Victor

28/03/2013

Essas fotos são todas totalmente diferentes, mas o problema é esse - aparece sempre a foto do primeiro registro para todos os registro.
GOSTEI 0
Vagner Almeida

Vagner Almeida

28/03/2013

Mande o print do FORM em tempo de desenvolvimento, com os componentes do quick e se possível o trecho do script que você utiliza para carregar a foto.
GOSTEI 0
João Victor

João Victor

28/03/2013

Esse aqui é o codigo pra colocar a image no banco. Codigo usando o ONDATACHANGE do datasource:


var
jpg:TJPEGImage;
stream: TMemoryStream;
begin
inherited;

// Se houver foto para o aluno
if not (dm.tb_alunoimagem.Isnull) then begin
try

//Aloca espaço na memoria{cria instancia das classes}
jpg:=TJPEGImage.Create;
stream:=TMemoryStream.Create;

// Carrega imagem do campo imagem para stream{Memoria RAM do PC }
dm.tb_alunoimagem.SaveToStream(stream);

//Volta o ponteiro para o INICIO do stream
stream.seek(0, soFromBeginning);

//Grava o Stream pra dentro do jpg
jpg.loadFromStream(stream);

//Carrega a foto na caixa de imagem
image.picture.Assign(jpg);

//Liberar a memoria {apagar as instancias}
jpg.free;
stream.free;
except
on e:exception do begin // Caso aconteça algum erro no carregamento da imagem
jpg.free;
stream.free;
MessageBox(application.Handle, Pchar(e.Message) , Pchar('Falha ao Carregar a imagem do Aluno'), MB_OK+MB_ICONWARNING);
end;
end;
end
else begin // Se não tiver foto cadastrada
image.Picture.Assign(nil);
end;
end;


Agora essa é no DBclick da imagem, pra abrir o dialog pra carregar a foto.




procedure TF_ALUNO.imageDblClick(Sender: TObject);
var

jpg:TJPEGImage;

begin

if odfoto.execute then begin
try
// Colocar a tabela imagem em modo de edição
ds_aluno.dataset.edit;

//Criar instancia da CLASSE TJPEGIMAGE
jpg:=TJPEGImage.create;

//Salvar Imagem no Banco de dados
dm.tb_alunoimagem.LoadFromFile(odFoto.FileName);

//Carrega Imagem na instancia JPG
jpg.LoadFromFile(odfoto.FileName);

//Assimila JPG para image{Mostra imagem no formulario}
image.Picture.assign(jpg);

//Destroi a instancia jpg da imagem{Libera a memoria RAM}
jpg.free;
except
on E:exception do begin
jpg.free;
MessageBox(Application.handle,Pchar('É permitido apenas arquivo JPG para imagem'), Pchar('Falha ao carregar imagem do arquivo'), MB_OK+mb_ICONWARNING);
end;
end;
end;

end;







Esse codigo quando eu der 2 clicks na imagem ele vai carregar a imagem e salvar a foto no banco de dados.
GOSTEI 0
João Victor

João Victor

28/03/2013

[img]http://arquivo.devmedia.com.br/forum/imagem/412794-20150220-210917.png[/img]






[img]http://arquivo.devmedia.com.br/forum/imagem/412794-20150220-210946.png[/img]




vai ai a form do relatorio e a parte dos codigos.


Agradeço a atenção!
GOSTEI 0
João Victor

João Victor

28/03/2013

Esse aqui é o codigo pra colocar a image no banco. Codigo usando o ONDATACHANGE do datasource:


var
jpg:TJPEGImage;
stream: TMemoryStream;
begin
inherited;

// Se houver foto para o aluno
if not (dm.tb_alunoimagem.Isnull) then begin
try

//Aloca espaço na memoria{cria instancia das classes}
jpg:=TJPEGImage.Create;
stream:=TMemoryStream.Create;

// Carrega imagem do campo imagem para stream{Memoria RAM do PC }
dm.tb_alunoimagem.SaveToStream(stream);

//Volta o ponteiro para o INICIO do stream
stream.seek(0, soFromBeginning);

//Grava o Stream pra dentro do jpg
jpg.loadFromStream(stream);

//Carrega a foto na caixa de imagem
image.picture.Assign(jpg);

//Liberar a memoria {apagar as instancias}
jpg.free;
stream.free;
except
on e:exception do begin // Caso aconteça algum erro no carregamento da imagem
jpg.free;
stream.free;
MessageBox(application.Handle, Pchar(e.Message) , Pchar('Falha ao Carregar a imagem do Aluno'), MB_OK+MB_ICONWARNING);
end;
end;
end
else begin // Se não tiver foto cadastrada
image.Picture.Assign(nil);
end;
end;


Agora essa é no DBclick da imagem, pra abrir o dialog pra carregar a foto.




procedure TF_ALUNO.imageDblClick(Sender: TObject);
var

jpg:TJPEGImage;

begin

if odfoto.execute then begin
try
// Colocar a tabela imagem em modo de edição
ds_aluno.dataset.edit;

//Criar instancia da CLASSE TJPEGIMAGE
jpg:=TJPEGImage.create;

//Salvar Imagem no Banco de dados
dm.tb_alunoimagem.LoadFromFile(odFoto.FileName);

//Carrega Imagem na instancia JPG
jpg.LoadFromFile(odfoto.FileName);

//Assimila JPG para image{Mostra imagem no formulario}
image.Picture.assign(jpg);

//Destroi a instancia jpg da imagem{Libera a memoria RAM}
jpg.free;
except
on E:exception do begin
jpg.free;
MessageBox(Application.handle,Pchar('É permitido apenas arquivo JPG para imagem'), Pchar('Falha ao carregar imagem do arquivo'), MB_OK+mb_ICONWARNING);
end;
end;
end;

end;







Esse codigo quando eu der 2 clicks na imagem ele vai carregar a imagem e salvar a foto no banco de dados.





OBS: Declarar na USES JPEG
GOSTEI 0
Vagner Almeida

Vagner Almeida

28/03/2013

Amigo!
Tive um imprevisto aqui, e não vou poder te dar atenção agora, mas vamos fazer o seguinte...
Vou mais tarde te mando um form de um de meus sistemas para você utilizar como exemplo.
Assim que eu folgar aqui entro em contato novamente pra ver se você conseguiu desenrolar.

Aproveitando, teste o fast report eu migrei do quick para o fast, é muito mais fácil e anos luz mais produtivo.
Para migrar, remontar os relatórios não dará muito trabalho, o fast é muito bom.

Mando o form com os fontes ainda hoje, assim que puder. (provavelmente na parte da tarde)

Abraços...
GOSTEI 0
João Victor

João Victor

28/03/2013

Ok, muito obrigado!
GOSTEI 0
POSTAR