Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > проблемы с TPersistent


Автор: artemiy 23.3.2007, 19:34
Прочитал статью http://forum.vingrad.ru/topic-94245/view-all.html и решил в стандартный пример добавить свой элементы и попытаться сохранить его. Первый запуск и сохранение произошло нормально. А вот уже на втором запуске вылетела ошибка ("access violation...", строка 6):
Код

procedure ReadObj(obj: TPersistent; st: TStream);
begin
  with TObjReader.Create(st, 1) do
  begin
    while st.Position < st.Size do
    try ReadProperty(obj); except Continue; end;
    Free;
  end;
end;

Где я не прав и что нужно исправить? Исходники в приложении. А то голова в конце недели слабо соображает ))

Автор: Snowy 23.3.2007, 20:36
C контролами данный пример не работает - контролы требуют особого обращения.
Заведи переменную, типа string и пусть она ссылается на Memo.Text.
Тебе ж только текст сохранять нужно.

Автор: artemiy 23.3.2007, 22:25
Ну в принципе да. Но это я взял только для примера, чтобы разобраться как все работает. А вообще мне нужно будет сохранять свои собственные типы. 
Надеюсь с этим проблем не будет? Ща попробую...

Автор: artemiy 24.3.2007, 15:58
Попробовал сохранять собственные типы. Теперь все работает без ошибок, но, правда, и не сохраняет :(  smile 
Может быть здесь что то не так?
Код

type
  TOptions = class(TPersistent)
  private
    FMyStr: string;
    FDateTime: TDateTime;
    FStrings: MyType;
  published
    property DateTime: TDateTime read FDateTime write FDateTime;
    property MyStr: string read FMyStr write FMyStr;
    property Text: MyType read FStrings write FStrings;
  end;

Автор: Snowy 26.3.2007, 12:33
Сохраняются только published property.
А твой MyType - это record. Естественно у него нет published пропертей. Вот и не сохраняется.

Автор: artemiy 26.3.2007, 15:33
Цитата(Snowy)

А твой MyType - это record. Естественно у него нет published пропертей. Вот и не сохраняется.

Понятно...
А есть ли возможность как нибудь сохранить такой record (или еще лучше массив таких record-ов)? Или тут уже TPersistent не поможет?

Автор: Snowy 26.3.2007, 15:52
Можно, но это нужно прописывать вручную.
Лучше преврати свой record в наследника от TPersistent и проблема сама пропадёт smile 

Автор: artemiy 28.3.2007, 17:44
Цитата(Snowy)

Лучше преврати свой record в наследника от TPersistent

Вроде бы превратил... Но все равно не сохраняется массив из этих классов :( Может быть я что то неправильно делаю? (До этого с классами я вообще не работал, поэтому не совсем уверен в правильности моих действий)...

Автор: Snowy 28.3.2007, 17:50
Массивы и списки нельзя разместить в published секции.
Сохраняются исключительно только published свойства.
Всё остальное в автомате сохраняться не будет - только ручками и это отдельная песня.

Автор: artemiy 28.3.2007, 18:13
Какая жаль... Так хотелось этот TPersistent использовать для облегчения себе жизни... Ладно, будем искать другие методы  smile 

Спасибо за помощь  ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)