Contrast
Дата: 04.01.2012 19:52:00
Доброго времени суток!
Голову сломал, поиск затерзал, но что-то ничего не понимаю...
Есть форма, на ней TextBox для ввода дат. Контрол свободный, т.е. не связанный с RecordSet.
Задача простая - проверить введенное значение на допустимость (нижняя и верхняя границы - значения других контролов, ну или хотя бы "=Date()"), при недопустимости ввода - сообщить об этом пользователю и восстановить значение, имевшееся перед вводом.
Казалось бы, элементарно. Но есть несколько "засад":
1. если проверять значение в процедуре BeforeUpdate не говоря уж об AfterUpdate, то поздно "откатываться" - .Value и .OldValue уже равны, .Text им соответствует. (видимо .OldValue имеет смысл только для контролов, связанных с RecordSet). В этом легко убедиться в режиме отладки.
2. если проверять значение в процедуре Change, то приходится работать со свойством .Text, т.к. .Value и .OldValue еще равны предыдущему значению. Но самое неприятное в этом способе, что Change срабатывает на изменение/ввод/удаление любого символа и оценивать промежуточное значение не имеет смысла. (попробуйте-ка предположить, что я имею ввиду когда удалю цифры месяца и в поле будет "12..2011")
3. если вводить дату с помощью календаря, то при нескольких последовательных допустимых вводах (без перестановки фокуса на другие контролы) и вводе потом некорректного (недопустимого) значения, "откат происходит" к самому первому (имевшемуся на момент получения фокуса) значению. А хотелось бы на последнее введенное допустимое. Но с этим еще, на крайняк, можно мириться.
Собственно вопросы:
1. Как в таких условиях можно "откатиться" к предыдущему значению?
2, 3. Можно ли отключить возможность "ручного" ввода дат и оставить только возможность ввода посредством календаря?
Интересует не столько "ДА/НЕТ", сколько "КАК". :)
Спасибо!
Да. A2007
Владимир Саныч
Дата: 04.01.2012 20:08:16
Не пробовал, но предлагаю: запомнить старое значение при первом входе в Change (отличить первый от непервого несложно), а саму проверку делать на BeforeUpdate.
Contrast
Дата: 04.01.2012 20:22:24
Владимир Саныч,
Мысль здравая!
так и сделаю. только запоминать значение буду не в первом вызове Change, а в Enter или GotFocus - меньше ухищрений с выделением первого входа
Спасибо!
Contrast
Дата: 04.01.2012 20:24:52
Contrast,
кстати, свойство .Tag на роль "временного хранилища" смотрится вполне привлекательно.
Спасибо всем!
Навели на мысль.
Тему закрываем.
Contrast
Дата: 06.01.2012 19:05:52
Владимир Саныч |
---|
либо нажать на Esc (и тогда старое значение восстановится само). |
хм...
по Esc у меня форма закрылась. Как по кнопке "Отмена", есть такая на форме со стандартным поведением. К тому ж, сдается мне, что "отката" не получится, т.к. .OldValue содержит не предыдущее значение, а только что введенное (проверялось в пошаговом)
Путем недлительных экспериментов пришел к Exit(Cancel). Тут и цепочка Event-ов обрывается по Cancel, и .Value можно переписать.
Век живи - век учись.