Hallo!
Ich habe eine
Paradox-Datenbank, in der ich Jpg-Bilder speichern will. Das funktioniert inzwischen auch.
Allerdings bekomme ich beim Lesen aus dem BLOB-Field, welches ich für das Jpg-Bild verwende manchmal einen Fehler.
Wenn ich direkt nach dem Schreiben in die Datenbank das Bild wieder auslesen möchte, bekomme ich den Fehler "BLOB nicht geöffnet". Wenn ich das Programm gerade erst gestartet hab, funktioniert alles wunderbar, auch wenn ich zwischendurch ein anderes Bild noch speichere kann ich das davor öffnen, nur immer das letzte nicht.
Hier mein Code zum Schreiben (das Bild wird geladen (BMP oder JPG) und wird erst auf eine bestimmte Größe verkleinert):
Delphi-Quellcode:
procedure TMainForm.LoadPictureAndPost(const FN: String);
var
BMP, BMP2: TBitmap;
JPG: TJpegImage;
M: TStream;
f: Double;
r1, r2: Double;
begin
BMP := TBitmap.Create;
try
if LowerCase(ExtractFileExt(FN)) = '.jpg' then begin
Jpg := TJPEGImage.Create;
try
Jpg.LoadFromFile(FN);
BMP.Assign(Jpg);
finally
Jpg.Free;
end;
end else BMP.LoadFromFile(FN);
BMP2 := TBitmap.Create;
try
r1 := PIC_MAX_HEIGHT / PIC_MAX_WIDTH;
r2 := BMP.Height / BMP.Width;
if r1 > r2 then begin
f := PIC_MAX_WIDTH / BMP.Width;
BMP2.Width := PIC_MAX_WIDTH;
BMP2.Height := Trunc(BMP.Height * f);
end else begin
f := PIC_MAX_HEIGHT / BMP.Height;
BMP2.Height := PIC_MAX_HEIGHT;
BMP2.Width := Trunc(BMP.Width * f);
end;
BMP2.Canvas.StretchDraw(BMP2.Canvas.ClipRect, BMP);
Jpg := TJPEGImage.Create;
try
Jpg.Assign(BMP2);
M := PersonTable.CreateBlobStream(PersonTable.FieldByName('Bild'), bmWrite);
try
Jpg.SaveToStream(M);
PersonTable.Post;
finally
M.Free;
end;
finally
Jpg.Free;
end;
finally
BMP2.Free;
end;
finally
BMP.Free;
end;
end;
Code zum lesen:
Delphi-Quellcode:
procedure TMainForm.DBGrid1CellClick(Column: TColumn);
var
M: TStream;
Jpg: TJPegImage;
begin
if TBlobField(PersonTable.FieldByName('Bild')).IsNull then Exit;
M := PersonTable.CreateBlobStream(TBlobField(PersonTable.FieldByName('Bild')), bmRead);
try
M.Position := 0;
Jpg := TJPEGImage.Create;
try
Jpg.LoadFromStream(M);
Image1.Picture.Assign(Jpg);
finally
Jpg.Free;
end;
finally
M.Free;
end;
end;
PS: Habe auch schon im Forum gesucht, allerdings hat mir
dieser Thread nicht geholfen bzw weiß ich nicht wie ich die
API einsetzen soll?