Мы с Вами будет создавать проект вот для такой структуры данных. Здесь в таблице All собраны ссылки на книги и людей.
Создаем проект с именем TestDao3 на базе диалогового окна. Кнопку на окно. Добавляем панель диалога IDD_DIALOG_DAO, для нем создаем класс CAllDialog. Переделываем его в наследника от CDaoDialog. Ну и сразу вызов его при нажатии на кнопку.
void CTestDao3Dlg::OnButton1() { CAllDialog cd; cd.DoModal(); }
Создаем три набора записей для трех таблиц.
CAllSet CBookSet CPipleSet
Подключаем их все для нашего класса диалога.
/////////////////////// // CAllDialog dialog #include "AllSet.h" #include "BookSet.h" #include "PipleSet.h" class CAllDialog : public CDaoDialog ......
Для диалога делам набор записей CAllSet как Foreign Class. А остальные классы набора записей делаем, как обычные члены класса.
class CAllDialog : public CDaoDialog { // Construction public: CAllDialog(CWnd* pParent = NULL); // standard constructor CBookSet cbookset; CPipleSet cpipleset; // Dialog Data ...... }
Помещаем на диалог два ComboBox, но связываем их с нашим классом CDaoCombo.
Инициализация - деинициализация:
CAllDialog::CAllDialog(CWnd* pParent /*=NULL*/) : CDaoDialog(CAllDialog::IDD, pParent) { //{{AFX_DATA_INIT(CAllDialog) m_pSet = NULL; //}}AFX_DATA_INIT m_pSet = new CAllSet(); m_pSet->Open(); SetRecordset(m_pSet); m_Book.SetRecordset(&cbookset); m_Piple.SetRecordset(&cpipleset); } void CAllDialog::OnDestroy() { CDialog::OnDestroy(); delete m_pSet; }
Напишем функцию которая устанавливает поле в CDaoCombo.
void CAllDialog::UpdateCombo() { m_Book.SetRecord(m_pSet->m_ID_BOOK); m_Piple.SetRecord(m_pSet->m_ID_PIPLE); }
Перегрузим OnInitDialog() для настройки наборов записей.
BOOL CAllDialog::OnInitDialog() { CDialog::OnInitDialog(); // для правильного отображения первой записи m_Book.SetRecordset(&cbookset); m_Book.SetIndex("ID_BOOK"); m_Book.SetFields("NAME_BOOK"); m_Book.GetRecord(); m_Piple.SetRecordset(&cpipleset); m_Piple.SetFields("NAME_PIPLE"); m_Piple.SetIndex("ID_PIPLE"); m_Piple.GetRecord(); UpdateCombo(); // обновить Combo return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
А вот теперь и воспользуемся нашей вирутальной функцией для того, чтобы сохранять новый выбор в Combo.
void CAllDialog::OnSave() { m_pSet->m_ID_BOOK=m_Book.GetIndex(); m_pSet->m_ID_PIPLE =m_Piple.GetIndex(); }
Осталось написать только функции перемещения. Одну продемонстрирую остальные догадаетесь.
void CAllDialog::OnButtonFirst() { First(); UpdateCombo(); }
Вот и все готово. Теперь спокойно можно перемещаться по записям и Combo будет отображать поле связанное с записью. Измените выбор поля в Combo измениться и в наборе записей CAllSet и в самой базе данных. Ну не намного это медленнее чем средства быстрой разработки. Да создать удобные классы может и долго. Но после их создания не жизнь а сказка. И скорость такая же.