2016-06-29 19 views
0

Ich entwickle eine Anwendung in Delphi. Ich versuche, ein Bild zu extrahieren, das in Datenbank gespeichert wird, speichern Sie es in TMemoryStream, und laden Sie dasselbe Bild um TImage Steuerelement, das auf anderem Formular platziert wird, das dynamisch aufgefüllt wird. Ich erhalte Zugriffsverletzung Fehler, wenn ich versuche, Bild von Stream zu Bildkontrolle auf dem Formular platziert zu laden.Zugriffsverletzung Fehler in Delphi beim Speichern/Laden Bild in/aus Stream

Fehler Beschreibung ist als

Verletzung Zugriff folgt an der Adresse 00B548C in Modul abc.exe. vor Lesen der Adresse 0000000

Mein Code-Schnipsel ist wie folgt

UniConnection1.Connected := true; 
UniQuery2.SQL.Text := 'Select image from userplays where id = :id'; 
UniQuery2.Params.ParamByName('id').Value := idpub1; 
UniQuery2.Open; 
if UniQuery2.FieldByName('image').AsString <> '' then 

begin  
    try 
    Stream121 := TMemoryStream.Create; 
    TBlobField(UniQuery2.FieldByName('image')).SaveToStream(Stream121); 
    Stream121.Position := 0; 
     if Assigned(Stream121) then 
     begin 
     Image1.Picture.Graphic.LoadFromStream(Stream121); 
     Image1.Update; 
     end; 

    finally 
     Stream121.Free; 
    end; 
end; 
+1

Haben Sie nach Image1.Picture.Graphic <> nil überprüft? Weißt du, welche Art von Bild in der Datenbank ist? –

+0

JPG-Bild ist in der Datenbank ... tatsächlich teste ich es nur mit Datenbankzeile mit Bild. –

+1

Also einige Debugging. Sie haben einen 'Nil'-Zeiger irgendwo, den Sie nicht erwarten. Ihre Aufgabe ist es, herauszufinden, wo. Wenn Sie nicht wissen, wie Sie diesen Code debuggen können, ist Ihr wirkliches Problem nicht dieser Code, sondern Ihre Debugging-Fähigkeiten. Repariere die Debugging-Fähigkeiten und dieses Problem wird verschwinden, und jeder andere mag es in der Zukunft. Mit anderen Worten, versuchen Sie, Fähigkeiten zu erlernen. –

Antwort

4

TPicture nicht in der Lage ist, den Grafiktyp im Stream, um zu bestimmen, so dass Sie es zu sagen haben. Wenn Sie nur JPEG-Bilder haben, können Sie dies einfach fest codieren. Ansonsten sollten Sie das Bildformat auch in der Datenbank speichern.

var 
    graphic: TGraphic; 

Stream121.Position := 0; 
if Stream121.size > 0 then begin 
    graphic := TJPEGImage.Create; 
    try 
    graphic.LoadFromStream(Stream121); 
    Image1.Picture.Graphic := graphic; 
    finally 
    graphic.Free; 
    end; 
end; 
+1

Wirklich erstaunlich ... Es funktioniert jetzt wie Charme ... Hut ab vor deinen Bemühungen .. –

2

Sie beziehen sich auf Graphic.LoadfromStream. Aber Grafik möglicherweise nicht (wahrscheinlich nicht). Sie könnten in eine Datei speichern und stattdessen Picture.LoadFromFile verwenden (da dies den entsprechenden TGraphic-Nachfolger erzeugt) oder Picture.Graphic als geeigneten Typ (z. B. TBitmap) zuerst erstellen.

Picture.Graphic := TBitMap.Create; 

Als sie das Bild steht, hat keine Ahnung von dem, was Grafikformat Ihre Daten sind in. Sie müssen es irgendwie erzählen.