Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ParadoxDB: BLOB nicht geöffnet (https://www.delphipraxis.net/107367-paradoxdb-blob-nicht-geoeffnet.html)

F.W. 26. Jan 2008 15:39

Datenbank: Paradox • Version: ?? • Zugriff über: BDE

ParadoxDB: BLOB nicht geöffnet
 
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz