Нестандартная реализация DDX/DDV

   
На этом шаге мы рассмотрим реализацию пользователем механизма DDX/DDV.

   
Вы можете определить собственные DDX/DDV-функции. В качестве параметров DDX-функции следует
передавать указатель на объект CDataExchange, идентификатор элемента управления и переменную класса
диалога. DDV-функции передают указатель на объект CDataExchange и переменную-член класса
диалога. Другие параметры описывают условия проверки; так, например, функция DDVMinMaxInt() получает
наибольшее и наименьшее допустимые значения целого числа. DDV-функцию располагают всегда непосредственно
после вызова DDX-функции, с которой она связана.

   
Необходимость в собственных DDV-функциях иногда возникает в случае, когда требуется проверить введенные
значения, сравнивая их не с константами, а с переменными, или когда проверки следует проводить лишь при некотором
условии. Так, например, в приведенном ниже фрагменте кода применяются различные варианты контроля в зависимости
от состояния флажка IDC_FEMALE, показывающего, с какой из двух переменных нужно сравнить введенное
значение переменной m_age.

//{{AFX_DATA_MAP(CMyClass) 
DDX_Check(pDX,   IDC_FEMALE,   m_bFemale); 
DDX_Text(pDX,   IDC_EDIT1,   m_age); 
//}}AFX_DATA_MAP 
if (m_bFemale)
    DDV_MinMax(pDX,   m_age,   0,   m_maxFemaleAge); 
else
    DDV_MinMax(pDX,   m_age,   0,   m_maxMaleAge);

   
Из примера также видно, что все нестандартные DDX/DDV-функции должны располагаться вне блока
//{{AFX_, в котором находится код, обслуживаемый ClassWizard.

   
Добавим собственные функции проверки значений, вводимых пользователем в поле UserID.

  • Добавление собственного механизма проверки вводимых данных.
  • В файл ConnectDialog.h приложения MyApp добавьте следующее
    объявление глобальной функции за пределами определения класса CConnectDialog:

        void PASCAL DDV_Required(CDataExchange * pDX,   CString str);
    


    Рис.1. Добавление описания глобальной функции
    2 Добавьте описание функции DDV_Required() в конец файла СоnnectDialog.cpp:

    void PASCAL DDV_Required(CDataExchange * pDX,   CString str)
    {
      if (pDX->m_bSaveAndValidate && str. IsEmpty())
     {
       AfxMessageBox("Please enter the User ID."); 
       pDX->Fail(); 
      } 
    }
    


    Рис.2. Добавление текста функции

       
    Заметьте, что для подтверждения выполнения проверки данных проверяется значение переменной-члена
    CDataExchange::m_bSaveAndValidate. Кроме того, обратите внимание, как посредством функции
    CDataExchange::Fail() можно обойти стандартную проверку и оставить фокус ввода в элементе управления,
    не прошедшем контроль.

  • Найдите в файле ConnectDialog.cpp реализацию функции CConnectDialog::DoDataExchange().
    Выделите следующие две строки:

      DDX_Text(pDX,   IDC_USERID,   m_strUserID); 
      DDV_MaxChars(pDX,   m_strUserID,   15);
    


    Рис.3. Выделение строк

  • Нажмите CTRL+X, чтобы удалить эти строки из их текущей позиции в блоке //{{AFX_DATA_MAP
    и поместите их в буфер обмена.
  • Нажав CTRL+V, вставьте удаленные строки в новое место ниже блока
    //{{AFX_ DATA_MAP внутри функции DoDataExchange().
  • Непосредственно под этими строчками введите строку с вызовом функции DDV_Required():
      DDV_Required(pDX,   m_strUserID);
    

    Теперь функция DoDataExchange() будет выглядеть следующим образом:

    void CConnectDialog::DoDataExchange(CDataExchange* pDX)
    {
       CDialog::DoDataExchange(pDX);
       //{{AFX_DATA_MAP(CConnectDialog)
       DDX_Text(pDX, IDC_PASSWORD, m_strPassword);
       DDV_MaxChars(pDX, m_strPassword, 15);
       DDX_Text(pDX, IDC_ACCESS, m_nAccess);
       DDV_MinMaxInt(pDX, m_nAccess, 1, 5);
       DDX_Check(pDX, IDC_CHECKCONTROL, m_bConnect);
       //}}AFX_DATA_MAP
       DDX_Text(pDX, IDC_USERID, m_strUserID);
       DDV_MaxChars(pDX, m_strUserID, 15);
       DDV_Required(pDX, m_strUserID);
    }
    


    Рис.4. Функция DoDataExchange()

  • Соберите и запустите приложение МуАрр. В меню Data выберите команду Connect и
    посмотрите, что произойдет, если щелкнуть кнопку Connect, не заполнив перед этим поле User ID.

   
Текст измененного приложения можно взять здесь (48,3 Кб).

   
На следующем шаге мы рассмотрим реализацию функции OnInitDialog().



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий