Поиск:

Ответ в темуСоздание новой темы Создание опроса
> когда в edit введено неправильное значение... 
V
    Опции темы
Alek86
Дата 31.1.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: нет
Всего: 25



для того, чтобы сообщить юзеру, что он ввел неверное числовое значение в Edit, в MFC я нашел такой способ:

в функции

Код

void DoDataExchange(CDataExchange* pDX)


нужно добавить что-то типа:
Код

DDV_MinMaxInt(pDX, m_step, 0, 1000);


но проблема в том, что:

1). DDV_MinMaxInt никаким образом не говорит программе, что значение было введено неверное.
2). Частично из-за 1) приходится самому, ручками проверять переменную, если я хочу при вводе неверного значения автоматически возвращать старое (после предупреждения). Причем делать этого в DoDataExchange методом:
Код

m_step = default_step;
UpdateData(FALSE);

я не могу, так как получится цилический вызов UpdateData, на что она ругается...


чувствуется, что эти проблемы возникают достаточно часто.
ну и сам вопрос - есть ли в MFC более подходящий мне механизм для обработки неправильных значений?


--------------------
user posted image    user posted image
PM MAIL   Вверх
BorisVorontsov
Дата 31.1.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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]
PM MAIL ICQ GTalk   Вверх
Alek86
Дата 31.1.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: нет
Всего: 25



просто думал, что есть уже механизм типа того же DDV_MinMaxInt, который сам и гавкает и меняет и обновляет...


--------------------
user posted image    user posted image
PM MAIL   Вверх
dizzy1984
Дата 1.2.2008, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Нет ну все правильно DDV_MinMaxInt(pDX, m_step, 0, 1000) проверяет введенное значение на корректность и в случае проблемы выводит окошко с примерно таким текстом "Ай-яй-яй. Вы ввели неверное значение. Верное значение распологается в диапазоне от 0 до 1000". Но вот при каком условии он будет проверять (при каком условии будет происходить загрузка/чтение данных) MFC не регламетнирует и правильно делает т.к это относится к обязанностям программиста. Если ты хочешь чтобы проверка происходила на , скажем, изменение символа, обработай EN_CHANGE edit-контрола и вставь туда код
Код

UpdateData();

Это приведет к загрузке/валидации всех переменных.
Второй вариант - обработать событие потери фокуса, тогда бесконечные окошки не будут досаждать, пока не захочешь покинуть контрол. И, наконец, если тебе не нравится окно, которое отображает DDV_MinMaxInt (оно не слишком информативно, к тому же у меня были проблемы с размерностью выводимых чисел) никто не заставляет тебя пользоваться именно этим обработчиком, напиши свой, но при это оставаясь "в духе" MFC (твой обработчик должен принимать объект класса CDataExchange.
PM MAIL   Вверх
Alek86
Дата 1.2.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: нет
Всего: 25



ну, вопрос был не о том, куда мне писать UpdateData smile
а о том, есть ли функция (или что-то подобное), которая не просто выводит сообщение, а и дает знать о проблемах программе (DDV_MinMaxInt не дает) и, возможно, даже возвращает старое значение...


--------------------
user posted image    user posted image
PM MAIL   Вверх
dizzy1984
Дата 1.2.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Цитата(Alek86 @  1.2.2008,  12:44 Найти цитируемый пост)
 дает знать о проблемах программе

Не могу вкурить что это значит. Если у тебя на экране появляется окно с ошибкой, как же программа при этом "не знает" о ней? А по поводу возврата старого значения - я посмотрел что делают DDX/DDV для текст. полей -  они это не умеют.
Все что умеет DDX_Text и DDV_MinMaxInt - это изменить текст и вывести окошко об ошибке, поставив фокус на проблемное поле для ввода.  Если твой случай единичный, пиши в обработку что-то типа
Код

CString sCurrentText;
CWnd *TroubleEdit = GetDlgItem(IDC_MY_TEXTBOX);
TroubleEdit->GetWindowText(sCurrentText);
if (!UpdateData())
{
    TroubleEdit->SetWindowText(sCurrentText);
}

А если контролов с проверкой мин/макс значения у тебя множество - 
пиши свой обработчик DDX_Text()/DDV_MinMaxInt() так чтобы они ставили старое значение.


Это сообщение отредактировал(а) dizzy1984 - 1.2.2008, 12:50
PM MAIL   Вверх
Alek86
Дата 1.2.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: нет
Всего: 25



Цитата(dizzy1984 @  1.2.2008,  12:48 Найти цитируемый пост)
Не могу вкурить что это значит. Если у тебя на экране появляется окно с ошибкой, как же программа при этом "не знает" о ней?

ну вот так, не знает... по крайней мере я не смог понять, как она может узнать
DDV_MinMaxInt ничего не возвращает, а просто тихо у себя сравнивает значения и вызывает функцию, которая показывает сообщение...



Цитата(dizzy1984 @  1.2.2008,  12:48 Найти цитируемый пост)
пиши свой обработчик DDX_Text()/DDV_MinMaxInt() так чтобы они ставили старое значение.


это я уже понял, что придется :(
просто некрасиво как-то выходит - самому еще раз проверять то же самое условие (на вхождение значения в диапазон), тупо делать SetWindowText...

ладно, чтож, тема исчерпана smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
dizzy1984
Дата 4.2.2008, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



[offtop]
Цитата(Alek86 @  1.2.2008,  17:07 Найти цитируемый пост)
просто некрасиво как-то выходит

Все в порядке, ты ведь пишешь на MFC.
[/offtop]
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.