Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пустая строка в файле ресурсов [D7]


_REA ©   (2009-08-27 13:56:00) 

День добрый.
Пытаюсь сохранить String Published Property копонента в файл через сериализацию. Если строка пустая, то она не сохраняется.
Nodefault и Stored True что-то не помогают. Где может быть проблема?


Сергей М.   (2009-09-02 12:03:00) [1]


> Нужно сохранять название


published для этого, конечно, удобен, но вовсе не обязателен.
См. TPersistent.DefineProperties, TFiler.DefineProperty


> Loaded вызывается при загрузке, а до загрузки еще надо создать
> экземпляр


На момент вызова Loaded экземпляр уже создан.

Читай внимательно (цитата из справки):

When the streaming system loads a form or data module from its form file, it first constructs the form component by calling its constructor, then reads its property values from the form file. After reading all the property values for all the components, the streaming system calls the Loaded methods of each component in the order the components were created. This gives the components a chance to initialize any data that depends on the values of other components or other parts of itself.


_REA   (2009-09-02 11:52:00) [2]

>А это принципиально, чтобы св-во было именно published ?
Да. Нужно сохранять название.

>И по-прежнему не понятно, чем так уж удобно называть его "Огурцом" именно в конструкторе, если с тем же успехом его можно обозвать, к примеру, в перекрытом методе Loaded()

Loaded вызывается при загрузке, а до загрузки еще надо создать экземпляр. Он  в принципе может быть вообще не сохранен на диск. А может быть и сохранен.


Сергей М.   (2009-08-28 17:30:00) [3]

А это принципиально, чтобы св-во было именно published ?
И по-прежнему не понятно, чем так уж удобно называть его "Огурцом" именно в конструкторе, если с тем же успехом его можно обозвать, к примеру, в перекрытом методе Loaded() ..


_REA   (2009-08-28 17:05:00) [4]

Код большой, размазан по иерархии классов, разным packages и т.п.
В данном случае начальное значение этой строки определяется самим классом.

Ну как пример: Есть класс TОвощ и унаследован от него TОгурец. Свойство Название будет по умолчанию = Огурец. Но, пользователь может написать ОгЗеленый, или вообще ничего не писать - тогда это будет огурец без названия.


Сергей М.   (2009-08-28 12:21:00) [5]


> Можно конечно присваивать не в конструкторе, но мне удобнее
> там по соображениям построения класса


Непонятное "удобство" ..

Пояснишь фрагментами кода ?


_REA   (2009-08-28 11:28:00) [6]

>Можно указать булево поле класса.
См. выше - для строк не прокатывает почему то.

> А можно полюбопытствовать, зачем нужно сохранять пустую
Смысл такой: в конструкторе присваивается некая строка по умолчанию, которую пользователь может изменить в том числе и на пустую. Если пустая не сохраняется, то при загрузке остается значение присвоенное в конструкторе, а это не есть гуд. Можно конечно присваивать не в конструкторе, но мне удобнее там по соображениям построения класса.


Сергей М.   (2009-08-27 17:06:00) [7]


> Обязательно функцию объявлять для Stored?


Не обязательно.
Можно указать булево поле класса.


> мне надо сохранять все - и пустые и не пустые строки


А можно полюбопытствовать, зачем нужно сохранять пустую строку ?


_REA   (2009-08-27 16:57:00) [8]

Если еще точнее, то мне надо сохранять все - и пустые и не пустые строки.


_REA   (2009-08-27 16:56:00) [9]

2Сергей М.
Обязательно функцию объявлять для Stored?
См. вопрос - мне надо наоборот - сохранить пустуюстроку (т.к. по умолчанию она как раз не пустая у меня).
А по вашему коду похоже, что пустые строки не надо сохранять, но они и так не сохраняются.


Сергей М.   (2009-08-27 14:17:00) [10]

private
 function NeedStoreMyProp: Boolean;
..
published
 property MyProp: String read GetMyProp write SetMyProp stored NeedStoreMyProp;

..
function NeedStoreMyProp: Boolean;
begin
 Result := GetMyProp <> '';
end;


_REA   (2009-08-27 14:04:00) [11]

Выкрутился так:
В конструкторе
If Not (csLoading in aOwner.ComponentState) Then
 MyNoDefaultString := MyDefValue;


Наверх

Титульная страница Поиск, карта сайта Написать письмо