Шаг 57 - Диалоги с большим количеством элементов

Еще одна задача, когда на диалоге может быть довольно большое количество элементов. Как автоматизировать подобные действия мы смотрели, можно просто использовать DDX, а потом извлекать из диалогов большое количество переменных, можно элементы поместить в массив, а можно передать указатель на массив. Вот этот способ мы и рассмотрим. Итак, в документе есть массив.

class CTestLargeElementDoc : public CDocument
{
protected:	// create from serialization only
	CTestLargeElementDoc();
	DECLARE_DYNCREATE(CTestLargeElementDoc)

// Attributes
public:
	CStringArray cs;
// Operations
public:
......
};

И функция, которая вызываем диалог. Где производится инициализация массива разницы нет в данном случае. Итак, функция, которая запускает диалог:

void CTestLargeElementDoc::OnTestTest() 
{
	CTestDialog ct;
	cs.RemoveAll();
	cs.Add("1 - Test| ");
	cs.Add("2 - Test| ");
	cs.Add("3 - Test| ");
	cs.Add("4 - Test| ");
	cs.Add("5 - Test| ");
	cs.Add("6 - Test| ");
	cs.Add("7 - Test| ");
	cs.Add("8 - Test| ");
	ct.cs = &cs;
	ct.DoModal();
	AfxMessageBox(cs.GetAt(0)+cs.GetAt(1)+cs.GetAt(2)+cs.GetAt(3)+cs.GetAt(4));
}

Я провел инициализацию массива прямо в функции. И передал в класс диалога указатель на массив, предварительно описав его в классе диалога.

class CTestDialog : public CDialog
{
// Construction
public:
	CTestDialog(CWnd* pParent = NULL);   // standard constructor
	CStringArray *cs;
.......
};

Организовывать связь мы будет на основе DDX функции. Опишем ее.

class CTestDialog : public CDialog
{
// Construction
public:
	CTestDialog(CWnd* pParent = NULL);   // standard constructor
	CStringArray *cs;
	void AFXAPI CTestDialog::DDX_Array(CDataExchange* pDx,int ID );
........
};

Ну и реализация:

void AFXAPI CTestDialog::DDX_Array(CDataExchange* pDx,int ID  )
{
	CString csDate;
	if (pDx->m_bSaveAndValidate) 
	{		
	    CEdit *ce=(CEdit*)GetDlgItem(ID);
	    ce->GetWindowText(csDate); 
	    cs->SetAt((ID-IDC_EDIT1),csDate);
	} else {	
		CEdit *ce=(CEdit*)GetDlgItem(ID);	
		csDate=cs->GetAt(ID-IDC_EDIT1);
		ce->SetWindowText(csDate); 
	}
}

Тут ничего нет хитрого. Главное чтобы элементы управления были по порядку. Применим ее:

void CTestDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestDialog)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP

	DDX_Array(pDX,IDC_EDIT1);
	DDX_Array(pDX,IDC_EDIT2);
	DDX_Array(pDX,IDC_EDIT3);
	DDX_Array(pDX,IDC_EDIT4);
	DDX_Array(pDX,IDC_EDIT5);
	DDX_Array(pDX,IDC_EDIT6);
	DDX_Array(pDX,IDC_EDIT7);
	DDX_Array(pDX,IDC_EDIT8);
}

Ну вот и все. Запускаем:

57_1.gif (5126 b)

Все передано. Поменяем несколько элементов и нажмем ОК.

57_2.gif (2832 b)

А вот и результат.

57_3.gif (5234 b)

Вся идея сводится к передаче указателя на массив и организации DDX функции.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 01.07.2002