![]() |
|
![]() ![]() ![]() |
|
Inga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 18.11.2005 Репутация: нет Всего: нет |
Подскажите, как правильно написать обработчик OnValidate для поля в таблице?
Например, поле имеет тип AsCurrency и содержит значения типа 78,53, а пользователь вводит туда ошибочно, например, дату типа 25.02.2006. Естественно при нажатии Enter возникает исключение. Как его правильно обработать в OnValidate поля, чтобы показать ShowMessage о некоренных данных и отменить ввод этих не правильных данных? Cпасибо. |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
OnValidate предназначен для обработки логических ошибок. Он бы подошел, например, если бы пользователь ввел 100, а по логике он должен ввести не более 50.
В вашем же случае имеется ошибка преобразования. Для ее обработки Вам надо воспользоваться скорее всего событиями OnEditError или OnPostError
Кстати можно воспользоваться событием событием OnSetText для того чтобы отслеживать, что конкретно ввел пользователь -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
Inga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 18.11.2005 Репутация: нет Всего: нет |
>надо воспользоваться скорее всего событиями OnEditError или OnPostError
Спасибо, буду пробывать. |
|||
|
||||
Inga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 18.11.2005 Репутация: нет Всего: нет |
>Кстати можно воспользоваться событием событием OnSetText для того чтобы отслеживать, что конкретно ввел пользователь
Пишу обработчик: void __fastcall TForm1::Table1PriseSetText(TField *Sender, const AnsiString Text) { Currency C; try { C = StrToCurr(Text); } catch(...) { ShowMessage("Не правильный ввод" + Text); Abort(); } } Через буфер обмена вставляю в запись не правильную запись например 25.02.2006. Как я понимаю должен появиться ShowMessage, а я получаю исключение: 25.02.2006 is not a valid floating point value Как правильно обработать вставку не верного значения в запись из буфера обмена? |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Случайно, не в режиме отладки при запуске в IDE получаете это сообщение?
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
Inga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 18.11.2005 Репутация: нет Всего: нет |
>Случайно, не в режиме отладки при запуске в IDE получаете это сообщение?
Да, нажимаю кнопку компиляции и дальше в форме беру копирую из строки другого компонента значение 25.02.2006 и вставляю в грид. Значение вставляется. Нажимаю Enter и получаю исключение. При попытки ввести не правильное значение в это поле с клавиатуры, не правильные символы игнорируются т.е. все нормально, а вот при вставке из буфера обмена получаю исключение. ![]() |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Так этож правильно. Вы дайте дальше программе поработать и получитете нужное сообщение. Это IDE так настроен у Вас, что бы показывать где и какое исключение возникнет вне зависимости есть перехват или нет далее по коду. Что бы понятно было, запустите Вашу программу не из IDE, и все будет работать так как Вы и предполагали
![]() C праздником Вас. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
Inga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 18.11.2005 Репутация: нет Всего: нет |
Ура! Работает (если запускать не из IDE). Два дня я мучилась – искала ошибку. Мне и в голову не приходило, что надо запустить без IDE.
Скажите, мой обработчик Table1PriseSetText полностью корректен? Может в catch надо передать что-то другое для надежности? Большое спасибо за помощь и поздравления! С уважением, Инга. |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
В общем сойдет. Но с точки зрения правильности не стоит использовать конструкцию cath(...). Лучше указать то, что Вы ожидаете здесь перехватить.
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
Inga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 18.11.2005 Репутация: нет Всего: нет |
Ух, вот опять что-то не понятное с этим полем.
![]() Если вставляю через буфер, то получаю свой ShowMessage как и предполагалось, но если набираю в это поле то, что нужно (цифры) и нажимаю Enter то поле просто очищается и мое значение пропадает. Если убрать обработчик, то все нормально. Таким образом, я не могу ввести в поле при наличии этого обработчика любые правильные значения, ничего не происходит в плане ошибок, но после Enter, новая запись очищается. Как сохранить и обработчик Table1PriseSetText и иметь возможность вводить в это поле нормальные записи? |
|||
|
||||
Inga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 18.11.2005 Репутация: нет Всего: нет |
Вот переделала код:
Вроде работает. Это окончательный вариант, или могут быть снова подводные камни и что-то мною не учтено? ![]() |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Извиняюсь, не заметил, что в Вашем обработчике значение текста никуда не присвавивается.
Тогда уж так
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
Inga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 18.11.2005 Репутация: нет Всего: нет |
Спасибо, но по-прежнему требуется вводить в обработчик все новые и новые проверки.
![]() Например, пользователь взял и очистил одну из записей в этой колонке. Теперь он ставит фокус мыши на другую запись и получает ShowMessage("Не правильный ввод " + Text); и курсор остается на месте удаленной записи. Хотелось бы, чтобы после удаления можно было бы перейти на другую запись без проблем. Следовательно, надо еще и обработать возможность, что пользователь просто очищает запись. Однако пока не знаю как. Курсор остается мигать в месте, где запись удалена и при любом следующем щелчке в стороне на другой записи пользователь получает ShowMessage, пока не введет в удаленную запись цифру. |
|||
|
||||
Inga |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 18.11.2005 Репутация: нет Всего: нет |
Очередная моя версия вроде делает то, что надо, но опять же все ли я предусмотрела? Не думала, что простая проверка на ввод значения в поле будет такая замысловатая...
![]()
|
|||
|
||||
Vyacheslav |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Это признак того, что у Вас с логикой работы приложения не все впорядке. -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |