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

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

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

Ответить
gluhow
новенький
Сообщения: 41
Зарегистрирован: 13.08.2015 14:30:20

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

Сообщение gluhow »

Хочу при сохранении класса сохранить еще один класс как свойство

Код: Выделить всё

  { 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". Это я делаю что-то не так или это баг?
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

Зачем так сложно, можно сразу WriteComponentAsBinaryToStream(AStream, AComponent);
gluhow
новенький
Сообщения: 41
Зарегистрирован: 13.08.2015 14:30:20

Сообщение gluhow »

Так сложно только затем чтобы показать что ошибка возникает не при сохранении компоненты в поток, а при попытке этот поток перевести в текст.
т.е если пользоваться 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, а не про паскаль
Ответить