TN026: подпрограммы DDX и DDV

ПримечаниеПримечание

В следующем техническом примечании не было обновлено, поскольку он сначала были включены в подключенной документации.В результате некоторые процедуры и разделы могут быть устаревший или неверны.Последние сведения, рекомендуется выполнить поиск интересной темы в подключенном индекса документации.

Эта заметка описание архитектуры (DDV) обмена данных (DDX) и проверки данных диалогового окна.Она также описывается, как создавать DDX_ или процедуры DDV_ и как можно расширить ClassWizard для использования пользовательских процедур.

Обзор обмена данными с диалоговым окном

Все функции данных диалогового окна с кодом C, C-++.Никаких особых ресурсы или волшебные макросов.Является основой механизма виртуальная функция, переопределена в каждом классе диалогового окна, который выполняет проверку и обмена данными с диалоговым окном.Он всегда находится в этой форме:

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);    // call base class

    //{{AFX_DATA_MAP(CMyDialog)
        <data_exchange_function_call>
        <data_validation_function_call>
    //}}AFX_DATA_MAP
}

Специальные комментарии формата AFX позволяют ClassWizard для поиска и отредактировав код внутри этой функции.Код, который не совместим с ClassWizard следует поместить вне специальных комментариев формата.

В предыдущем примере <data_exchange_function_call> в форме:

    DDX_Custom(pDX, nIDC, field);

и <data_validation_function_call> является необязательным и в форме:

    DDV_Custom(pDX, field, ...);

Несколько пар DDX_/DDV_ может быть включена в каждой функции DoDataExchange.

В разделе "afxdd_.h" список всех процедур обмена данными с диалоговым окном и процедур проверки данных диалогового окна, передаваемых с MFC.

Данные диалогового окна только то: данные элемента в классе CMyDialog.Он не хранится в структуре или любые подобные.

Примечания

Хотя мы будем называть эти данные "диалогового окна" все функции, доступные в любом классе, производном от CWnd, а не ограничиваются только диалоговые окна.

Начальные значения данных задаются в стандартный конструктор C, C-++, обычно в блоке //{{AFX_DATA_INIT и //}}AFX_DATA_INIT с комментариями.

операция CWnd::UpdateData, которая выполняет инициализацию и обработки ошибок вокруг вызова метода DoDataExchange.

CWnd::UpdateData можно вызвать в любое время для выполнения обмена данными и проверки.По умолчанию ( UpdateData) ИСТИННОЕ вызывается в обработчике UpdateData и CDialog::OnOK (по умолчанию) ЛОЖНЫХ вызывается в режиме по умолчанию CDialog::OnInitDialog.

Процедура DDV_ должна следовать процедура DDX_ для поля.

Принципы ее работы?

Нет необходимости понимать следующее для использования данных диалогового окна.Однако понимание того, как это работает в фоновом режиме позволяет написать собственную процедура обмена или проверки.

Функция-член DoDataExchange очень похоже на функцию-член Serialize - он отвечает за получение или параметра данные в внешней формы (в данном случае элементов управления в диалоговом окне) from/to данных члена класса.Параметр pDX контекст для такой обмен данными и аналогичен параметру CArchive значение CObject::Serialize.pDX (объект CDataExchange ) содержит флаг направления подобно CArchive имеет флаг направления:

  • Если !m_bSaveAndValidate, а затем загружает состояние данных в элементы управления.

  • Если m_bSaveAndValidate, а затем задать состояние данных от элементов управления.

Проверка возникает только при установке m_bSaveAndValidate.Значение m_bSaveAndValidate определяется параметром BOOL значение CWnd::UpdateData.

3 Других интересных члена CDataExchange.

  • m_pDlgWnd: Окно (обычно диалоговое окно), содержащий элементы управления.Это не вызывающие объекты глобальных функций DDX_ и DDV_ из передачи "this" к каждой процедуре DDX/DDV.

  • PrepareCtrl и PrepareEditCtrl. Добавляется элемент управления диалогового окна для обмена данными.Сохраняет этот дескриптор элемента управления для параметра фокус при неудачном завершении.PrepareCtrl используется для элементов управления nonedit и PrepareEditCtrl используется для элементов управления "Поле ввода".

  • Не пройден: Вызывается после получения вверх окно сообщения оповестя пользователь с ошибкой.Эта процедура восстановления фокус к последнему элементу управления (к последнему вызову PrepareCtrl/PrepareEditCtrl) и создает исключение.Этот функции-члена может вызываться из процедур и DDX_ и DDV_.

Расширения пользователя

Существует несколько способов расширения механизм DDX/DDV по умолчанию.Обеспечиваются следующие возможности.

  • Добавление новых типов данных.

    CTime
    
  • Добавьте новые процедуры обмена (DDX_???).

    void PASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTime& tm);
    
  • Добавьте новые процедуры проверки (DDV_???).

    void PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
    // make sure time is in the future or past
    
  • Передайте произвольные выражения на процедуры проверки.

    DDV_MinMax(pDX, age, 0, m_maxAge);
    
    ПримечаниеПримечание

    Такие произвольные выражения не могут редактироваться ClassWizard и поэтому не должны быть слева специальные комментарии формата (" {{AFX_DATA_MAP (CMyClass).

Наличие функции-члена DoDialogExchange включить условных выражениях или другие допустимые формулировки C и C-++ с перемешанными обменом вызовами функций проверки.

//{{AFX_DATA_MAP(CMyClass)
DDX_Check(pDX, IDC_SEX, m_bFemale);
DDX_Text(pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
if (m_bFemale)
    DDV_MinMax(pDX, age, 0, m_maxFemaleAge);
else
    DDV_MinMax(pDX, age, 0, m_maxMaleAge);
ПримечаниеПримечание

Как показано выше, такой код не может быть изменен ClassWizard и должен использоваться только вне специальных комментариев формата.

Поддержка ClassWizard

ClassWizard поддерживает подмножество настроек DDX/DDV с позволяет интеграции собственные процедуры DDX_ и DDV_ в интерфейс пользователя ClassWizard.Это только стоят полезную, если планируется повторно использовать определенные процедуры DDX и DDV в проекте или во многих проектах.

Чтобы сделать это, специальные записи выполняется в DDX.CLW (в предыдущих версиях Visual C-++ C, эти сведения в APSTUDIO.INI) или в файле .CLW проекта.Специальные записи можно вводить или в разделе [] общие сведения .CLW файла проекта или в разделе [] ExtraDDX файла DDX.CLW в \ Program Files \ Microsoft Visual Studio \ C Visual C-++ каталог \ bin.Можно создать файл DDX.CLW, если она еще не существует.Если планируется использовать пользовательские процедуры DDX_/DDV_ только в определенном проекте, добавьте записи в раздел [общие сведения] файла проекта .CLW вместо.Если планируется использовать процедуры по множеству проектов, добавьте записи в раздел [ExtraDDX] DDX.CLW.

Общий формат специальных записей выглядит следующим образом:

ExtraDDXCount=n

, где n - номер ExtraDDX?линии, должны следовать

ExtraDDX?=<keys>;<vb-keys>; <prompt>; <type>; <initValue>; <DDX_Proc>
[;<DDV_Proc>; <prompt1>; <arg1>; [<prompt2>; <fmt2>]]

где?1 – отображение n, DDX типа в список, определяется.

Каждое поле размежевано "; ".Поля и их назначение описаны ниже.

  • <keys>
    = одных список символов, для элементов управления диалогового окна, этот тип переменной разрешен.

    E = правка

    C = 2 - состояния checkbox

    C- = флажок три-состояния

    R = сначала переключатель в группе

    L = nonsorted список

    l = окно отсортированного списка

    M = поле со списком (с элементом правки)

    N = nonsorted список размещения

    n = упорядоченный список размещения

    1 = вставка при обмене данными в диалоговых окнах добавляется в начале списка, (по умолчанию) добавляет к концу это обычно используется для процедур DDX, которые перемещают свойство "элемента управления".

  • <vb-keys>
    Это поле используется только в 16 разрядном продукта для элементов управления VBX (управления VBX не поддерживаются в 32 разрядном продукте)

  • <prompt>
    Строка, которую требуется установить в поле со списком свойства (без кавычек)

  • <тип>
    Один идентификатор для типа, передаваемый в файле заголовка.В приведенном выше примере с DDX_Time, это будет присвоено значение CTime.

  • <vb-keys>
    Не используется в данной версии и всегда быть пустым

  • <initValue>
    Начальное значение — 0 или пробел.Если оно пустое, линия инициализации не будет записана в //{{AFX_DATA_INIT раздел файла реализации.Пустую запись должна использоваться для объектов C C-++ (например, CString, CTime и т д), которые имеют конструкторы, которые гарантируют правильность инициализацию.

  • <DDX_Proc>
    Один идентификатор для процедуры DDX_.Имя функции C C-++ должно начинаться с "DDX_", но не включает "DDX_" идентификатора <DDX_Proc>.В приведенном выше примере, идентификатор <DDX_Proc> был бы раз.При вызове функции ClassWizard записывает в файл реализации в разделе {{AFX_DATA_MAP, он добавляет это имя в DDX_, таким образом приезжающ в DDX_Time.

  • <comment>
    Прокомментируйте для отображения в диалоговом окне для переменной с этим DDX.Задайте любой текст, который необходимо было бы здесь, и обычно убедитесь, описывает операцию, выполненную парами DDX/DDV.

  • <DDV_Proc>
    Часть DDV записи необязательна.Не все процедуры DDX имеют соответствующие процедуры DDV.Зачастую более просто включить этап проверки как целая часть передачи.Это часто случай, когда процедура DDV не требует никаких параметров, поскольку ClassWizard не поддерживает процедуры DDV без каких-либо дополнительных параметров.

  • <arg>
    Один идентификатор для процедуры DDV_.Имя функции C C-++ должно начинаться с "DDV_", но не включает "DDX_" идентификатора <DDX_Proc>.

за 1 или 2 DDV аргументами.

  • <promptX>
    строка в локальном перед элементом (& для правки с сочетанием клавиш)

  • <fmtX>
    символ формата для типа, один из аргументов

    d = int

    u = удалить

    D = long int (т е long)

    U = долго удаленный подписи (т е DWORD)

    f = float

    F = double

    s = строка

См. также

Другие ресурсы

Технические замечания по номеру

Технические замечания по категориям