2016-06-29 4 views
0

Je développe une application dans Delphi. J'essaie d'extraire une image qui est enregistrée dans la base de données, enregistrez-le à TMemoryStream et charger la même image au TImage contrôle placé sur un autre formulaire qui va remplir dynamiquement. Je reçois erreur de violation d'accès lorsque j'essaie de charger l'image du flux au contrôle d'image placé sur le formulaire.Erreur de violation d'accès à delphi lors de la sauvegarde/du chargement de l'image vers/depuis le flux

Description de l'erreur est la suivante

violation d'accès à 00B548C d'adresse dans le module abc.exe. Lire d'adresse 0000000

Mon extrait de code est comme suit

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

Avez-vous vérifié pour Image1.Picture.Graphic <> nil? Savez-vous quel type d'image est dans la base de données? –

+0

jpg image est dans la base de données ... en fait, je le teste avec seulement la ligne de base de données ayant une image. –

+1

Donc faire du débogage. Vous avez un pointeur 'nil' quelque part où vous ne vous attendez pas. Votre travail consiste à déterminer où. Si vous ne savez pas comment déboguer ce code, alors votre vrai problème n'est pas ce code, mais vos compétences de débogage. Corrigez les compétences de débogage et ce problème disparaîtra, et tous les autres l'aimeront dans le futur. En d'autres termes, chercher à acquérir des compétences. –

Répondre

4

TPicture n'est pas en mesure de déterminer le type de graphique dans le flux, donc vous devez le dire avant. Si vous avez seulement des images JPEG, vous pouvez simplement le coder en dur. Sinon, vous devez également stocker le format d'image dans la base de données.

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

Vraiment incroyable ... Il fonctionne comme charme maintenant ... Chapeau à vos efforts .. –

2

Vous faites référence à Graphic.LoadfromStream. Mais Graphic ne peut pas (probablement pas) exister. Vous pouvez enregistrer dans un fichier et utiliser Picture.LoadFromFile à la place (car cela créera le descendant TGraphic approprié) ou créer Picture.Graphic comme type approprié (par exemple TBitmap) en premier.

Picture.Graphic := TBitMap.Create; 

En l'état actuel de l'image n'a aucune idée de ce format graphique de vos données. Vous aurez besoin de le dire en quelque sorte.