Шаг 45 - Связанные данные и CDaoCombo

Мы с Вами будет создавать проект вот для такой структуры данных. Здесь в таблице All собраны ссылки на книги и людей.

45_1.gif (2824 b)

Создаем проект с именем 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.

45_2.gif (2168 b)

Инициализация - деинициализация:

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 и в самой базе данных. Ну не намного это медленнее чем средства быстрой разработки. Да создать удобные классы может и долго. Но после их создания не жизнь а сказка. И скорость такая же.

45_3.gif (5737 b)


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