Первое что я сделаю, это немного исправлю функцию в классе навигаторе. Смысл такой, когда в навигатор передается набор записей, он проверяет, есть ли записи вообще. Если нет, то одну он создаст. Обновленный класс навигатора будет в проекте.
void CDaoNavigator::SetRecordset(CDaoRecordset *cRecord) { m_pRecord=cRecord; if (m_pRecord->IsBOF() & m_pRecord->IsEOF()) { m_pRecord->AddNew(); // новая m_pRecord->Update(); // подтвердить m_pRecord->MoveLast(); // на последнею } }
Для того, что бы не добавлять постоянно на диалог кнопки вперед назад лучше создать шаблон диалога. Как это сделать читайте "Шаг 359 - Свои шаблоны для диалога".
Пора создавать класс. Имя у него будет CDaoDialog. В примере объявления я оставлю самое главное.
#include "afxdao.h" #include "DaoNavigator.h" class CDaoDialog : public CDialog { // Construction public: void Last(); void First(); void Prev(); void Next(); void SaveData(); void SetRecorset(CDaoRecordset* m_pSet); CDaoDialog(int IDD,CWnd* pParent = NULL); // standard constructor ...... private: CDaoRecordset* m_pRecordset; CDaoNavigator cNavigator; };
Обратите внимание, что у него уже есть свой класс навигатора. От объявлен в классе диалога. Для того, что бы объяснить навигатору, с чем мы имеем дело есть функция SetRecorset, которая передает набор записей навигатору и запоминает у себя.
void CDaoDialog::SetRecorset(CDaoRecordset *m_pSet) { m_pRecordset=m_pSet; cNavigator.SetRecordset(m_pSet); }
Вот функции навигации и сохранение. Больше их не надо будет кодировать в диалогах.
void CDaoDialog::SaveData() { if (!(m_pRecordset->IsEOF())) { m_pRecordset->Edit(); UpdateData(TRUE); m_pRecordset->Update(); } } void CDaoDialog::Next() { SaveData(); cNavigator.OnButtonNext(); UpdateData(FALSE); } void CDaoDialog::Prev() { SaveData(); cNavigator.OnButtonPrev(); UpdateData(FALSE); } void CDaoDialog::First() { SaveData(); cNavigator.OnButtonFirst(); UpdateData(FALSE); } void CDaoDialog::Last() { SaveData(); cNavigator.OnButtonLast(); UpdateData(FALSE); }
Изменен конструктор. Мы же не знаем, с каким диалогом будет работать этот класс. Вот и сделаем, что в конструкторе можно передать идентификатор диалога.
CDaoDialog::CDaoDialog(int IDD,CWnd* pParent /*=NULL*/) : CDialog(IDD, pParent) { //{{AFX_DATA_INIT(CDaoDialog) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT }
Ну вот и все. Мы опять сняли часть работы по поводу создания диалогов и кодирования. В проекте находится класс CDaoNavigator и CDaoDialog упакованный для использования в Component Gallery как ogx файл.