Hallo!
Ich greife mit Hilfe von
ADO auf eine MS
Access DB zu. In dieser
DB sind auch Bilder abgelegt. Ich kann mir die Bilder anzeigen lassen und auch welche abspeichern. Wenn allerdings für den aktuellen Datensatz kein Bild vorhanden ist, soll eine Meldung mit dem Hinweis das kein Bild vorhanden ist herscheinen. Ich habe das Problem versucht mit den beiden unten stehenden Methoden zu lösen. Es erscheint aber eine Stream-Read-Fehlermeldung wenn kein Bild vorhanden ist. Der except-Fall wird in der Procedure also nicht durchlaufen. Hat jemand eine Idee?
Grüße Sven
Delphi-Quellcode:
procedure TForm_Hauptformular.But_Foto_anzeigenClick(Sender: TObject);
var
bS : TADOBlobStream;
Pic : TJpegImage;
begin
bS := TADOBlobStream.Create(DM.Ado_T_SpielplaetzeFoto, bmRead);
try
try
bS.Seek(JpegStartsInBlob(DM.Ado_T_SpielplaetzeFoto), soFromBeginning);
Pic:=TJpegImage.Create;
try
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
finally
Pic.Free;
end;
finally
bS.Free
end;
except
on EStreamError do
MessageDlg('Für diesen Datensatz ist kein Foto vorhanden!', mtInformation, [mbOK], 0);
end;
end;
function TForm_Hauptformular.JpegStartsInBlob(PicField:TBlobField):integer;
var
bS : TADOBlobStream;
buffer : Word;
hx : string;
begin
Result := -1;
bS := TADOBlobStream.Create(PicField, bmRead);
try
while (Result = -1) and
(bS.Position + 1 < bS.Size) do
begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'FF' then begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'D8' then Result := bS.Position - 2
else if hx = 'FF' then
bS.Position := bS.Position-1;
end;
end;
finally
bS.Free
end;
end;