![]() |
|
|
![]()
|
|
| Alek86 |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
для того, чтобы сообщить юзеру, что он ввел неверное числовое значение в Edit, в MFC я нашел такой способ:
в функции
нужно добавить что-то типа:
но проблема в том, что: 1). DDV_MinMaxInt никаким образом не говорит программе, что значение было введено неверное. 2). Частично из-за 1) приходится самому, ручками проверять переменную, если я хочу при вводе неверного значения автоматически возвращать старое (после предупреждения). Причем делать этого в DoDataExchange методом:
я не могу, так как получится цилический вызов UpdateData, на что она ругается... чувствуется, что эти проблемы возникают достаточно часто. ну и сам вопрос - есть ли в MFC более подходящий мне механизм для обработки неправильных значений? |
||||||
|
|||||||
| BorisVorontsov |
|
|||
![]() Thinker ![]() ![]() Профиль Группа: Комодератор Сообщений: 714 Регистрация: 3.11.2005 Где: Молдавия, г. Киши нёв Репутация: нет Всего: 10 |
Да уж, ход конём нынче в моде.... чем не подошло событие EN_CHANGE?
-------------------- [code=cpp] const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out); for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl; [/code] |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
просто думал, что есть уже механизм типа того же DDV_MinMaxInt, который сам и гавкает и меняет и обновляет...
|
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
Нет ну все правильно DDV_MinMaxInt(pDX, m_step, 0, 1000) проверяет введенное значение на корректность и в случае проблемы выводит окошко с примерно таким текстом "Ай-яй-яй. Вы ввели неверное значение. Верное значение распологается в диапазоне от 0 до 1000". Но вот при каком условии он будет проверять (при каком условии будет происходить загрузка/чтение данных) MFC не регламетнирует и правильно делает т.к это относится к обязанностям программиста. Если ты хочешь чтобы проверка происходила на , скажем, изменение символа, обработай EN_CHANGE edit-контрола и вставь туда код
Это приведет к загрузке/валидации всех переменных. Второй вариант - обработать событие потери фокуса, тогда бесконечные окошки не будут досаждать, пока не захочешь покинуть контрол. И, наконец, если тебе не нравится окно, которое отображает DDV_MinMaxInt (оно не слишком информативно, к тому же у меня были проблемы с размерностью выводимых чисел) никто не заставляет тебя пользоваться именно этим обработчиком, напиши свой, но при это оставаясь "в духе" MFC (твой обработчик должен принимать объект класса CDataExchange. |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
ну, вопрос был не о том, куда мне писать UpdateData
а о том, есть ли функция (или что-то подобное), которая не просто выводит сообщение, а и дает знать о проблемах программе (DDV_MinMaxInt не дает) и, возможно, даже возвращает старое значение... |
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
Не могу вкурить что это значит. Если у тебя на экране появляется окно с ошибкой, как же программа при этом "не знает" о ней? А по поводу возврата старого значения - я посмотрел что делают DDX/DDV для текст. полей - они это не умеют. Все что умеет DDX_Text и DDV_MinMaxInt - это изменить текст и вывести окошко об ошибке, поставив фокус на проблемное поле для ввода. Если твой случай единичный, пиши в обработку что-то типа
А если контролов с проверкой мин/макс значения у тебя множество - пиши свой обработчик DDX_Text()/DDV_MinMaxInt() так чтобы они ставили старое значение. Это сообщение отредактировал(а) dizzy1984 - 1.2.2008, 12:50 |
|||
|
||||
| Alek86 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: нет Всего: 25 |
ну вот так, не знает... по крайней мере я не смог понять, как она может узнать DDV_MinMaxInt ничего не возвращает, а просто тихо у себя сравнивает значения и вызывает функцию, которая показывает сообщение...
это я уже понял, что придется :( просто некрасиво как-то выходит - самому еще раз проверять то же самое условие (на вхождение значения в диапазон), тупо делать SetWindowText... ладно, чтож, тема исчерпана |
||||
|
|||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |