Доступ к элементам управления / формам через классы приводит к повторной инициализации - PullRequest
1 голос
/ 29 февраля 2012

У меня есть основная форма с регистром и несколькими подчиненными формами.Я использую модули классов и сохраняю названия форм в них, чтобы облегчить доступ к ним.Соответствующая переменная для доступа к классу сохраняется в модуле и устанавливается (new) on_load в форме (clsMod).Перед первым доступом моя основная форма вызывает функцию, которая «инициализирует» значения в модуле класса (initial_form), чтобы сделать их доступными.Это работает как шарм, пока.

Но когда я сейчас пытаюсь получить доступ к значению, например, с помощью clsMod.detailsControl или clsMod.detailsControl! FieldXy, мой модуль класса снова инициализируется и, таким образом, теряет все связанные объекты.Я полагаю, мне не разрешено использовать такие элементы управления / формы?Нет ошибки, за исключением, конечно, «объектной переменной или с неустановленной переменной блока», которая возникает впоследствии.

Private m_ctldetailsControl As control

Public Sub initial_form()
  Set detailsControl = Forms!mainForm_ufoMainForm
End Sub

Public Property Get detailsControl() As control
  Set detailsControl = m_ctldetailsControl
End Property

Public Property Set detailsControl(ctlDetailsControl As control)
  Set m_ctldetailsControl = ctlDetailsControl
End Property

Я сузил ее до того факта, что модуль класса просто снова инициализируется, когдаЯ получаю доступ к объекту управления извне (я помещаю метку времени в Class_Initialize () и вижу, когда происходит новая инициализация), я просто не знаю почему.То же самое происходит, когда я использую Form-Objects вместо Control-Objects.

Я могу исключить мой код, сбрасывающий модуль класса, потому что он устанавливается только один раз во время процесса загрузки (set clsMod = new clsModification).Все остальное внутри этого класса работает нормально, я могу получить доступ к свойству изнутри класса без повторной инициализации.

Буду очень признателен за любые идеи или дальнейшие чтения по этой теме, любые другие детали просто спросите!

Несколько дополнений:

  • Переменная класса расположена как "public clsMod As clsModuleXy" в модуле
  • она устанавливается в Событии onLoad моей формы (установите clsMod= new clsModuleXy)
  • set-property отлично работает (как описано выше)
  • get свойство отлично работает внутри модуля класса (как описано выше)
  • , когда я используюполучить свойство вне модуля класса, произойдет новое создание экземпляра (если я установлю локальное управление / форму для этого свойства или захочу получить доступ к полю)

1 Ответ

2 голосов
/ 29 февраля 2012

Я предполагаю, что виновником является то, что вы объявили экземпляр этого модуля класса As New. Я, очевидно, не знаю, как выглядит остальная часть вашего кода, но я представляю, что весь процесс работает примерно так:

  1. Экземпляр этого объекта объявлен As New (т. Е. Dim clsMod As New initial_form).
  2. Процедура Class_Initialize () запускается при создании нового экземпляра (clsMod).
  3. Что-то заставляет этот экземпляр (clsMod) объекта выходить из области видимости.
  4. Сборщик мусора VBA очищает этот экземпляр объекта (clsMod), который больше не используется.
  5. Процедура Class_Terminate () запускается при очистке экземпляра (clsMod).
  6. Вы пытаетесь получить доступ к clsMod. Эта переменная - Nothing, потому что GC очистил ее. Однако вы объявили его As New, поэтому новый экземпляр initial_form создан и присвоен переменной объекта clsMod.
  7. Процедура Class_Initialize () снова запускается для этого нового экземпляра.

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

...