Шаг 163 - Где хранить данные ???

Hi! Классный сайт!!!
По мере изучения материала у меня накопилась масса вопросов.
Если не очень трудно и вопросы покажутся не детскими, то ответьте пожалуйста.
1. Ситуация: в диалоговом окне несколько Edit`ов. При инициализации диалога
в них нужно поместить цифры. Пользователь может сам назначить какие цифры 
он хочет там видеть. Я сохраняю эти цифры в файле (текстовом). Где и как 
еще можно их запомнить.	Остальные вопросы потом, чтобы сильно не загружать.

Заранее благодарен, Борис (bor1999@mail.ru)

Хранить можно в самом простом варианте вот где.

  1. Текстовый файл
  2. INI файл

Давайте рассмотрим каждый вариант. Начнем с текстового файла. Создавайте приложение на базе диалогового окна с именем TestWrite и помещайте на него два элемента редактирования CEdit. Дайте им имена и свяжите с переменной.

class CTestWriteDlg : public CDialog
{
.......
	CString	m_M1;
	CString	m_M2;
	//}}AFX_DATA
........
};

Теперь нужно решить где инициализировать и сохранять данные. Можно поступить так. Самое удобно производить инициализацию в классе OnInitDialog(), а вот запись можно по разному. Например, перегрузить нажатие на кнопку OK. Я решил по другому, что введенные данные будут сохраняться не в зависимости от нажатия на кнопки, а в момент разрушения окна и поэтому перегрузил OnDestroy(). Ну, а вообще это Вам решать.

Итак, давайте посмотрим какой код нужно создать в случае данных в текстовом формате. Кстати хранение в текстовом файле и в бинарном очень схожи по принципу. Так как все данные будут у нас строковые, то с бинарным форматом и возиться не будем. Код я поместил в функции ReadDataFile и WriteDataFile. Так вот когда будем смотреть следующую возможность, то вызовы функций этих я закоментирую, но в проекте они будут все.

Вот текст этих двух функций

void CTestWriteDlg::ReadDataFile()
{
	try
	{
		CStdioFile cf;
		cf.Open("test.txt", CFile::modeRead);
		cf.ReadString(m_M1);
		cf.ReadString(m_M2);
		cf.Close(); 
	}

	catch(...)
	{
		AfxMessageBox("Error Read ");
	}

	UpdateData(FALSE);
}

void CTestWriteDlg::WriteDataFile()
{
	UpdateData(FALSE);
	
	try
	{
		CStdioFile cf;
		cf.Open("test.txt",CFile::modeCreate | CFile::modeWrite );
		cf.WriteString(m_M1+"\n");
		cf.WriteString(m_M2);
		cf.Close(); 
	}

	catch(...)
	{
		AfxMessageBox("Error Write");
	}
}

Хитрого нет ничего. Вот только UpdateData(FALSE) вызывается для того, чтобы заставить силовым методом обменяться данными.

С использованием INI файлов проще. Вот код.

void CTestWriteDlg::ReadIniData()
{
	m_M1=AfxGetApp()->GetProfileString("DATA","M1");
	m_M2=AfxGetApp()->GetProfileString("DATA","M2"); 
	UpdateData(FALSE);
}

void CTestWriteDlg::WriteIniData()
{
	UpdateData(FALSE);
	AfxGetApp()->WriteProfileString("DATA","M1",m_M1);
	AfxGetApp()->WriteProfileString("DATA","M2",m_M2);
}

А еще можно в реестре и в базе данных. Но это сложнее. Мне кажется два эти варинта наиболее простые. Если данные сложные, то их можно организовать в структуры и писать на диск сразу структуру. Когда будете тестировать работу с файлом незабудьте переключиться в режим Release для обрабоки исключений программным путем.


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