Конференция "Компоненты" » как сериализовать битмап? [D7, WinXP]
 
  • alexrayne (26.09.09 15:38) [0]
    Драсте.
    надо вручную сериализовать свойство битмап.
    все уперлось в то что TWriter/TReader хоть и умеют сериализовать Tpersistent но ети методы у него положены в protected и ессно недоступны.
    поделитесь кто как справляется?
  • Сергей М. © (26.09.09 16:07) [1]
    У TBitmap есть св-вf LoadFrom/SaveToStream, разве этого не достаточно ?
  • Сергей М. © (26.09.09 16:33) [2]
    procedure TMyPersistentObject.LoadBitmapProperty(Reader: TReader);
    var
      ms: TMemoryStream;
    begin
       ms := TMemoryStream.Create;
       try
          ms.Size := Reader.ReadInt64;
          Reader.Read(ms.Memory^, ms.Size);
          MyBitmapProperty.LoadFromStream(ms);
       finally
         ms.Free;
       end;
    end;

    procedure TMyPersistentObject.StoreBitmapProperty(Writer: TWriter);
    var
      ms: TMemoryStream;
      Size: Int64;
    begin
       ms := TMemoryStream.Create;
       try
          MyBitmapProperty.SaveToStream(ms);
          Size := ms.Size;      
          Writer.Write(Size, SizeOf(Size));
          Writer.Write(ms.Memory^, Size);
       finally
         ms.Free;
       end;
    end;

    procedure TMyPersistentObject.DefineProperties(Filer: TFiler);
    begin
     inherited;
     Filer.DefineProperty('MyBitmapProperty', LoadBitmapProperty, StoreBitmapProperty, True);
    end;

  • alexrayne (26.09.09 23:10) [3]
    Удалено модератором
  • alexrayne (26.09.09 23:19) [4]
    на фрипаскаль.ру предложили сделать наследника tbitmap своего с опубликоваными методами Store\LoadData
  • DimaBr © (28.09.09 08:41) [5]
    > надо вручную сериализовать свойство битмап.
    Это вуже реализовано

    procedure TBitmap.WriteData(Stream: TStream);
    begin
     WriteStream(Stream, True);
    end;

    procedure TBitmap.ReadData(Stream: TStream);
    var Size: Longint;
    begin
     Stream.Read(Size, SizeOf(Size));
     ReadStream(Stream, Size);
    end;



    >ети методы у него положены в protected и ессно недоступны
    До них можно достучаться через наследника
  • Григорьев Антон © (28.09.09 11:10) [6]
    Делал сериализацию сложного свойства, включающего в себя Bitmap'ы. Исходники можно взять здесь: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1400 Ищите там класс TBitmapCellBank (модуль CellBanks) и его методы SavePictures и LoadPictures, это в нём.
  • alexrayne (29.09.09 16:35) [7]
    оказывается борландовцы еще еинтереснее прикольнулись - они для сериализации TGraphic  делают так
    procedure TGraphic.DefineProperties(Filer: TFiler);

     function DoWrite: Boolean;
     begin
       if Filer.Ancestor <> nil then
         Result := not (Filer.Ancestor is TGraphic) or
           not Equals(TGraphic(Filer.Ancestor))
       else
         Result := not Empty;
     end;

    begin
     Filer.DefineBinaryProperty('Data', ReadData, WriteData, DoWrite);
    end;

    здесь уже Write/ReadData типа TStreamProc и соответственно они есть обертки для методов read/SavetoStream
 
Конференция "Компоненты" » как сериализовать битмап? [D7, WinXP]
Есть новые Нет новых   [134466   +3][b:0][p:0.001]