Как обработать событие Закрытие диалога

Автор Борис_С, 4 ноября 2020, 18:41

0 Пользователи и 1 гость просматривают эту тему.

Борис_С

Добрый вечер!
Создаю диалог.
Как я понимаю, в форме диалога всегда будет крестик в правом верхнем углу.
Можно ли как-то убрать этот крестик?
Где я должен указать макрос, выполняемый при нажатии на этот крестик?
События "Закрытие формы" для формы я не нашел.
Спасибо.

sokol92

Здравствуйте!
У А.Питоньяка в книге OOME_4_0.odt (раздел 18.1.2) написано, что метод Execute() возвращает число 1, если нажата кнопка "ОК" и 0, если нажата "Cancel" или пользователь закрыл форму "крестиком".
Владимир.

Борис_С

Спасибо. Теперь все понятно. Жаль только, что нельзя отказаться от крестика.

sokol92

#3
В Excel (тоже?) нет "штатного" метода для показа формы без крестика. "Обходной" путь достаточно сложен и не может быть перенесен на операционные системы, отличные от Windows.

Если на форме кнопки "Cancel" нет и нежелательно закрытие формы нажатием на "крестик", то можно проанализировать код возврата Execute и в случае ноля (выдать предупреждение и) вновь показать форму.

Кроме нажатия на "крестик" форму можно также закрыть и с помощью Alt+F4 (по крайней мере в Windows и Ubuntu).
Владимир.

Борис_С

Все равно не понятно.
Поменял имя кнопки на OK.
Оставил обработчик события Выполнить действие.
Если его нет, после нажатия на кнопку остаюсь на операторе Execute().
Оператор Execute() возвращает 0.

Борис_С

Я решил эту проблему, не используя возвращаемое значение метода Execute().
Я определил глобальную переменную Dim bContinue.
Перед вызовом метода Execute() я присваиваю ей значение false.
В обработчике события нажатия на кнопку OK присваиваю этой переменной значение true.
В обработчике события нажатия на кнопку Cancel присваиваю этой переменной значение false.
После оператора Execute() проверяю значение этой переменной.
Если оно равно true, значит пользователь нажал на кнопку OK. Если false - на крестик или на кнопку Сancel.
Вроде все работает.

sokol92

#6
Цитата: Борис_С от  5 ноября 2020, 13:55Оператор Execute() возвращает 0.
А.Питоньяк в диалоге HelloDlg не присвоил для кнопки свойство "Тип кнопки", равное "OK".
Если это сделать, то при нажатии на кнопку метод Execute будет возвращать 1.

Метод, с помощью которого Вы решили проблему, тоже вполне работоспособен (и нередко используется). В MS Office обычной практикой для обмена информацией между макросами модуля Userform и стандартных модулей является использования свойства Tag формы.
Владимир.

Борис_С

Не заметил, что у кнопки есть свойство Тип кнопки. Если использовать это свойство, обработчик события не нужен.