В нашем случае метод GetDocument используется, чтобы записать в переменную m_pSet (входящую в класс CDaterView) укзатель на объект m_daterSet класса CDaterSet, представляющий записи базы данных и входящий в класс документа приложения — класс CDaterDoc.
Затем вызывается метод OnInitialUpdate базового класса CRecordView.
Виртуальный метод DoDataExchange класса CDaterView, первоначально определен в классе CWnd. Он служит для реализации механизмов автоматического обмена данными – Dialog Data Exchange (DDX) и автоматической проверки данных – Dialog Data Validation (DDV). Мы рассматривали этот механизм в 24 томе серии “Библиотека системного программиста”:
//////////////////////////////////////////////////////////////
// Метод DoDataExchange класса CDaterView
void CDaterView::DoDataExchange(CDataExchange* pDX) {
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDaterView)
DDX_FieldText(pDX,IDC_ADDRESS, m_pSet->m_ADDRESS, m_pSet);
DDX_FieldText(pDX,IDC_NAME, m_pSet->m_NAME, m_pSet);
DDX_FieldText(pDX,IDC_PHONE, m_pSet->m_PHONE, m_pSet);
DDX_FieldText(pDX,IDC_PRIORITY, m_pSet->m_PRIORITY,m_pSet);
//}}AFX_DATA_MAP
}
Механизм автоматического обмена данными привязывает к органам управления диалоговой панели переменные или элементы данных класса диалоговой панели. Так как окно просмотра построено на основе диалоговой панели, механизм автоматического обмена данными позволяет нам выполнять обмен данными между органами управления, размещенными в окне просмотра, и элементами класса окна просмотра. Обмен данными работает в обоих направлениях.
Обмен выполняется при помощи функций DDX_FieldText. Могут также использоваться и другие функции, например, DDX_FieldRadio, DDX_FieldCheck, DDX_FieldScroll. Практически каждый тип органов управления диалоговой панели имеет собственную функцию для выполнения процедуры обмена данными.
Всем функциям DDX_FieldText, вызываевым в методе DoDataExchange класса CDaterView передаются четыре параметра.
Первый параметр содержит указатель на объект класса CDataExchange. Этот объект определяет параметры обмена, в том числе направление, в котором надо выполнить обмен данными.
Второй параметр определяет идентификатор органа управления окна просмотра, с которым выполняется обмен данными (окно просмотра доолжно быть представлено классом CRecordView). В нашем случае это идентификаторы полей IDC_ADDRESS, IDC_NAME, IDC_PHONE и IDC_PRIORITY, котоорые принадлежат шаблону диалоговой панели используемому окном просмотра.
Третий параметр содержит ссылку на элемент данных класса CDaterSet, представляющий соответствующее поле базы данных. В нашем методе в качестве этого парамтера фигурируют m_pSet->m_ADDRESS, m_pSet->m_NAME, m_pSet->m_PHONE и m_pSet->m_PRIORITY.
Четвертый параметр содержит указатель на объект класса CDaterSet, с которым выполняется обмен данными. В нашем случае для всех методов в качестве этого параметра используется указатель m_pSet.
Методы AssertValid и Dump класса CDaterView могут использоваться при отладке приложения.
Центральным классом приложений, которые взаимодействуют с базами данных через драйвера ODBC, является класс, наследованный от базового класса CRecordset. В нашем приложении в качестве этого класса выступает класс CDaterSet:
class CDaterSet : public CRecordset {
public:
CDaterSet(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CDaterSet)
// Field/Param Data
//{{AFX_FIELD(CDaterSet, CRecordset)
CString m_NAME;
CString m_ADDRESS;
long m_PRIORITY;
CString m_PHONE;
//}}AFX_FIELD
// Overrides
//{{AFX_VIRTUAL(CDaterSet)
public:
virtual CString GetDefaultConnect;
virtual CString GetDefaultSQL;
virtual void DoFieldExchange(CFieldExchange* pFX);
//}}AFX_VIRTUAL
// Implementation
#ifdef _DEBUG
virtual void AssertValid const;
virtual void Dump(CDumpContext& dc) const;
#endif
};
Класс CDaterSet содержит в себе переменные, представляющие поля записи базы данных. Эти переменные размещаются внутри комментариев вида //{{AFX_FIELD.