Gravar campo foto como null
Saudações!!!!
Estou com uma grande dúvida em relação ao campo foto: supondo que este não seja um campo obrigatório, como fazer com que receba um valor null???
Pesquisei muito sobre isso, mas infelizmente não achei nada a respeito. Isso realmente é possível???
Ah, estou usando Delphi 2006 + Firebird + DBExpress + TImage.
[b:1d4ec71d4c]Códigos utilizados:[/b:1d4ec71d4c]
[b:1d4ec71d4c]- Na gravação:[/b:1d4ec71d4c]
procedure Tform1.GravaRegistro;
var
img : TMemoryStream;
begin
if flag = ´I´ then
begin
with ClientDataSet1 do
begin
close;
Params.ParamByName(´NOME´).AsString := edtNome.Text;
if Image1.Picture <> nil then
begin
img := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(img);
Params.ParamByName(´FOTO´).LoadFromStream(img, ftBlob);
finally
img.Free;
end;
end
else
[i:1d4ec71d4c] [b:1d4ec71d4c] //Params.ParamByName(´FOTO´).AsBlob := null;[/b:1d4ec71d4c][/i:1d4ec71d4c]
[b:1d4ec71d4c] eu tentei colocar esta linha, mas dá erro de access violation....[/b:1d4ec71d4c]
execute;
end;
end;
end;
[b:1d4ec71d4c]- Na visualização[/b:1d4ec71d4c]
procedure Tform1.DataSource1DataChange(Sender: TObject; Field: TField);
var
mem : TMemoryStream;
jpg : TJPEGImage;
begin
if not DataSource1.DataSet.IsEmpty then
begin
edtCodigo.Text := inttostr(ClientDataSet2.FieldByName(´ID_CONVIDADO´).AsInteger);
edtNome.Text := ClientDataSet2.FieldByName(´NOME´).AsString;
jpg := TJPEGImage.Create;
mem := TMemoryStream.Create;
try
ClientDataSet2FOTO.SaveToStream(mem);
mem.Position := 0;
jpg.LoadFromStream(mem);
Image1.Picture.Assign(jpg);
finally
jpg.Free;
mem.Free;
end;
end;
end;
Desde já agradeço pela atenção.
[]´s
Rogério
[/b]
Estou com uma grande dúvida em relação ao campo foto: supondo que este não seja um campo obrigatório, como fazer com que receba um valor null???
Pesquisei muito sobre isso, mas infelizmente não achei nada a respeito. Isso realmente é possível???
Ah, estou usando Delphi 2006 + Firebird + DBExpress + TImage.
[b:1d4ec71d4c]Códigos utilizados:[/b:1d4ec71d4c]
[b:1d4ec71d4c]- Na gravação:[/b:1d4ec71d4c]
procedure Tform1.GravaRegistro;
var
img : TMemoryStream;
begin
if flag = ´I´ then
begin
with ClientDataSet1 do
begin
close;
Params.ParamByName(´NOME´).AsString := edtNome.Text;
if Image1.Picture <> nil then
begin
img := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(img);
Params.ParamByName(´FOTO´).LoadFromStream(img, ftBlob);
finally
img.Free;
end;
end
else
[i:1d4ec71d4c] [b:1d4ec71d4c] //Params.ParamByName(´FOTO´).AsBlob := null;[/b:1d4ec71d4c][/i:1d4ec71d4c]
[b:1d4ec71d4c] eu tentei colocar esta linha, mas dá erro de access violation....[/b:1d4ec71d4c]
execute;
end;
end;
end;
[b:1d4ec71d4c]- Na visualização[/b:1d4ec71d4c]
procedure Tform1.DataSource1DataChange(Sender: TObject; Field: TField);
var
mem : TMemoryStream;
jpg : TJPEGImage;
begin
if not DataSource1.DataSet.IsEmpty then
begin
edtCodigo.Text := inttostr(ClientDataSet2.FieldByName(´ID_CONVIDADO´).AsInteger);
edtNome.Text := ClientDataSet2.FieldByName(´NOME´).AsString;
jpg := TJPEGImage.Create;
mem := TMemoryStream.Create;
try
ClientDataSet2FOTO.SaveToStream(mem);
mem.Position := 0;
jpg.LoadFromStream(mem);
Image1.Picture.Assign(jpg);
finally
jpg.Free;
mem.Free;
end;
end;
end;
Desde já agradeço pela atenção.
[]´s
Rogério
[/b]
Roger1976
Curtidas 0
Respostas
Abadia
23/11/2007
Params.ParamByName(´FOTO´).Clear
Não esqueça de ajustar o tipjo do parâmetro
Não esqueça de ajustar o tipjo do parâmetro
GOSTEI 0
Roger1976
23/11/2007
abadia, implementei sua sugestão, mas não deu certo. A propósito, o tipo de parâmetro já está ajustado como ftblob. De qualquer maneira, muito obrigado, e se tiver outras sugestões, por favor poste.
GOSTEI 0
Abadia
23/11/2007
Uma pergunta... quando tu colocas a imagem funciona?
GOSTEI 0
Roger1976
23/11/2007
abadia, com a imagem funciona, mas com uma troca de idéias com outras pessoas, percebi que não é necessário forçar a gravá-lo como null, pq trata-se de um campo não obrigatório (eu achava que o erro ocorria pq o campo deveria receber null). Veja como ficou:
[b:a565740ff2]procedure Tform1.GravaRegistro;[/b:a565740ff2]
var
mem : TMemoryStream;
begin
if flag = ´I´ then
begin
with ClientDataSet1 do
begin
close;
Params.ParamByName(´NOME´).AsString := edtNome.Text;
mem := TMemoryStream.Create;
if Image1.Picture.Graphic <> nil then
begin
try
Image1.Picture.Graphic.SaveToStream(mem);
Params.ParamByName(´FOTO´).LoadFromStream(mem, ftBlob);
finally
freeandnil(mem);
end;
end;
execute;
end;
end;
[b:a565740ff2]end;[/b:a565740ff2]
Eu havia cometido pequenos equívocos:
1) Eu estava criando o objeto mem depois da condição (acho que o correto era criar antes)
2)[b:a565740ff2] if Image1.Picture <> nil then[/b:a565740ff2] ao invés de i[b:a565740ff2]f Image1.Picture.Graphic <> nil then[/b:a565740ff2]
Agora, está funcionando.
Kra, muito obrigado pela força, caso tenha sugestões melhores, fique a vontade.
Um bom fim-de-semana
[b:a565740ff2]procedure Tform1.GravaRegistro;[/b:a565740ff2]
var
mem : TMemoryStream;
begin
if flag = ´I´ then
begin
with ClientDataSet1 do
begin
close;
Params.ParamByName(´NOME´).AsString := edtNome.Text;
mem := TMemoryStream.Create;
if Image1.Picture.Graphic <> nil then
begin
try
Image1.Picture.Graphic.SaveToStream(mem);
Params.ParamByName(´FOTO´).LoadFromStream(mem, ftBlob);
finally
freeandnil(mem);
end;
end;
execute;
end;
end;
[b:a565740ff2]end;[/b:a565740ff2]
Eu havia cometido pequenos equívocos:
1) Eu estava criando o objeto mem depois da condição (acho que o correto era criar antes)
2)[b:a565740ff2] if Image1.Picture <> nil then[/b:a565740ff2] ao invés de i[b:a565740ff2]f Image1.Picture.Graphic <> nil then[/b:a565740ff2]
Agora, está funcionando.
Kra, muito obrigado pela força, caso tenha sugestões melhores, fique a vontade.
Um bom fim-de-semana
GOSTEI 0