Visual Basic 6. Руководство разработчика

       

Цикл жизни элемента управления


Давайте поэкспериментируем немного с событиями кнопок элемента управ­ления. Сделайте следующее.

1. Переключатель в окно UserControl и выполните на нем двойной щелчок, чтобы открыть окно Code.

2. Найдите события Initialize, InitProperties и Terminate в раскрывающемся списке справа. В каждое из них введите оператор Debug. Print с последующим именем события, как показано ниже.

Private Sub UserControl_Initialize()

Debug.Print "initializing control"

End Sub

Private Sub UserControl InitProperties()

Debug.Print "initializing properties"

End Sub

Private Sub UserControl_Terminate()

Debug.Print "terminating control"

End Sub

3. Закройте окно UserControl и возвратитесь к тестовой форме. Поместите экземпляр нового элемента управления на форму, и наблюдайте за окном проверки. Будут отображены следующие сообщения:



initializing control

initializing properties

При помещении элемента управления на форму сначала инициализируется сам элемент, а затем инициализируются его свойства.

Примечание

Операторы Print исполняются при переключении UserControl на тестовую форму. Даже тогда, когда приложение не запускается, код выполняется! Чтобы понять такое поведение, необходимо стать на место конструктора элемента управления ActiveX. Когда на форме размещается обычный элемент управления ActiveX, типа элемента TextBox, то выполняется некоторый код. Это то, что мы только что видели. Элементы управления ActiveX запускаются всегда, независимо от того, принадлежат ли они форме, которая выполняется, или нет. Как же еще проверить изменился ли у элемента управления шрифт или цвет фона, задаваемые разработчиком?

4. Теперь установите свойство Title и выполните тестовое приложение. Два новых сообщения появляются в окне проверки (сначала необходимо очистить текущее содержание окна проверки):

terminating control

initializing control

Элемент управления, который находился на форме в режиме конструирования, был удален, а новый — инициализирован. Все его свойства были инициализированы значениями по умолчанию, а значением по умолчанию для свойства


Title была пустая строка. Именно поэтому он исчез.

Если еще раз остановить приложение, в окне Debug появится следующее сообщение:

initializing control

На сей раз был удален экземпляр элемента управления режима выполнения, а экземпляр режима конструирования - инициализирован. Каждый раз, когда происходит переключение из режима конструирования в режим выполнения, один экземпляр элемента управления удаляется, а новый создается.

В любом случае, при переходе из одного режима в другой свойства элемента должны быть сохранены. Чтобы это сделать, выполните следующее.

1. Переключитесь обратно в окно Code и введите оператор Print в событиях Read Properties и Write Properties.

2. Переключитесь обратно на тестовый проект, установите свойство Title, снова выполните приложение — и вы увидите следующую последовательность сооб­щений:

writing properties

terminating control

initializing control

reading properties

Visual Basic сохраняет значения свойств в окне Properties и удаляет экземпляр элемента режима конструирования. Затем он инициализирует экземпляр режима выполнения и считывает те же самые свойства. Таков цикл жизни элемента управления ActiveX.

Примечание

Если Visual Basic знает, какие значения необходимо сохранить, почему он не может запомнить их, пока создается новый экземпляр элемента управления? Почему Visual Basic сохраняет значения свойств и затем считывает их снова? Казалось бы, сделать это так просто, но обратите внимание на событие Terminate между записью и чтением значений свойств. Между исчезновением одного и появлением другого экземпляра элемент управления просто не существует! При всей кажущейся нелепости ситуации именно так ведут себя элементы управления.

Подведем итоги событий, характеризующих цикл жизни элемента управления. Чтобы выполнить коды этих событий, поместите их в соответствующие обра­ботчики событий

События кнопок в цикле жизни элемента управления

При размещении элемента управления на форме происходят следующие события.

Initialize.



Инициализирует экземпляр элемента управления режима конструи­рования.

InitProperties.

Присваивает начальные значения свойствам.

При переключении из режима конструирования в режим выполнения происходят следующие события.

WriteProperties.

Сохраняет свойства, перечисленные в окне Properties.

Terminate. Удаляет экземпляр элемента управления режима конструирования.

Initialize.

Инициализирует новый экземпляр (режима выполнения) элемента управления.

ReadProperties.

Считывает сохраненные свойства.

При переключении из режима выполнения в режим конструирования происходят следующие события.

Initialize.

Инициализирует экземпляр элемента режима конструирования.

ReadProperties.

Считывает значения из окна Properties и присваивает их соот­ветствующим свойствам.

Совет

При переключении из режима выполнения в режим конструирования ни одно событие WriteProperties не происходит. Как и ожидалось, Visual Basic не сохраняет свойства, которые изменяются во время выполнения, и переустанавливает элемент управления ActiveX в значения набора свойств из окна Properties режима конструирования. Другими словами, изменения свойств элемента управления, произошедшие в режиме конструирования, продолжают действовать в режиме выполнения. Обратное утверждение неверно. Изменения, сделанные во время выполнения, при переключении обратно в режим конструирования сбрасываются.

Для поддержки значений свойств при переключении элемента управления из режима конструирования в режим выполнения необходимо добавить несколько строк кода в события ReadProperties и WriteProperties. Мы уже знаем, как значения свойства записываются и считываются из объекта Property Bag. Поэтому код для свойства Title не вызывает вопросов:

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)

Debug.Print "writing properties"

PropBag.WriteProperty "Title", m_Title, "Control Title"

End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)

Debug.Print "reading properties"

Title = PropBag.ReadProperty ("Title", "Control Title")

End Sub


Содержание раздела