как программно отследить факт открытия формы в режиме конструктора?

garvy
Дата: 05.03.2016 15:34:32
вот собственно и весь вопрос. Ранее поднимал его здесь http://www.sql.ru/forum/1111845/kak-programmno-otsledit-izmeneniya-v-konstruktore-form-i-otchetov
__Michelle
Дата: 05.03.2016 15:54:07
garvy
как программно отследить факт открытия формы в режиме конструктора?
Например, по таймеру из другой формы
   ................................
   If SysCmd(acSysCmdGetObjectState, acForm, <имя формы>) <> conObjStateClosed Then
      If Forms(<имя формы>).CurrentView = conDesignView Then
   ................................
garvy
Дата: 05.03.2016 16:20:38
Это сделано - неудобно по ряду причин. Хочется чтобы именно в момент когда вызываю конструктор конкретной формы - зафиксировать этот факт в какой-то таблице. А еще более расширенный вопрос - как пребываючи в конструкторе формы программно фиксировать изменения свойств ее элементов?
sdku
Дата: 05.03.2016 17:52:29
garvy,
Есть функция IsLoaded (см. в уч.базе "Борей")-при её "допиливании" можно получить True при открытии формы в режиме конструктора, проверять значение функции при открытии формы и выполнить Ваши инструкции
Вакшуль Сергей
Дата: 05.03.2016 18:31:41
garvy,

garvy
как программно отследить факт открытия формы в режиме конструктора?


Если таймер не устраивает, могу предложить возможности класса clsAppMonitor.
http://am.rusimport.ru/MsAccess/topic.aspx?ID=782

Реализовано без таймера, но это налагает определенные условия на приложение:
- все формы/отчеты должны иметь модуль кода
- всплывающих(PopUp) форм/отчетов быть не должно(они не отслеживаются, не могут быть отслежены событиями класса clsAppMonitor)
- архитектура приложения не предполагает, что кроме форм/отчетов могут открываться в окнах еще другие объекты(запросы/таблицы)
- формы/отчеты не должны открываться с параметром acDialog

Класс генерирует несколько событий, первое из которых то, о котором вы спрашиваете:
Public Event AfterOpenFR(FR_Object As Object)
Public Event ActivationFR(FR_Object As Object, blnAfterOpen As Boolean)
Public Event DeactivateFR(FR_Object As Object, intReasonDeact As ReasonDeact, NewFR As Object, FR_IsBeingActivated As Object)
Public Event CloseFR(FR_Object As Object)
Public Event AppMonitorNeedsBoosting(frm As Form)

AfterOpenFR это суррогат события Open формы/отчетов. По сути возникает тогда, когда для открываемой формы/отчета срабатывает событие активации. На этом событии сможете проверить находится ли формы в режиме конструктора.

В модуле кода формы F_Start видно как можно работать с классом clsAppMonitor.
Predeclared
Дата: 05.03.2016 20:39:46
Сергей, добрый вечер.

Нет ли образчика второй части, той что: "Система мониторинга событий форм/отчетов приложения"
в 2003 формате на посмотреть?
Вакшуль Сергей
Дата: 05.03.2016 21:13:42
Добрый вечер, Андрей

Сейчас выложу...(надо оформить)
Вакшуль Сергей
Дата: 06.03.2016 02:40:06
Predeclared
Нет ли образчика второй части, той что: "Система мониторинга событий форм/отчетов приложения"
в 2003 формате на посмотреть?


Вырезал часть, касающуюся мониторинга событий приложения в отдельный демо файл - AppMonitor
Во вложении:
- AppMonitor.accdb работает нормально в 2010-ом
- AppMonitor.mdb работает нормально в 2010-ом. Работает ли на 2003-ом - надо проверять. У меня возможности нет. Но точно не работает в 2000, во всяком случае на моей машине где одновременно и 2000, и 2010. Почему - не знаю. Не вникал.

Результаты мониторинга вывел в окно отладки.
Взаимодействие с классом clsAppMonitor вынес в модуль стартовой формы F_Start. Предполагается, что скрытая форма F_Start будет открыта на протяжении работы всего приложения. Соответственно генерируемые clsAppMonitor события можно прослушивать через форму F_Start.

Сам класс clsAppMonitor отлажен нормально, а вот сегодняшний файл AppMonitor.accdb сделал на скорую руку, долго не тестировал.

Там есть интересный момент, правда, довольно специфический. Когда на экране несколько открытых форм/отчетов и пользователь крестиком закрывает активную форму/отчет, то clsAppMonitor на событии DeactivateFR уже знает, какая форма/отчет станет активной следом(еще до события его активации!). Мне это нужно было знать, когда работал с лентой. Я тогда это использовал чтобы переключится на нужную вкладку еще до активации следующей формы, что спасало от ненужной смены текущей вкладки. Не уверен, что еще кому-то пригодится :)
А вот событие, когда все видимые формы/отчеты закрыты пользователем, может быть полезно. Как его отловить я показал в коде. По этому событию я активировал первую вкладку ленты, приводя приложение в исходный вид.
Predeclared
Дата: 06.03.2016 09:36:33
Благодарю, вечером посмотрю внимательнее.

зы. "С разбегу" не завелась на 2003.
Есть некоторое "наследие" от 2010 версии.
Predeclared
Дата: 06.03.2016 10:55:01
Пример Сергея навел меня на некоторую мысль,
возможную для 2003 версии:
Private WithEvents cbs As Office.CommandBars
Private blnInDesign As Boolean

Private Sub cbs_OnUpdate()
    Dim blnCurrentState As Boolean
    blnCurrentState = cbs("Form Design").Visible
    If blnCurrentState Then
        Debug.Print Screen.ActiveForm.Name & " in Design"
    Else
        If blnInDesign Then
            Debug.Print "Not in Design"
        End If
    End If
    blnInDesign = blnCurrentState
End Sub

Private Sub Class_Initialize()
    Set cbs = Application.CommandBars
End Sub

Private Sub Class_Terminate()
    Set cbs = Nothing
End Sub

Public Property Get State() As Boolean
    State = blnInDesign
End Property