Страница 1 из 1

как сериализовать свойство битмап?

СообщениеДобавлено: 26.09.2009 15:44:23
alexrayne
драсте
понадобилось вручную сериализоват свойство битмапа. уперся в то что TWriter\Treader методы Write\ReadPersistent запрятали в protected, у TGraphic таже беда, и получеся крутись как хочеш.
поделитесь кто как правляется.

Re: как сериализовать свойство битмап?

СообщениеДобавлено: 26.09.2009 16:35:24
carrots
Может подробнее о задаче расскажешь, а то я почти ничего не понял.
В любом случае в TGraphic все методы прописаны виртуальными, так что берешь и накладываешь.

Код: Выделить всё
TMyBitmap = class(TBitmap)
  protected
    procedure ReadData(Stream: TStream); override;
    procedure WriteData(Stream: TStream); override;
  private
    { private declarations }
  public
    { public declarations }
end; 

Re: как сериализовать свойство битмап?

СообщениеДобавлено: 26.09.2009 23:15:43
alexrayne
делать наследника TBitmap своего и переобъявить его методы Store/ReadData публичными, так я вас понял?
ну вообче ето интересно. по сравнению с вариантом лобовым - сериализовать через MemoryStream, это наверно проще таки.

Re: как сериализовать свойство битмап?

СообщениеДобавлено: 29.09.2009 16:35:58
alexrayne
оказывается борландовцы еще еинтереснее прикольнулись - они для сериализации 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

Re: как сериализовать свойство битмап?

СообщениеДобавлено: 29.09.2009 18:19:31
carrots
Честно говоря не понятно в чем у вас проблема, какая у вас задача. Мне уже много приходилось сохранять и восстанавливать разные компоненты и их свойства, никогда в этом особых проблем не было (Если вам нужно сохранить какие-то свойства в Stream - вам для этого не нужны никакие спрятанные функции... Если нужно сохранить изображение - используйте SaveToStream, а если свойство - Stream.write()).



Если вам нужно перевести свойство битмапа не в стрим, то ответ будет зависить от того куда вам его нужно перевести.

Для чего и какое свойство вам нужно сериализовать?

Re: как сериализовать свойство битмап?

СообщениеДобавлено: 29.09.2009 22:51:03
Timid
Обычное преобразование потока в base64 можно сделать.
Зачем нужно что-то еще изобретать?

Re: как сериализовать свойство битмап?

СообщениеДобавлено: 01.10.2009 21:54:17
alexrayne
надо просто сохранять битмап в ресурсы по условию, проблема была в том что собственные методы сериализации битмапа закрыты, решил ето как и говорили выше - написал наследника.
работа через стримы открытыми методами требует использования промежуточного буфера - tmemorystream например, но ето сложнее