erro ao Salvar imagem na tabela

Delphi

10/02/2006

Pessoal quero gravar uma imagem na tabela entao fasso o seguinte:

- Firebir 1.5, delphi 7

- Campo da tabela: ´IMAGEM BLOB SUB_TYPE 0 SEGMENT SIZE 240´

Dm.Tbl_Corretor.insert;
Dm.Tbl_CorretorImagem.LoadFromFile(OpenPictureDialog1.FileName);
Dm.Tbl_Corretor.post;
Dm.Tbl_Corretor.applyupdates;
showMessage(´imagem gravada com sucesso´);


o erro que é retornado é o seguinte: ´Internal Error´

- mesmo dando esse a imagem é salva na tabela, porem nao é exibido o ´ShowMessage´

- Ja tentei com o componente TImage e TDBImage... com ambos gera o mesmo erro.

Obs: baixei um componente sugerido por um colega do forum. ´eDBImage´, porem nao consegui instala-lo, entao preferia que fosse com os componentes nativos do delphi...

se alguem puder me ajudar...

Abraços!


Mahdak

Mahdak

Curtidas 0

Respostas

Mahdak

Mahdak

10/02/2006

pessoal, estou fazendo assim pra gravar a imagemem jpg:

uses ..... jpeg,Clipbrd;
.
.
.
.
.
.

var 
jpg:TJpegImage;
begin
if OpenPictureDialog1.Execute then 
begin
jpg := TJpegImage.Create;
jpg.LoadFromFile(OpenPictureDialog1.FileName);
clipboard.Assign(jpg);
DBImage1.PasteFromClipboard;
jpg.Free;
end;
end;


- porem ainda continuo tendo o o erro: ´Internal error´ ...
Obs: mesmo com esse erro a imagem é salva na tabela....

Alguem ja passou por isso? alguem poderia me dar uma mão?
Abraços!


GOSTEI 0
Mahdak

Mahdak

10/02/2006

se eu remover essas duas linhas nao acontece o erro:

Dm.Tbl_Corretor.post;
Dm.Tbl_Corretor.applyupdates;

porem nao salva....

e agora..... :cry:


GOSTEI 0
Martins

Martins

10/02/2006

Vamos tentar assim:

Dm.Tbl_Corretor.Append; 
Dm.Tbl_CorretorImagem.Assign(OpenPictureDialog1.FileName); 
Dm.Tbl_Corretor.post; 
Dm.Tbl_Corretor.applyupdates; 
showMessage(´imagem gravada com sucesso´); 


Espero q funcione para o q vc deseja!


GOSTEI 0
Martins

Martins

10/02/2006

Corrigindo o post anterior.

var
 Img: TJpegImage;
 BStream : TBlobStream;
begin
  Dm.Tbl_Corretor.Append; 
  BStream := TBlobStream.Create((Imagem as BlobField), BMWrite);
  Img := TJpegImage.Create;
  Img.LoadFromFile(OpenPictureDialog.FileName);
  Img.SaveToStream(BStream);
  BStrteam.Free;
  Img.Free;
  Dm.Tbl_Corretor.post; 
  Dm.Tbl_Corretor.applyupdates; 
  showMessage(´imagem gravada com sucesso´); 
end;


Boa Sorte!!!


GOSTEI 0
Mahdak

Mahdak

10/02/2006

erro:
-----

[Error] U_Corretor.pas(431): Incompatible types: ´TPersistent´ and ´TFileName´


GOSTEI 0
Mahdak

Mahdak

10/02/2006

erro: ----- [Error] U_Corretor.pas(431): Incompatible types: ´TPersistent´ and ´TFileName´


opa, desculpa nao tinha visto a correção do código, mas o delphi gerou o seguinte erro:

[Error] U_Corretor.pas(374): Undeclared identifier: ´TBlobStream´


Será que tem que eclarar algo em USES???


GOSTEI 0
Mahdak

Mahdak

10/02/2006

uses

DBTables


GOSTEI 0
Mahdak

Mahdak

10/02/2006

só mais uma pergunta...

BStream := TBlobStream.Create((Imagem as TBlobField), BMWrite);

´Imagem´ é um campo certo?? que campo é esse???


GOSTEI 0
Mahdak

Mahdak

10/02/2006

ok fiz assim:
var
Img:TJpegImage;
BStream : TBlobStream;
Imagem:TBlobField;

Dm.Tbl_Corretor.Append;
BStream := TBlobStream.Create((Imagem as TBlobField), BMWrite);
Img := TJpegImage.Create;
Img.LoadFromFile(OpenPictureDialog1.FileName);
Img.SaveToStream(BStream);
BStream.Free;
Img.Free;


- Deu erro de Acess Violation at adress.....


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

10/02/2006

[i:75ad7c0d9a]Imagem[/i:75ad7c0d9a] é o próprio campo!
var 
  Img:TJpegImage; 
  BStream : TBlobStream; 
begin
  Dm.Tbl_Corretor.Append; 
  BStream := TBlobStream.Create((Dm.Tbl_CorretorImagem as TBlobField), BMWrite); 
  Img := TJpegImage.Create; 
  Img.LoadFromFile(OpenPictureDialog1.FileName); 
  Img.SaveToStream(BStream); 
  BStream.Free; 
  Img.Free;
  Dm.Tbl_Corretor.Post;
end;



GOSTEI 0
Martins

Martins

10/02/2006

[i:f6926dc169]Imagem[/i:f6926dc169] é o próprio campo!
var 
  Img:TJpegImage; 
  BStream : TBlobStream; 
begin
  Dm.Tbl_Corretor.Append; 
  BStream := TBlobStream.Create((Dm.Tbl_CorretorImagem as TBlobField), BMWrite); 
  Img := TJpegImage.Create; 
  Img.LoadFromFile(OpenPictureDialog1.FileName); 
  Img.SaveToStream(BStream); 
  BStream.Free; 
  Img.Free;
  Dm.Tbl_Corretor.Post;
end;


Valew pela contribuição [b:f6926dc169]Emerson.en[/b:f6926dc169]!


GOSTEI 0
Mahdak

Mahdak

10/02/2006

emerson, muito obrigado ela contribuição.... nao queria parecer chato, mas eh que fiz tudo certinho como vc disse e dessa vez o erro foi o seguinte:

´Invalid Class Typecast.´

o que poderia ser isso?


GOSTEI 0
Mahdak

Mahdak

10/02/2006

sobe


GOSTEI 0
Martins

Martins

10/02/2006

[b:86487f664a]Vejamos esse código q eu passei para o FabianoNovo[/b:86487f664a]

procedure TFrmFabianovo.LoadFotoBanco(Arquivo: String); 
Var 
stImagem: TFileStream; 
begin 
  stImagem := TFileStream.Create( Arquivo, fmOpenRead or 
  fmShareDenyWrite ); 
  Try 
   ibdsClienteFOTO.LoadFromStream( stImagem ); 
  Finally 
  stImagem.Free; 
End; 
end; 

procedure TFrmFabianovo.GetImgBanco(var foto: TImage); 
Var 
jpgImg: TJPEGImage; 
stMem: TMemoryStream; 
begin 
  If ibdsClienteFOTO.IsNull Then Exit; 
  jpgImg := TJPEGImage.Create; 
  stMem := TMemoryStream.Create; 
  Try 
    ibdsClienteFOTO.SaveToStream( stMem ); 
  stMem.Position := 0; 
  jpgImg.LoadFromStream( stMem ); 
  foto.Picture.Assign( jpgImg ); 
  Finally 
  stMem.Free; 
  jpgImg.Free; 
End; 
end;    


Estou usando TImage no lugar de TDBImage


GOSTEI 0
Mahdak

Mahdak

10/02/2006

Martins, onde está a referencia ao caminho da imagem ´OpenPictureDialog1.FileName´??
fiz desse jeito e ele gerou um erro: ´JPG error #42´

Abraços!


GOSTEI 0
Martins

Martins

10/02/2006

Martins, onde está a referencia ao caminho da imagem ´OpenPictureDialog1.FileName´?? fiz desse jeito e ele gerou um erro: ´JPG error #42´ Abraços!


proceure TForm1.BtnFotoClick(Sender: TObject);
begin
  OpendDialog1.Execute;
  LoadFotoBanco(OpenDialog1.FileName); 
  GetImgBanco(Image1);
end;


Qual o seu Banco de Dados?

vc deseja exibir a imagem dentro de um TDBImage?

Boa sorte!!!
[/code]


GOSTEI 0
Mahdak

Mahdak

10/02/2006

Qual o seu Banco de Dados? vc deseja exibir a imagem dentro de um TDBImage? Boa sorte!!!


- Meu banco é Firebird 1.5

- campo da tabela := BLOB SUB_TYPE 0 SEGMENT SIZE 80,

- Nao precisa ser necessáriamente dentro de um TDBImage. eu conseguindo que a imagem seja salva certinho e conseguindo visualiza-la depois pode ser até dentro de um BitBtn ehehehehee... eu to meio apavorado aqui com isso... vou dar uma olhada no que vc acabou de postar...

Valleu, e abração!


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

10/02/2006

quais os componentes de acesso?


GOSTEI 0
Mahdak

Mahdak

10/02/2006

quais os componentes de acesso?


Componentes de acesso:
------------------------------
- TIBDataBase
- TIBTransaction
- TIBDataSet
- DataSource

Componentes do formulario:
---------------------------------
- TDBImage ou TImage (atualmente uso TDBImage)
- TOpenPictureDialog (ja vi exemplos que usavam TOpenDialog, mas acho que nao seria o caso neh?)


Emerson, se voce puder me dar uma mão com isso....
Abração!


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

10/02/2006

eu fiz assim:
[b:5bddd721fe]procedimento para gravar a imagem:[/b:5bddd721fe]
procedure Grava_Imagem_JPEG(Campo:TBlobField; Foto:TImage; Dialogo: TOpenPictureDialog);
var
  Img: TJpegImage;
begin
  if not (Campo.DataSet.State in [dsEdit, dsInsert]) then
  begin
    if Campo.DataSet.IsEmpty
    then Campo.DataSet.Append
    else Campo.DataSet.Edit;
  end;

  if Campo.DataSet.State = dsInsert then
    Campo.DataSet.FieldByName(´codigo´).AsInteger := GetTickCount;

  Img := TJpegImage.Create;
  Img.LoadFromFile(Dialogo.FileName);
  TBlobField(Campo.DataSet.FieldByName(´imagem´)).Assign( Img );
  Foto.Picture.Assign( Img );
  Img.Free;
end;

[b:5bddd721fe]procedimento para ler a imagem:[/b:5bddd721fe]
procedure Le_Imagem_JPEG(Campo:TBlobField; Foto:TImage);
var
  MS: TMemoryStream;
  MinhaImagem: TJPEGImage;
begin
  if Campo.AsString <> ´´ Then
  begin
    MS := TMemoryStream.Create;
    Campo.SaveToStream(MS);
    MinhaImagem := TJPEGImage.Create;
    MinhaImagem.Assign( Campo );
    Foto.Picture.Assign( MinhaImagem );
    MS.Free;
    MinhaImagem.Free;
  end
end;


coloquei, no evento AfterScroll:
  try
    if DataSet.Active then
      Le_Imagem_JPEG(TBlobField(DataSource1.DataSet.FieldByName(´imagem´)),Image1);
  except
  end;


e, no botão para gravação da imagem:
  if OpenPictureDialog1.Execute then
    Grava_Imagem_JPEG(TBlobField(IBDataset1.fieldByName(´Imagem´)),Image1,OpenPictureDialog1);


[color=blue:5bddd721fe][size=18:5bddd721fe][b:5bddd721fe]além disso, alterei, no IBDataset, as propriedades[/b:5bddd721fe][/size:5bddd721fe][/color:5bddd721fe]
DeleteSQL,
ModifySQL,
RefreshSQL
de modo a ter somente os campos-chave no where (tirei o campo imagem do where)


GOSTEI 0
Helio Nascimento

Helio Nascimento

10/02/2006

Caro Emerson

eu fiz assim:
procedimento para gravar a imagem:
Código:
procedure Grava_Imagem_JPEG(Campo:TBlobField; Foto:TImage; Dialogo: TOpenPictureDialog);
var
  Img: TJpegImage;
begin
  if not (Campo.DataSet.State in [dsEdit, dsInsert]) then
  begin
    if Campo.DataSet.IsEmpty
    then Campo.DataSet.Append
    else Campo.DataSet.Edit;
  end;

  if Campo.DataSet.State = dsInsert then
    Campo.DataSet.FieldByName(´codigo´).AsInteger := GetTickCount;

  Img := TJpegImage.Create;
  Img.LoadFromFile(Dialogo.FileName);
  TBlobField(Campo.DataSet.FieldByName(´imagem´)).Assign( Img );
  Foto.Picture.Assign( Img );
  Img.Free;
end;

procedimento para ler a imagem:
Código:
procedure Le_Imagem_JPEG(Campo:TBlobField; Foto:TImage);
var
  MS: TMemoryStream;
  MinhaImagem: TJPEGImage;
begin
  if Campo.AsString <> ´´ Then
  begin
    MS := TMemoryStream.Create;
    Campo.SaveToStream(MS);
    MinhaImagem := TJPEGImage.Create;
    MinhaImagem.Assign( Campo );
    Foto.Picture.Assign( MinhaImagem );
    MS.Free;
    MinhaImagem.Free;
  end
end;


coloquei, no evento AfterScroll:
Código:
  try
    if DataSet.Active then
      Le_Imagem_JPEG(TBlobField(DataSource1.DataSet.FieldByName(´imagem´)),Image1);
  except
  end;


e, no botão para gravação da imagem:
Código:
  if OpenPictureDialog1.Execute then
    Grava_Imagem_JPEG(TBlobField(IBDataset1.fieldByName(´Imagem´)),Image1,OpenPictureDialog1);


além disso, alterei, no IBDataset, as propriedades
DeleteSQL,
ModifySQL,
RefreshSQL
de modo a ter somente os campos-chave no where (tirei o campo imagem do where)
_________________
Sem "saber" que era impossível, ele foi lá e fez...


- Caro Amigo Emerson, neste exemplo daria para inserir um arquivo *.doc ?
É que precisaria gravar algumas ´matrizes´ no Word para depois recupera-la e substituir trechos - São pequenos ´Impressos´ e Contratos efetuados no Word, e gostaria de salvá-los num campo tipo Blob (imagem ou texto?) e depois recuperá-los para serem regravados com outro nome após as alterações. utilizo o Firebird 1.5x Conecção com o DBExpress e com o D7.
Sds/Hélio


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

10/02/2006

sim, é possível, mas não com esse exemplo, pois foi desenvolvido para arquivos JPG.

primeiro: seu campo deve ser BLOB SUB_TYPE 0 SEGMENT SIZE 80 (procure mais sobre os campos BLOB do FB na internet), que é um campo tipo binário (SUB_TYPE 0).

depois, creio que basta vc fazer:
para gravar na tabela:
TBlobField( SeuCampo ).LoadFromFile( SeuArquivo.doc );

para recuperar da tabela:
TBlobField( SeuCampo ).SaveToFile( AlgumArquivo.doc );


GOSTEI 0
POSTAR