Однако не вполне очевидно, что то, что верно в design-time, верно и в run-time, когда наследники класса TComponent могут не являться компонента ми в обычном смысле этого слова, и нет никакой необходимости создавать класс, в котором имена переменных совпадали бы со свойствами Name создаваемых компонентов.

В design-time IDE само создаёт уникальное имя для всякого вновь добавляемого на форму компонента . Если же создается система, в которой компоненты будут создаваться в run-time, то об уникальных именах придется позаботиться разработчику. Получать уникальные идентификаторы можно, например, на основании счётчика, но есть и другие способы – например, на основе GUID’ов, выдаваемых функцией CreateGUID из модуля SysUtils.

В пределах общего владельца свойство Name служит уникальным идентификатором объекта. Поэтому по значению этого свойства можно получить ссылку на этот объект. Для этого существует метод

function FindComponent(const AName: string): TComponent;

возвращающий компонент по его имени (если же компонент с указанным именем не найден, возвращается nil). Как можно увидеть из реализации метода FindComponent, для поиска используется метод последовательного перебора, так что при владении большим количеством компонентов рассчитывать на хорошую скорость не приходится.

Свойство Name компонента столь важно, что при сериализации, как можно видеть в dfm-файлах, оно не просто перечисляется среди других свойств между словами object и end – оно стоит в заголовке объекта, перед его типом. Например, для следующего экземпляра TButton свойство Name = ‘Button1’:

object Button1: TButton Left = 136 Top = 80 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 end

Name стоит на особой позиции, и это – не случайно. Часть II. Основы Основное правило сериализации

Теперь перечислим, что же на самом деле сохраняется в поток при вызове метода TStream.WriteComponent. То, что сейчас будет оглашено, я бы назвал основным правилом сериализации, т. к. именно это всё время надо иметь в виду при написании систем сериализуемых классов. Следует запомнить следующее: при сериализации объекта в поток сохраняется и может быть восстановлена та и только та информация, которая либо содержится в read/write published-свойствах объекта, либо способ записи и чтения которой определён в псевдосвойствах.

О псевдосвойствах, или “fake properties”, как о них говорится в справочной системе VCL, речь пойдёт ниже, а сейчас хотелось бы подробно остановиться на первом варианте.

В требовании «read/write published свойства» каждое слово является значимым. Если мы обходимся без псевдосвойств, вся информация, однозначно определяющая состояние объекта, должна быть вынесена в эти свойства, поскольку при сериализации НЕ сохраняется:

1. Ничего из того, что объявлено за пределами published секции. 2. Значения каких-либо полей (переменных) объекта, даже если эти переменные вынесены в published секцию. 3. Read-only свойства.

Но и это ещё не всё. Даже если вся определяющая состояние объекта информация вынесена в read/write published свойства, это само по себе не гарантирует успешной сериализации, поскольку нужно позаботиться о том, чтобы эти свойства имели правильный тип.

Поэтому в следующем разделе мы последовательно пройдёмся по сериализуемым типам свойств. Сериализуемые типы Примитивные типы

Самый простой случай сериализуемого свойства – это свойство, имеющее примитивный тип. К этим типам относятся числа, строки, перечисления (enumerations), либо то, что сводится к вышеуказанному (например, даты). В dfm-формате их значения следуют через знак равенства от имени свойства. Например, в файле формы мы можем видеть строки, подобные этим:

object Form1: TForm1 BorderStyle = bsDialog Caption = 'Form1' ClientHeight = 119 . . . end

Часто среди возможных значений свойства есть такое, которое этим свойством принимается в большинстве случаев. Чтобы сократить объём записываемой на диск информации – и, как следствие, сэкономить время и ресурсы при чтении – Delphi даёт нам возможность настроить каждое Integer, Boolean или enumerated свойство таким образом, чтобы оно не записывалось в поток, когда его значение совпадает с заданным по умолчанию.

<<< 0 1 2 3 4 5 6 7 8 >>>
Хостинг от uCoz