TN026: DDX и DDV процедуры

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

Обзор обмен данных

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

void CMyDialog::DoDataExchange (CDataExchange * pDX)
{
 nbsp;  CDialog::DoDataExchange(pDX);    / / вызова базового класса

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

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

В приведенном выше примере, lt; data_exchange_function_call > в виде:

    DDX_Custom (pDX, НИДК, поле)

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

    DDV_Custom (pDX, поле,...)

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

Смотрите «afxdd_.h» списки всех процедур обмена данных диалоговое окно и диалоговое окно подпрограмм проверки данных, предоставляемым в MFC.

Диалоговое окно данные являются просто что - члена в классе CMyDialog . Он не хранится в struct или какие-либо специальные подобное.

Примечания

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

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

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

CWnd::UpdateData можно вызвать в любое время для выполнения обмена данными и проверки. По умолчанию в обработчике CDialog::OnOK по умолчанию называется UpdateData(TRUE) и в CDialog::OnInitDialog по умолчанию называется UpdateData(ложь).

DDV_ процедура должна следовать непосредственно за DDX_ обычные для этого поля.

Как это работает?

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

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

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

Существует три других интересных членов CDataExchange:

Пользовательские расширения

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

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

//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, m_bFemale);
DDX_Text (pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
Если (m_bFemale)
    DDV_MinMax (pDX, возраст, 0, m_maxFemaleAge);
остальное
    DDV_MinMax (pDX, возраст, 0, m_maxMaleAge)

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

Поддержка ClassWizard

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

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

Общий формат этих специальных записей:

ExtraDDXCount = n

; где n — это количество ExtraDDX? линии следовать

ExtraDDX? = lt; ключи >; < vb ключи >; <prompt> <type> <initValue> <DDX_Proc> [; <DDV_Proc> <prompt1> <arg1> [<prompt2> <fmt2>]]

; Где? Это номер 1-n указанием DDX тип в списке, который определяется.

Каждое поле отделяется символом «;». Ниже приводится описание полей и их назначение.

lt; ключи & gt;

= Список отдельных символов, определяющее, возможен для элементов управления диалогового окна, которые этот тип переменной.

E = редактировать

C = двух государств "флажок"

c = "флажок" tri государство

R = первый переключатель в группе

L =-сортировка списка

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

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

N = список не отсортирован

n = отсортированный список

1 = Если DDX вставки следует добавить голову списка (по умолчанию добавить в хвост)   Это обычно используется для DDX подпрограмм, которые передают свойства «Управления».

lt; vb ключей & gt;

это поле используется только в 16-разрядных продукта для VBX элементов управления (VBX элементы управления не поддерживаются в 32-разрядных продукта)

lt; оперативное > =

строка для размещения в поле со списком свойства (без кавычек)

lt; тип > =

единый Идентификатор для типа испускают в заголовочном файле. В нашем примере выше с DDX_Time это будет иметь значение для CTime.

lt; vb ключи > =

в данной версии не используется и всегда должен быть пустым

lt; initValue > =

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

lt; DDX_Proc > =

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

lt; комментарий > =

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

lt; DDV_Proc & gt;

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

= один идентификатор для процедуры DDV_. Имя функции C++ должно начинаться с «DDV_», но не включает «DDX_» в lt; DDX_Proc > идентификатор.

после чего args DDV 1 или 2:

lt; promptX > =

строка для поставить выше элемент редактирования (с & для ускорителя)

lt; fmtX > =

символ формата для arg типа, один из

d = int

u = без знака

D = длинные int (то есть, долго)

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

f = float

F = двойной

s = строка

Пример пользовательских DDX

Пример пользовательских DDX с проверкой можно найти в образце концепции перспективных MFC CHKBOOK. Смотрите DDX_DollarsCents в DOLLCENT.НПК пример реализации пользовательского DDX рутины и CHKBOOK.КЛИВ для соответствующего примера ExtraDDXCount и ExtraDDX1 записи в секции [Основная информация] CHKBOOK's.КЛИВ файл.

Технические примечания по номеру |nbsp; Технические примечания по категориям

Index