Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2014, 15:12   #1
juceser
Новичок
Джуниор
 
Регистрация: 09.06.2014
Сообщений: 2
По умолчанию Закрытие формы по Cancel без обработки событий Exit

Добрый день,

Топчусь с простым вроде бы делом.

Есть форма с большим числом полей. Почти в каждом проверяется условие заполненности по выходу из ComboBox типа -
Код:
Private Sub ComboBox_sex_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  ComboBox_sex.BackColor = vbWhite
 If ComboBox_sex.Value = "" Then
   MsgBox "Пол должен быть заполнен!"
   ComboBox_sex.BackColor = vbYellow
   Exit Sub: Cancel = True
 End If
End Sub
на форме есть кнопка Отмена. По нажатии по ней форма набора данных закрывается - возвращаемся в меню.

Однако ни
Код:
Public Sub CommandButton_Cancel_Click()
 Me.Hide
End Sub
ни Unload Me

не завершаются нормально. Вернее если я нахожусь на комбобоксе где нет обработчика по Exit все хорошо. А если ксть то обязательно выплюнет MsgBox, а потом закроется.

Экспериментировал с Application.EnableEvents = False
не помогает.

Что посоветуете? Как универсально отключить обработку во всех ComboBox при нажатии Отмены? ведь пользователь может отменить ввод на любом этапе, находясь в фокусе на любом элементе.
Попытка передать фокус, а затем выгрузить форму также не проходит поскольку сначала обрабатывается событие Exit ComboBox.

Спасибо.

Последний раз редактировалось Stilet; 22.12.2014 в 18:36.
juceser вне форума Ответить с цитированием
Старый 22.12.2014, 15:50   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Как универсально отключить обработку во всех ComboBox при нажатии Отмены?
чтобы войти в отмена и отменить обработчик надо сначала получить фокус.
Чтобы получить фокус надо обработать OnExit.
Другими словами
чтобы отменить обработчик, надо чтобы он отработал.

Так что фокус с отменой обработчика не пройдет.

Цитата:
Что посоветуете?
Можно посоветовать. Отказаться от OnExit
Делать проверку полей один раз в одном месте при нажатии на кнопку сохранить (точнее ПЕРЕД вызовом процедуры СОХРАНИТЬ).
И по результатам проверок:
-либо сохранять и закрывать;
-либо отказаться от закрытия и переводить фокус на неверно заполненное поле.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.12.2014, 15:52   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

задайте в модуле формы переменную ВыходПоЛюбому

при инициализации формы присвойте ВыходПоЛюбому = False
при нажатии на Cancel присвойте
ВыходПоЛюбому = True
Me.Hide


в каждой из процедур проверки при выходе
Private Sub ComboBox_sex_Exit(ByVal Cancel As MSForms.ReturnBoolean)
пишите первой строкой
if ВыходПоЛюбому then Exit Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 22.12.2014, 17:04   #4
juceser
Новичок
Джуниор
 
Регистрация: 09.06.2014
Сообщений: 2
По умолчанию

Не работает.
Сделал так -

Option Explicit
Private isCancel As Boolean


Private Sub UserForm_Initialize()
isCancel = False

Private Sub ComboBox_sex_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If isCancel Then
Unload Me
Exit Sub
Else
ComboBox_sex.BackColor = vbWhite
If ComboBox_sex.Value = "" Then
MsgBox "Пол должен быть заполнен!"
ComboBox_sex.BackColor = vbYellow
Exit Sub: Cancel = True
End If
End If
End Sub


Public Sub CommandButton_Cancel_Click()
isCancel = True
End Sub

При нахождении фокуса на комбобоксе ComboBox_sex
по нажатию на Cancel возникает сообщение, цвет меняется на желтый и лишь по второму щелчку по Cancel форма закрывается.

Перенос Unload Me в процедуру обработки Cancel ничего не меняет.
juceser вне форума Ответить с цитированием
Старый 22.12.2014, 17:23   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

При нахождении фокуса на комбобоксе ComboBox_sex
Вы переносите курсор на кнопку Cancel и жмете
сначала возникает событие ComboBox_sex потерял фокус (выход из элемента управления) и срабатывает стандартная процедура ComboBox_sex_Exit

а когда нажали Cancel (в предыдущем варианте там было Me.Hide, сейчас не вижу)
метод Hide формы посылает команду закрыться всех контролам, у каждого их них срабатывает метод Exit, вот второй раз ComboBox_sex_Exit срабатывает уже при isCancel = True

все логично
читайте матчасть
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 22.12.2014, 17:29   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

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

Вы уж определитесь, что Вам нужно, напишите логично код и все тут же начнет работать...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
QT - цикл обработки событий. Базиля Помощь студентам 6 25.10.2013 16:54
Как перехватить закрытие Windows-приложения без формы? Tolias C# (си шарп) 9 27.01.2012 05:14
Автозапуск без перехвата событий Вождь Microsoft Office Word 3 14.02.2011 06:02
Модели обработки событий Java-приложений java_java_java Общие вопросы по Java, Java SE, Kotlin 1 10.07.2009 12:00
Инициализировать класс, например, для обработки событий с OLE CaptainNemo Microsoft Office Excel 1 15.06.2009 06:21