-
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