C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 57 - Диалоги с большим количеством элементов / Диалоговые окна / Visual C++

Шаг 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 функции.


| |
Автор Каев Артем.
[AD]