Сохранение компоненты как псевдосвойства

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Сохранение компоненты как псевдосвойства

Сообщение gluhow » 11.10.2018 10:27:20

Хочу при сохранении класса сохранить еще один класс как свойство
Код: Выделить всё
  { TAddData }

  TAddData=class(TComponent)
  private
    FTest: String;
  published
    property Test:String read FTest write FTest;
  end;

  { TSaveData }

  TSaveData=class(TComponent) //Класс который буду сохранять
  private
    procedure WriteAddProp(Writer: TWriter);
    public
      procedure DefineProperties(Filer: TFiler); override;
  end;

implementation
{ TSaveData }

procedure TSaveData.WriteAddProp(Writer: TWriter);
begin
  Writer.WriteComponent(TAddData.Create(Self)); //Пытаюсь записать еще один компонент. При вызове других свойств (WriteInteger и т.п.) всё нормально
end;

procedure TSaveData.DefineProperties(Filer: TFiler);
begin
  inherited DefineProperties(Filer);
  Filer.DefineProperty('AddProp', nil, @WriteAddProp, True);
end;


Само сохранение:
Код: Выделить всё
procedure TForm1.Button1OnCLick(Sender: TObject);
var
  MemStream:TMemoryStream;
  TxtStream:TStringStream;
begin
  MemStream:=TMemoryStream.Create;
  MemStream.WriteComponent(TSaveData.Create(self)); //При записи всё нормально
  MemStream.Position:=0;
  TxtStream:=TStringStream.Create('');
  LRSObjectBinaryToText(MemStream, TxtStream); //Здесь возникает ошибка
  Memo1.Text:=TxtStream.DataString;
end;


Возникает ошибка "Stream read error". Это я делаю что-то не так или это баг?
gluhow
новенький
 
Сообщения: 41
Зарегистрирован: 13.08.2015 15:30:20

Re: Сохранение компоненты как псевдосвойства

Сообщение serbod » 11.10.2018 11:19:43

Зачем так сложно, можно сразу WriteComponentAsBinaryToStream(AStream, AComponent);
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Сохранение компоненты как псевдосвойства

Сообщение gluhow » 12.10.2018 10:21:32

Так сложно только затем чтобы показать что ошибка возникает не при сохранении компоненты в поток, а при попытке этот поток перевести в текст.
т.е если пользоваться WriteComponentAsBinaryToStream, то всё без ошибок (правда восстанавливать не пробовал), а при использовании WriteComponentAsTextToStream возникает та же самая ошибка.
Возможно я нашел ответ здесь: http://docs.embarcadero.com/products/ra ... onent.html
WriteComponent is used internally in the component streaming system, but can also be called directly when writing components to memory streams or database blobs. WriteComponent constructs a writer object and calls its WriteRootComponent method to write the component specified by Instance, and its owned objects, to the stream.

Правда говорится о RAD Studio, а не про паскаль
gluhow
новенький
 
Сообщения: 41
Зарегистрирован: 13.08.2015 15:30:20


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 28

Рейтинг@Mail.ru