0

Delphiでアプリケーションを開発しています。データベースに保存されている画像を抽出して保存し、動的に入力される他のフォームに配置されたコントロールにTMemoryStream同じ画像をロードしようとしています。ストリームからフォームに配置されたイメージ コントロールにイメージをロードしようとすると、アクセス違反エラーが発生しTImageます

エラーの説明は次のとおりです

モジュール abc.exe のアドレス 00B548C でアクセス違反が発生しました。アドレス 0000000 の読み取り

私のコードスニペットは次のとおりです

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;
4

2 に答える 2

5

TPictureはストリーム内のグラフィック タイプを判別できないため、事前に指定する必要があります。JPEG 画像しかない場合は、それをハードコーディングできます。それ以外の場合は、画像形式もデータベースに保存する必要があります。

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;
于 2016-06-29T13:46:58.857 に答える
2

Graphic.LoadfromStream を参照しています。しかし、Graphic は存在しない可能性があります (おそらく存在しません)。ファイルに保存し、代わりに Picture.LoadFromFile を使用するか (適切な TGraphic の子孫が作成されるため)、まず Picture.Graphic を適切なタイプ (TBitmap など) として作成します。

Picture.Graphic := TBitMap.Create;

現状では、画像はデータのグラフィック形式を認識していません。何らかの方法でそれを伝える必要があります。

于 2016-06-29T13:55:34.300 に答える