Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Урок 24. Функции DDV / Уроки MFC / Visual C++
Visual C++. MFC Урок 24. Функции DDV
На этом занятии мы с вами рассмотрим функции DDV_... . Их, как и функций DDX_, достаточно много (мало того, вы сами можете определять свои собственные). Служат эти функции для проверки введенных пользователем данных. Типичный пример использования такой функции - это проверка, что введенное пользователем число лежит в определенном диапазоне.
Для конкретного примера возьмем программу, созданную на предыдущих двух уроках. Найдите в классе CMyDlg реализацию метода DoDataExchange и добавьте следующую строку:
void CMyDlg::DoDataExchange(CDataExchange* pDX){
//обязательно вызываем родительский метод
CDialog::DoDataExchange(pDX);
//обмениваем данные с Edit'ом
DDX_Text(pDX, IDC_EDIT1, m_sData);
DDV_MaxChars(pDX, m_sData, 3);//обмениваем данные с CheckBox'ом
DDX_Check(pDX, IDC_CHECK1, m_bCheck);
}
Синтаксис у добавленной нами функции такой: первый параметр pDX (типа CDataExchange*) - это контекст обмена. Он нужен для функций DDX_ и DDV_ (например, он хранит информацию о том, куда движутся данные - от элементов управления к соответствующим переменным или обратно). Второй параметр - это переменная, связанная с нашим элеменом управления (именно на нее и накладываются некоторые ограничения). Третий и последующие параметры (если они есть) - это сами ограничения. В нашем случае мы добавили ограничение на максимальное число вводимых символов в нашем edit'е (три символа).
Вот еще несколько примеров функций DDV_ (у всех их них по четыре параметра):
DDV_MinMaxLong - для проверки, что некое число типа long лежит в некоторых пределах,
DDV_MinMaxInt - для проверки, что некое число типа int лежит в некоторых пределах,
DDV_MinMaxFloat - для проверки, что некое число типа float лежит в некоторых пределах.
Небольшое замечание по месту вызова DDV_ функций. Их рекомендуется вызывать сразу после соответствующей функции DDX_ (как в нашем примере: сначала мы вызвали функцию обмена DDX_Text(pDX, IDC_EDIT1, m_sData); для нашего edit'а и переменной m_sData, и сразу за этим функцию проверки DDV_MaxChars(pDX, m_sData, 3); для этой же переменной m_sData).
У всех функций DDV_ существует одно ограничение - проверка корректности данных осуществляется только после того, как кользователь нажимает на OK, а не в процессе набора. И это не слишком хорошо.