LoadFromStream не работает в Delphi 5 - PullRequest
0 голосов
/ 26 октября 2018

Я использую Delphi 5 Enterprise, потому что именно для этого была написана программа, с которой я работаю. Я написал процедуру, которая довольно счастливо сохраняет растровые изображения в базе данных Access. Теперь я хочу иметь возможность получать растровые изображения. Сохраняя растровые изображения, я использую SaveToStream. Получая их, я использовал LoadFromStream, но компилятор говорит мне, что он не распознает эту функцию. Код ниже:

 procedure TForm1.Button2Click(Sender: TObject);
 var
    Field : TBlobField;
    Stream : TStream;
    BMap : TBitMapImage;
 begin
   if BloBQuery.Active then
      begin
         Field := TBlobField(BlobQuery.FieldByName('Blob'));
         Stream := BlobQuery.CreateBlobStream(Field, bmRead);
         BMap := TBitMapImage.Create;
      try
         Image2.Picture.Graphic := BMap.LoadFromStream(Stream);
      finally
         BMap.Free;
         Stream.Free;
      end;
   end;
end;

Может кто-нибудь сказать мне, когда LoadFromStream не будет работать? Это кажется странным! Спасибо.

Код, который написал растровое изображение:

    procedure TForm1.Button1Click(Sender: TObject);
var
  Field : TBlobField;
  Stream : TStream;
begin
   if (BlobQuery.Active = True) and (Image1.Picture.Graphic <> nil) then begin
       BlobQuery.Insert;
       Field := TBlobField(BlobQuery.FieldByName('Blob'));
       Stream := BlobQuery.CreateBlobStream(Field, bmWrite);
       try
          Image1.Picture.Graphic.SaveToStream(Stream);
       finally
          Stream.Free;
          BlobQuery.Post;
       end;
   end;
end;

1 Ответ

0 голосов
/ 26 октября 2018

Предполагая, что Image1.Picture.Graphic указывал на объект TBitmap при сохранении его в БД, вам нужно использовать объект TBitmap вместо объекта TBitMapImage при чтении изображения обратно, например:

procedure TForm1.Button2Click(Sender: TObject);
var
  Field : TBlobField;
  Stream : TStream;
  BMap : TBitmap;
begin
  if BlobQuery.Active then
  begin
    Field := TBlobField(BlobQuery.FieldByName('Blob'));
    Stream := BlobQuery.CreateBlobStream(Field, bmRead);
    try
      BMap := TBitmap.Create;
      try
        BMap.LoadFromStream(Stream);
        Image2.Picture.Graphic := BMap;
      finally
        BMap.Free;
      end;
    finally
      Stream.Free;
    end;
  end;
end;

В качестве альтернативы:

procedure TForm1.Button2Click(Sender: TObject);
var
  Field : TBlobField;
  Stream : TStream;
begin
  if BlobQuery.Active then
  begin
    Field := TBlobField(BlobQuery.FieldByName('Blob'));
    Stream := BlobQuery.CreateBlobStream(Field, bmRead);
    try
      Image2.Picture.Bitmap.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
  end;
end;
...