Шаг 37 - Набор записей и ComboBoх

Идея этого шага вот в чем. В Access таблица может формироваться из других таблиц.

37_1.gif (2217 b)

Когда мастер форм Access сформирует форму на основе таблицы она будет вот такая.

37_2.gif (4259 b)

Вот мы и будет прибывать сделать подобное в MFC. Пока просто на диалоговом окне попробуем. создаем приложение на базе диалогового и именем DaoTest. На диалоговое окно поместим ComboBox. Создадим свой класс CDaoCombo как наследник от CComboBox.

class CDaoCombo : public CComboBox
{
// Construction
public:
	CDaoCombo();
// Attributes
public:
// Operations
public:
// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CDaoCombo)
	//}}AFX_VIRTUAL
// Implementation
public:
	void SetFields(CString csField);	// установить имя поля
	void GetRecord();			// получить записи
	void SetRecordset(CDaoRecordset *cRecord);	// установить набор записей
	virtual ~CDaoCombo();
	// Generated message map functions
protected:
	//{{AFX_MSG(CDaoCombo)
		// NOTE - the ClassWizard will add and remove member functions here.
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private:
	CString csFieldName;		// имя поля
	CDaoRecordset * m_pRecord;		// указатель на набор записей
};

Реализация функций.

////////////////////
// CDaoCombo
CDaoCombo::CDaoCombo()
{
}
CDaoCombo::~CDaoCombo()
{
}
BEGIN_MESSAGE_MAP(CDaoCombo, CComboBox)
	//{{AFX_MSG_MAP(CDaoCombo)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//////////////////////////////
// CDaoCombo message handlers
void CDaoCombo::SetRecordset(CDaoRecordset *cRecord)
{
	m_pRecord = cRecord;
}

void CDaoCombo::GetRecord()
{
	m_pRecord->Open();			// открыть
	m_pRecord->MoveFirst();		// в начало
	// Пока есть записи
	while (! m_pRecord->IsEOF()) 
	{
		COleVariant CValue;    
		m_pRecord->GetFieldValue(csFieldName,CValue); // получить запись
		CString s=CValue.pbVal;
		AddString(s);
		m_pRecord->MoveNext();	// на следующую
	}
	m_pRecord->Close();		// закрыть 	
}

void CDaoCombo::SetFields(CString csField)
{
	csFieldName = csField;
}

Использовать его в проекте проще простого. Для начала надо связать класс с элементом управления.

37_3.gif (1727 b)

Создать набор записей.

37_4.gif (4411 b)

Ну и теперь нужно создать объект набора записей вовремя, указать набор записей, поле и удалить вовремя.

BOOL CDaoTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	m_DaoCombo.SetRecordset(ciSet); 
	m_DaoCombo.SetFields("Name");
	m_DaoCombo.GetRecord(); 
	// Add "About..." menu item to system menu.
	//......
}

void CDaoTestDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	delete ciSet;	
}

Вот и все, результат будет вот таким.

37_5.gif (3540 b)

В проекте находится класс CDaoCombo упaкованный для использования в Component Gallery как ogx файл.


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