Еще одна задача, когда на диалоге может быть довольно большое количество элементов. Как автоматизировать подобные действия мы смотрели, можно просто использовать 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); }
Ну вот и все. Запускаем:
Все передано. Поменяем несколько элементов и нажмем ОК.
А вот и результат.
Вся идея сводится к передаче указателя на массив и организации DDX функции.