Заметили, что в прошлом шаге нам приходилось каждый раз обновлять записи при перемещении. Обновлять те записи, которые не привязаны к элементам управления через DDX. Это немного напрягает. Выход опять в использовании виртуальной функции. Мы ее создадим и назовем OnUpdateSet. Эта функция будет вызываться каждый раз после вызова DDX. Ее описание:
class CDaoDialog : public CDialog { // Construction public: virtual void OnUpdateSet(); // код для обновления не связанных в диалоге записей // вызывается при перемещении virtual void OnSave(); // код для сохранения не связанных в диалоге записей // вызывается при сохранении void Last(); ...... };
Пустая реализация:
void CDaoDialog::OnUpdateSet() { }
Вызов при каждом перемещении.
void CDaoDialog::Next() { SaveData(); cNavigator.OnButtonNext(); UpdateData(FALSE); OnUpdateSet(); } void CDaoDialog::Prev() { SaveData(); cNavigator.OnButtonPrev(); UpdateData(FALSE); OnUpdateSet(); } void CDaoDialog::First() { SaveData(); cNavigator.OnButtonFirst(); UpdateData(FALSE); OnUpdateSet(); } void CDaoDialog::Last() { SaveData(); cNavigator.OnButtonLast(); UpdateData(FALSE); OnUpdateSet(); }
А вот теперь можно изменить прошлый проект. Реализовать ее.
void CAllDialog::OnUpdateSet() { m_Book.SetRecord(m_pSet->m_ID_BOOK); m_Piple.SetRecord(m_pSet->m_ID_PIPLE); }
И теперь при каждом перемещении она будет вызываться. Так, что всякие там Next, Prev нас не волнуют больше. Ну, и теперь ее же можно вызывать в OnInitDialog для начальной настройки.
BOOL CAllDialog::OnInitDialog() { ...... OnUpdateSet(); // обновить Combo return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
Еще меньше кода, еще проще и надежнее программировать. В проекте находится класс CDaoDialog упакованный для использования в Component Gallery, как ogx файл.