Корректный выход из DTPicker_LostFocus

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Корректный выход из DTPicker_LostFocus

Сообщение Osteon » 13.07.2016 (Ср) 14:04

Здравствуйте, уважаемый форумчане!

На форме имеем два DTPicker - дата рождения и дата регистрации. Делаю проверку от некорректного ввода даты в процедуре LostFocus первого пикера:
Конструкция
If
- если дата рождения больше даты регистрации в пикере мин. дату, выхожу из процедуры
Elseif
- если регистрируемому больше ста лет, на всякий случай спрашиваю пользователя
Endif

Когда фокус находится в первом пикере, и я нажимаю кнопку "Выход" (выгружаю форму), то автоматически отрабатывается процедура DTPicker_LostFocus, отрабатывается ветвь Elseif ... Endif

Как этого избежать, и отработать Unload Me сразу? Что-то я затупил или из-за излишков мозга, или от его отсутствия... :?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Корректный выход из DTPicker_LostFocus

Сообщение ger_kar » 13.07.2016 (Ср) 14:20

А почему используется событие LostFocus, а не Validate? Далее,
Osteon писал(а):Когда фокус находится в первом пикере, и я нажимаю кнопку "Выход" (выгружаю форму), то автоматически отрабатывается процедура DTPicker_LostFocus, отрабатывается ветвь Elseif ... Endif
Все правильно, контрол теряет фокус, при этом, если дата не была введена корректно, то от второй даты отнимается ноль, и получается разница более 100 лет.
Osteon писал(а):Как этого избежать, и отработать Unload Me сразу? Что-то я затупил или из-за излишков мозга, или от его отсутствия...
Ну тут вариантов вагон. Например при выгрузке формы устанавливать соответствующий флаг выгрузки в виде булевой переменной уровня формы и при проверке корректности ввода данных первоначально проверять этот флаг, и если он установлен пропускать все дальнейшие действия.
Бороться и искать, найти и перепрятать

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Корректный выход из DTPicker_LostFocus

Сообщение Osteon » 14.07.2016 (Чт) 9:21

ger_kar писал(а):А почему используется событие LostFocus, а не Validate?

Привык к LostFocus, а Validate даже не пробовал ни разу... Попробую... :-?

ger_kar писал(а): устанавливать соответствующий флаг выгрузки в виде булевой переменной

Пожалуй, самый простой способ обойти повторную отработку Elseif ... Endif. Как-то даже в голову не пришло... :scratch:

Спасибо за подсказку. Удачных дней! :)

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Корректный выход из DTPicker_LostFocus

Сообщение Osteon » 14.07.2016 (Чт) 14:21

Validate поюзал - более функциональная функция для определенных проверок.
И снова та же закавыка - по сути, код функции LostFocus я скопировал в Validate. Если пользователь допускал ошибку в дате, я его возвращал в пикер посредством SetFocus. В Validate это же делает Cancel = True. И опять при нажатии на выход происходит Пикер_Validate, и проверка. Выйти можно, только если ввести корректную дату. Это лишние телодвижения...
Пробовал через KeyPress (If KeyAscii = 27 Then), но тогда опять лишнее нажатие клавиши Escape, затем снова на кнопку "Выход". Да и зачем пользователя заставлять лишний раз клавишу нажимать?
Пробовал булеву переменную втыкать первой строкой в код клавиши "Выход", но ведь все равно сначала происходит Validate...
В обЧем, пока застрял... :(

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Корректный выход из DTPicker_LostFocus

Сообщение ger_kar » 16.07.2016 (Сб) 11:30

Osteon писал(а):Пробовал булеву переменную втыкать первой строкой в код клавиши "Выход", но ведь все равно сначала происходит Validate...
При чем здесь клавиша выход? А если пользователь решит просто закрыть форму воспользовавшись оконным меню? Нужно использовать соответствующие события формы Form_QueryUnload или Form_Unload. И событие Validate должно всегда происходить, а уже обработка этого события будет зависеть от некоторых условий. Кстати, событием Validate в отличии от Form_LostFocus можно управлять использую свойство CausesValidation.
Установи в одном из событий Form_QueryUnload или Form_Unload флаг, а свой код в обработчике Validate обрами условием проверки флага:
Код: Выделить всё
...
If not flExit Then
    ... ' Код обработчика
End if
Бороться и искать, найти и перепрятать

Osteon
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 122
Зарегистрирован: 17.01.2013 (Чт) 5:53

Re: Корректный выход из DTPicker_LostFocus

Сообщение Osteon » 17.07.2016 (Вс) 15:51

Под "клавишей" я имел в виду командную кнопку (CommandButton), у которой .Caption="Выход". Ввел в заблуждение, извините...
Если нажать на кнопку "Выход", в любом случае сначала отработается LostFocus, (или Validate), и только потом начнет выполняться код кнопки. Если выходить через оконное меню, в любом случае пикер сначала потеряет фокус, и отработается Validate.
Другими словами, прежде, чем возникнут Form_QueryUnload или Form_Unload, пикер сначала потеряет фокус...
Или я что-то не так понимаю? Или я вообще ничего не понимаю... :(

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Корректный выход из DTPicker_LostFocus

Сообщение ger_kar » 17.07.2016 (Вс) 21:43

Поэтому и нужно использовать Validate, а не LostFocus и у кнопки выхода надо свойство CausesValidation выставить в False, тогда при нажатии на эту кнопку событие валидации происходить не будет.
Osteon писал(а):Другими словами, прежде, чем возникнут Form_QueryUnload или Form_Unload, пикер сначала потеряет фокус...
Поэтому и не нужно заморачиваться на потерю фокуса.
Бороться и искать, найти и перепрятать


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList