|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
вот собственно и весь вопрос. Ранее поднимал его здесь http://www.sql.ru/forum/1111845/kak-programmno-otsledit-izmeneniya-v-konstruktore-form-i-otchetov ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2016, 15:34 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
garvy как программно отследить факт открытия формы в режиме конструктора?Например, по таймеру из другой формы Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2016, 15:54 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
Это сделано - неудобно по ряду причин. Хочется чтобы именно в момент когда вызываю конструктор конкретной формы - зафиксировать этот факт в какой-то таблице. А еще более расширенный вопрос - как пребываючи в конструкторе формы программно фиксировать изменения свойств ее элементов? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2016, 16:20 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
garvy, Есть функция IsLoaded (см. в уч.базе "Борей")-при её "допиливании" можно получить True при открытии формы в режиме конструктора, проверять значение функции при открытии формы и выполнить Ваши инструкции ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2016, 17:52 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2016, 18:31 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
Сергей, добрый вечер. Нет ли образчика второй части, той что: "Система мониторинга событий форм/отчетов приложения" в 2003 формате на посмотреть? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2016, 20:39 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
Добрый вечер, Андрей Сейчас выложу...(надо оформить) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2016, 21:13 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
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 уже знает, какая форма/отчет станет активной следом(еще до события его активации!). Мне это нужно было знать, когда работал с лентой. Я тогда это использовал чтобы переключится на нужную вкладку еще до активации следующей формы, что спасало от ненужной смены текущей вкладки. Не уверен, что еще кому-то пригодится :) А вот событие, когда все видимые формы/отчеты закрыты пользователем, может быть полезно. Как его отловить я показал в коде. По этому событию я активировал первую вкладку ленты, приводя приложение в исходный вид. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2016, 02:40 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
Благодарю, вечером посмотрю внимательнее. зы. "С разбегу" не завелась на 2003. Есть некоторое "наследие" от 2010 версии. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2016, 09:36 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
Пример Сергея навел меня на некоторую мысль, возможную для 2003 версии: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2016, 10:55 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
garvy, перечитал предыдущую ветку, вы пишите: garvyОстается маленькая деталь - все выше предыдущее обсуждение опускаем вплоть до самого первого вопроса - сформулирую его по другому: Есть ли в объектной модели ACCESS событие, к которому можно прикрутить программу, сохраняющую изменения, внесенные в форму или отчет в режиме конструктора при выходе и/или сохранении в специальную таблицу базы данных? а сейчас спрашиваете: garvyкак программно отследить факт открытия формы в режиме конструктора? а зачем вам нужен факт открытия в конструкторе? Ну, открыли вы форму в конструкторе. Внесли изменения. Сохранили, не выходя из режима конструктора. Опять внесли изменения. Сохранили. Снова внесли изменения, закрыли форму и на выходе отказались от изменений. Или открыли в режиме формы, потом перешли в конструктор, внесли изменения, вернулись в режим формы, сохранили, а потом закрыли. Что вам даст "факт открытия формы в режиме конструктора" или отлов события выхода? Как я понял, вам нужен факт сохранения макета формы. А такого события нет. Есть свойство 16472719 : Анатолий ( Киев ) CurrentProject.AllForms(i).DateModified возвращает дату последнего изменения макета формы. И, похоже, это все, что есть из полезного. Я было подумал, что табличным макросом на обновление записи таблицы MSysObjects можно выкрутится(триггер, что ни на есть), но на системную таблицу такой триггер не навесишь, да и от поля DateUpdate таблицы MSysObjects тоже толку мало. Не смотря на название, сути своей оно больше не отражает. https://support.microsoft.com/en-us/kb/299554 Additionally, you may have noticed that the Database window (in versions prior to Access 2007) and the Navigation Pane in Access 2007 or Access 2010 displays the correct date and time for an object's last modification. This is because Microsoft Access uses its own internal mechanism for storing the date created and date modified, independent of the database engine. Unfortunately, Microsoft Access does not expose this information in its object model; therefore, there is no programmatic way to get to this information in Microsoft Access. Я вот чего не пойму. Зачем это нужно делать в режиме онлайн? Ну, сели вы работать над какой-то задачей. Ну потратили полдня. А сколько форм отчетов вы изменили? Ну до десяти, не больше. Сравнение дат CurrentProject.AllForms(i).DateModified даст вам точное число измененных вами форм. Вот и запустите в конце дня для этих форм ту программу, что вы написали. Съем новых данных займет от силы полминуты. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2016, 23:25 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
Вакшуль Сергейgarvy, перечитал предыдущую ветку, вы пишите: garvyОстается маленькая деталь - все выше предыдущее обсуждение опускаем вплоть до самого первого вопроса - сформулирую его по другому: Есть ли в объектной модели ACCESS событие, к которому можно прикрутить программу, сохраняющую изменения, внесенные в форму или отчет в режиме конструктора при выходе и/или сохранении в специальную таблицу базы данных? ... Как я понял, вам нужен факт сохранения макета формы. А такого события нет. Есть свойство 16472719 : Анатолий ( Киев ) CurrentProject.AllForms(i).DateModified возвращает дату последнего изменения макета формы. И, похоже, это все, что есть из полезного. Я было подумал, что табличным макросом на обновление записи таблицы MSysObjects можно выкрутится(триггер, что ни на есть), но на системную таблицу такой триггер не навесишь, да и от поля DateUpdate таблицы MSysObjects тоже толку мало. Не смотря на название, сути своей оно больше не отражает. https://support.microsoft.com/en-us/kb/299554 Additionally, you may have noticed that the Database window (in versions prior to Access 2007) and the Navigation Pane in Access 2007 or Access 2010 displays the correct date and time for an object's last modification. This is because Microsoft Access uses its own internal mechanism for storing the date created and date modified, independent of the database engine. Unfortunately, Microsoft Access does not expose this information in its object model; therefore, there is no programmatic way to get to this information in Microsoft Access. Я вот чего не пойму. Зачем это нужно делать в режиме онлайн? Ну, сели вы работать над какой-то задачей. Ну потратили полдня. А сколько форм отчетов вы изменили? Ну до десяти, не больше. Сравнение дат CurrentProject.AllForms(i).DateModified даст вам точное число измененных вами форм. Вот и запустите в конце дня для этих форм ту программу, что вы написали. Съем новых данных займет от силы полминуты. Я потратил немало времени на создание описания всех форм системы и описания элементов управления форм. Хэлп так сказать. Немало - это слабо сказано. Пошел пока что по простому пути - файл word, который пользователь может вызвать прямо из формы. В нем описываются назначение и свойства самой формы и ее элементов. Учитывая что форм несколько сотен и в каждой по несколько десятков элементов управления, процесс описания растянулся почти что на год. Но я же все время добавляю/удаляю, изменяю функциональность форм их элементов управления, да, в день не более десятка думаю. Программа, которая по расписанию или по вызову фиксирует изменение свойств написана, но вот как раз запускать ее надо только для изменившихся форм и только для изменившихся элементов управления. Иначе речь идет не о минутах обновления информации, а о часах в лучшем случае. Я уже писал - если запустить программу, которая шерстит все формы и все элементы управления в форме и все свойства каждого элемента формы - получается дикое время ее выполнения. У меня создана таблица, куда по результатам работы этой программы сброшены все свойства. Всю систему она шерстила 3 суток. В результате таблица с более чем миллионом записей. Хочется в режиме реального времени - изменилось свойство - установил флаг в этой таблице. Зафиксировал изменение в описании системы - флаг снял. Самый распространенный недостаток всех описаний систем - отставание ее описания от ее реального состояния. Мне хочется хотя бы отчасти автоматизировать отслеживание описания изменений. Конечно - word это лишь начало. Самое сладкое было бы если при изменении свойства Z элемента Y в форме X (в момент его сохранения) программа сама находила описание этого элемента в хэлпе и по крайней мере ставила метку о его неактуальности. Хочу вот до такого состояния систему описания системы довести. А с DateModified такая беда, что при сжатии приложения у всех форм устанавливается новая дата! А у меня при выкладке обновления для пользователей каждый раз происходит сжатие. От разработки файл пухнет где-то с 40 до 100 с лишком мегабайт. Я его потом по сети рассылаю в несколько мест, поэтому лучше сжимать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 11:34 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
авторкак программно отследить факт открытия формы в режиме конструктора? Буквально. В форме создаёте радиобаттон, лучше - маленькое поле, делаете его невидимым, потом тихонечко запихиваете его под какой-н контрол, а значение по умолчанию - 0. Код на отркрытие формы: Код: vbnet 1. 2.
Когда надо, опрашиваете этот контрол... Не пробовал... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 12:22 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
все это уже сделано - факт открытия формы в режиме конструктора отслеживается. Не отслеживается по прежнему факт изменения какого-либо свойства какого-либо элемента управления при открытии формы в режиме конструктора. Из-за этого при вызове программы обновления таблицы свойств формы приходится перелопачивать все свойства всех элементов управления формы, которая побывала в режиме конструктора. На одну форму в среднем получается несколько тысяч записей. Обновление одной формы занимает до нескольких минут. Можно конечно терпеть и делать как уже предлагали - запускать прогу раз вкакое-то время. Дая так и делаю. Все ОК кроме одного - долго. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 12:43 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
garvy, ну я даже не знаю, надо подумать... (Сколько же у вас контролов в этой форме?) (На этом форуме всех выводят на чистую воду ) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 13:02 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
Да не в этой именно, а вообще. Если считать поля, списки, раскрывающиеся списки, кнопки, закладки, субформы, чекбоксы, модули и т.д. и т.п. то в любой, даже самой захудалой форме, набирается достаточно много. И у каждого из них десятки свойств. Если не отслеживать изменение конкретного свойства конкретного элемента управления конкретной формы - то перелопачивать сплошняком все - очень много. Вот и ломаю голову. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 13:37 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
garvy, а бить этих пользователей не пробовали? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 13:50 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
зачем бить - я хочу отслеживать вносимые собственноручно мной изменения, дабы поддерживать актуальность описания системы. Описание выстроено от бизнес процессов, с пользовательской точки зрения. Т.е. там нету того, что у кнопки такой то свойство цвета такое-то. Это пользователю и не надо. Но вот что при нажатии этой кнопки будет запущена программа, которая делает то-то и то-то. А потом в какой-то момент я переделываю логику программы, а описание остается старое. А потом добавляю еще кнопку, еще функциональность, а описания на нее вообще нету. А заниматься по принципу - поменял программу - сразу же садись за переписку описания не получается совершенно. А через пол дня я уже не то что логику, я уже и не вспомню что именно и где я изменял. Все это примеры конечно. Если совсем уж предельно просто выражаться хочу: 1) Иметь таблицу хэлпа в базе данных ко всей системе (одно любое свойство, элемент, форма, отчет, модуль - одна строка), где одно из полей и будет тот текст, который видит пользователь в описании. Как я уже писал - такую таблицу я уже завел. 2. От момента выпуска нового релиза до момента выпуска следующего релиза иметь сводку с полным списком измененных с момента прошлого релиза свойств системы. Сейчас чтобы завершить создание и ведение такой таблицы мне не хватает только одного - программно отслеживать факт изменения свойств элементов формы (и свойств самих форм, отчетов) на лету, дабы ввиду множественности этих свойств сразу исключить те, которые не изменялись. Все остальное в том или ином виде уже имеется. Хочется уже свести это в единую стройную систему. Сам текст для пользователя увы, но писаться должен человеком пока что. Я сам ярый противник хэлпов постоенных по принципу Сепулькарии - см. сепульки - сепульки см. сепуление - сепуление см. сепулькарии. Хотя как программист, который честно пытается это делать, должен отметить, что это крайне сложно - быть одновременно Толстым и программистом. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 15:14 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
Если существующий функционал вас устраивает, то просто оптимизируйте производительность. На вскидку: 1. Для каждого проверяемого элемента помимо его свойств сохраняется хэш, формируемый на основе всех интересующих вас свойств. Можно решить в лоб: значения свойств складываются в строку и результирующая строка используется как хэш. 2. При сохранении (или что там у вас) формы для каждого элемента так же формируется хэш и сравниваются не каждое свойство элемента с его сохраненным значением в БД, а состояние элемента целиком. Если хэш-строки совпадают, то элемент не изменился. Можно пойти дальше - чтобы не шариться по БД с поиском нужной записи о проверяемом элементе, скопом загрузить хэш-строки проверяемой формы из БД в vba-коллекцию и работать с ней - в памяти это будет делаться на порядки быстрей. Я, конечно, не пробовал, но если формы у вас содержат не по 10К элементов и при этом вы не меняете сразу ВСЕ элементы, то вся проверка при такой реализации должна выполняться <1сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 17:20 |
|
как программно отследить факт открытия формы в режиме конструктора?
|
|||
---|---|---|---|
#18+
Задача интересная, я бы согласился с идеей оптимизации. Например, тот же Access Dependency Checker хранит все объекты из базы при работе в коллекциях, начальный анализ занимает несколько минут, запись в базу - меньше секунды, чтение из базы в коллекцию несколько секунд, поиск по всем объектам - доли секунды. Он доступен в исходном коде, можно посмотреть как сделано. На форме не может быть более 750 объектов, у вас несколько сот форм - при должной оптимизации все должно работать мгновенно. Для отслеживания именно изменений достаточно действительно хранить только хэши свойств. Можно также посмотреть в стороно плагинов к Акцессу, там можно сделать намного больше, но опять же не уверен, что можно просто отследить изменение формы ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 18:30 |
|
|
start [/forum/topic.php?fid=45&msg=39272579&tid=1613367]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 329ms |
total: | 456ms |
0 / 0 |