![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не сохраняется сво-во типа наследника от TCollection. [D2]
evgeg © (2002-09-25 18:58:00)Здраствуйте!
Сделал класс TCollectionEx, производный от TCollection c расширенной функциональностью. В частности в нем сделал конструктор и метод Add виртуальными. Потом сделал класс
TMyItems, производный от TCollectionEx и компонент со свойством типа TMyItems. Так вот: это свойство отображается в инспекторе объектов и редактируется в моем редакторе свойств, но НЕ сохраняется.
Работаю в Дельфи 2, а в ней нет встроенного редактора коллекций.
В чем ошибка и как исправить?
С уважением, Евгений.
evgeg (2002-09-26 19:39:00) [1]Спасибо за помощь. Я уже разобрался. Ошибка определtнной степени глупости -- в компоненте не определил медод для записи свойства-коллекции. Т. е. получилось published сво-во только для чтения. Редактировать его через мой редактор св-ва Дельфи дает, а сохранять не хочет. Стоило написать метод для записи -- и все заработало.
> Юрий Зотов © (26.09.02 10:36)
> Если в D2 нет своего редактора, как же там работать с коллекцией в design-time? ...
Там надо писать редактор для каждого типа-наследника от коллекции в отдельности (вот головняк то!). То, что коллекция сохраняется, определяется из того, что сохраняется потомок коллекции, для которого определен редактор свойства и в нем нет никакого кода для сохранения.
> Старый паскалист (26.09.02 11:40)
> Посмотри, есть ли в D2 в TReader"e/TWriter"e методы
ReadCollection/WriteCollection -
Есть.
Старый паскалист (2002-09-26 11:40:00) [2]Посмотрел я в исходники - оказалось:
TCollection - предопределённый класс, который понимают TReader/TWriter, и соответственно, читают и записывают его св-во
Items (к-рое не published и не DefineProperties - т.е. по стандартным правилам сохраняться не должно).
Посмотри, есть ли в D2 в TReader"e/TWriter"e методы
ReadCollection/WriteCollection -
Потому что они пытаются читать/писать коллекцию как обычный
персистент - то их ждёт неудача.
Юрий Зотов (2002-09-26 10:36:00) [3]> обязательно ли перекрывать св-во Items, методы Create и Add?
Вообще говоря, не обязательно. Просто в Create удобно передавать владельца коллекции, а в Items и Add удобно сразу определить конкретный класс элемента.
> Не будет ли ошибкой сделать в своем наследнике Create и Add виртуальными?
Borland это делает в TComponent. Вероятно, и нам можно.
========
Если в D2 нет своего редактора, как же там работать с коллекцией в design-time? Выходит, никак, только в run-time можно. Но тогда как же Вы определили, что родные коллекции сохраняются? И что именно в них сохраняется? Ведь, если их нельзя редактировать, то они остаются пустыми и сохранять в них просто нечего. Странно. Что-то здесь, IMHO, не так.
Посмотрите по исходникам VCL, нет ли каких-то особенностей в DefineProperties, Read и Write для свойства Items, из-за которых потомки коллекции могут не сохраняться.
evgeg (2002-09-26 07:56:00) [4]Наверх.
evgeg (2002-09-25 22:19:00) [5]> Юрий Зотов © (25.09.02 20:42)
Вашу статью я давно прочитал.
А редактора коллекций в Дельфи 2 точно нет. Собственно, я его сейчас и пишу. 2 дня сидел и в результате оказалось, что редактирует, но св-во не сохраняется в dfm.
Вопрос по статье: обязательно ли перекрывать св-во Items, методы Create и Add?
Не будет ли ошибкой сделать в своем наследнике Create и Add виртуальными?
Юрий Зотов (2002-09-25 20:42:00) [6]1. Посмотрите здесь
http://www.delphikingdom.com/helloworld/tcollection.htm
и сравните с тем, что у Вас. Возможно, что-то и вылезет.
2. Не буду утверждать, но очень не верится, что в Дельфи 2 нет встроенного редактора коллекций. Насколько я помню, он вместе с коллекциями и появился.
evgeg (2002-09-25 19:47:00) [7]Нету в Д2 TOwnedCollection.
Юрий Федоров (2002-09-25 19:38:00) [8]А попробуй отнаследовать от TOwnedCollection
evgeg (2002-09-25 19:24:00) [9]> Andrey Shakula (25.09.02 19:10)
Прямой наследник от TCollection сохраняется. Owner-а нет как нет и редактора коллекций.
Andrey Shakula (2002-09-25 19:10:00) [10]Я обычный TCollection сохраняеться? (Delphi 2 это так давно было, что не помню.) Я еще перекрывал
function GetOwner: TPersistent; override;
Может поможет.