-Поиск по дневнику

Поиск сообщений в rss_sql_ru_access_programming

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 16.03.2006
Записей:
Комментариев:
Написано: 4


CloseDialog

Среда, 06 Сентября 2017 г. 01:59 + в цитатник
Добрый день,

Мы тут как-то обсуждали, как организовать диалог по нажатию на "крестик":
20694927
20702963
20718818

guest_rusimport меня таки втянул :) в поиски решения. Сначала я рыл не в том направлении, все пытался перехватить нажатие на крестик, причем, даже небезуспешно при работе в tabbed интерфейсе. Но вот при работе с оконным интерфейсом уперся в непреодолимые для меня сложности расчета координат этого самого "крестика". Уперся... и понял, что рыл не туда :)

В общем, оформил. Выложил у Андрея Митина:
http://am.rusimport.ru/MsAccess/topic.aspx?id=806

Дублирую. См.вложение.
Сделал файл в трех форматах:
- CloseDialog_2000.mdb
- CloseDialog_32-bit.accdb
- CloseDialog_64-bit.accdb

Ролик на YouTube:
[youtube=

]

Добавлю «пару слов» к материалу.

CloseDialogForms – класс менеджер по контролю за формами, закрытие которых необходимо контролировать. Смысл свойств и методов очевиден из их названий(за исключением, наверно, двух последних): Add, Remove, Count, Exists, Item, IsSubForm, IsFormDirty, DirtyForms.

DirtyForms это коллекция форм, у которых или текущая запись самой формы, или текущая запись одной из подчиненных форм, не сохранена.

Как с классом, так и с DirtyForms можно работать, как с семейством Forms, используя цикл For Each. Обращаться к формам можно как по номеру в коллекции, так и по дескриптору окна, преобразованному в String. Вот так: CStr(frm.hWnd). Имя формы не используется в качестве ключа намерено. Если форма открыта как экземпляр, то в этом случае дескриптор ее окна идентифицирует ее уникально, а имя – нет.

Использование имени формы, открытой как экземпляр, в качестве ключа создает сложности при обращении к ней для последующего закрытия: DoCmd.Close acForm, "ИмяФормы", вынуждая отказываться в пользу DoCmd.Close, метода, который закрывает не произвольную, а исключительно активную в данный момент форму, навязывая тем самым определенный порядок закрытия форм, а иногда делая закрытие форм невозможным в принципе, если такая форма неактивна в данный момент.

С оглядкой на сказанное был использован альтернативный механизм закрытия форм – функция apiCloseForm. Это remake функции Graham Mandeno. Функция хороша, мне понравилась :). Позволяет закрыть любую форму независимо от того, активна она или нет, открыта ли через DoCmd.OpenForm или как экземпляр. Функция позволяет подавить или, наоборот, выдать корректное сообщение об ошибке, если закрытие невозможно. Рекомендую :).

Будьте осторожны, работая с файлом. Как, я указал в презентации, если константа CloseDialog_DebugMode установлена в False, как в опубликованном примере, то работая с формами, редактор IDE открывать нельзя, иначе Access придется «срубать». Если все-таки открыли, запустив Access удерживая Shift, то тогда не открывайте формы или измените значение константы на True, правда, в этом случае коллекции работать будут, а самое главное – событие FormClosing – нет.

http://www.sql.ru/forum/1270753/closedialog


 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку