![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
persistent в файл [D6, WinXP]
Oleg_ © (2004-11-10 18:24:00)Подскажите как состыковать twriter с TPersistent
на последнюю строку компилятор ругается, В 6 дельфи у twriter нет метода WriteProperties
Wr:TWriter;
fs:tfilestream;
begin
fs:=tfilestream.Create('c:\1.txt',fmOpenWrite);
Wr:=TWriter.create(fs,4096);
wr.WriteProperties(pers);
Digitman (2004-11-11 11:10:00) [1]
> Если же надо сохранить обьект скажем с private полями WriteProperties
> не подойтет, поскольку работает по RTTI.
у TPersistent есть вирт.метод DefineProperties, этому методу не нужна никакая RTTI, метод на то и существует, чтобы манипулировать поточной трансляцией св-в объекта, не фигурирующих в RTTI.
сделай свой класс наследником TComponent, перекрой DefineProperties, в теле перекрытого метода одним или несколькими вызовами DefineProperty() определи перечень сохраняемых/восстанавливаемых неопубликованных св-в
теперь смело сохраняй свой компонент в поток методом Stream.WriteComponent() и считывай из потока свой компонент методом Stream.ReadComponent() - все остальное (всю черновую работу) за тебя Борланд уже сделал
Oleg_ (2004-11-11 09:24:00) [2]да, меня вчера уже начати тезать такие сомнения, а сегодня утром прочитал.
Если же надо сохранить обьект скажем с private полями WriteProperties не подойтет, поскольку работает по RTTI.
Остается писать для каждого класса свои методы save/load?
Кодгда-то краем уха слышал про возможность сохранения обьекта помещенного в контейнер.
jack128 (2004-11-10 21:44:00) [3]Oleg_ (10.11.04 21:27) [5]
RTTI генерируется только для published свойств
Oleg_ (2004-11-10 21:27:00) [4]Файл остается практически пустой и размер его всегда 1байт независимо от содержимого и состава обьекта. RTTI принудительно пробовал директивой {M+} включать
TypeInf := object.ClassInfo;
TypeData := GetTypeData(TypeInf);
NumProps := TypeData^.PropCount;
так вот, NumProps всегда остается = 0
Oleg_ (2004-11-10 18:42:00) [5]Сохранить нужно данные конкретного обьекта (не компонента)
в качестве базового класса указан tpersistent
Oleg_ (2004-11-10 18:37:00) [6]спасибо, сработало
Reindeer Moss Eater (2004-11-10 18:32:00) [7]Если тебе нужен TWriter, то зачем пытаться записать весь компонент одним вызовом?
Если тебе весь компонент надо сохранить одним вызовом, то зачем тебе TWriter?
WriteComponentResFile и все.
jack128 (2004-11-10 18:31:00) [8]type
TWriterAccess = class(TWriter);
Wr:TWriterAccess;
fs:tfilestream;
begin
fs:=tfilestream.Create('c:\1.txt',fmOpenWrite);
Wr:=TWriterAccess.create(fs,4096);
wr.WriteProperties(pers);