Шаг 37 - Пользовательская функция DDX

Создание проекта

Для работы с этой темой Вам понадобится проект созданный в шаге 34. В него будем вносить изменения.

Создаем код

Создадим нашу DDX функцию.

void AFXAPI DDX_MyText(CDataExchange* pDx,int ID,CString& Date )
{
if (pDx->m_bSaveAndValidate) // Что происходит. Чтение или запись ?
{
DDX_Text(pDx,ID,Date);
Date= Date+" Save DDX";
}
else
{
Date=Date+ " Read DDX";
DDX_Text(pDx,ID,Date);
}
}

Изменения в функции обмена.

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); // функция папы
DDX_MyText(pDX, IDC_EDIT1, m_edit); // наш обмен
}

Вот так вмешивается наша DDX функция.

37_1.gif (1729 b)

А вот строка в результате отладки.

Loaded 'C:\WINDOWS\SYSTEM\INDICDLL.DLL', no matching symbolic information found.
Read DDX Save DDXThe thread 0xFFF5086F has exited with code 0 (0x0).
The program 'D:\VС\step37\Debug\step37.exe' has exited with code 0 (0x0).

Описание

Итак, мы с Вами создали свою функцию обмена. Зачем это нужно? Пригодится точно. Например, для перевода строки в число и назад, перевода строки или добавления изменения. Вообще как фантазия сработает. Мы объявили функция как AFXAPI - это модификатор, который устанавливает вызов функции в соответствии с требованиями MFC. Объявить её можно в отдельном файле, и тем самым локализовать модификации типов в отдельном файле. В функцию мы передаем несколько параметров. Первое это объект, который поддерживает обмен данными. Дальше идентификатор элемента управления и тип передаваемых данных. CDataExchange знает направление, в котором идет обмен, своё понимание текущей ситуации он хранит в переменной pDx->m_bSaveAndValidate, которую мы и анализируем. При сохранении мы вызываем функцию DDX_Text для получения данных и потом модифицируем, а при чтении наоборот - сначала изменяем, а потом вызываем DDX_Text. Нам осталось только описать её в функции CTestDlg::DoDataExchange, что мы и сделали. Запускайте.

Шпаргалка

Создайте свою функцию DDX.

void AFXAPI DDX_MyText(CDataExchange* pDx,int ID,CString& Date )
{
if (pDx->m_bSaveAndValidate) // Что происходит. Чтение или запись ?
{
.............
}
else
{
........
}
}

Вызывайте её для обмена.

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); // функция папы
DDX_MyText(pDX, IDC_EDIT1, m_edit); // наш обмен
}

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 27.09.99 (обновлено 6.07.2001)