Hi! Классный сайт!!! По мере изучения материала у меня накопилась масса вопросов. Если не очень трудно и вопросы покажутся не детскими, то ответьте пожалуйста. 1. Ситуация: в диалоговом окне несколько Edit`ов. При инициализации диалога в них нужно поместить цифры. Пользователь может сам назначить какие цифры он хочет там видеть. Я сохраняю эти цифры в файле (текстовом). Где и как еще можно их запомнить. Остальные вопросы потом, чтобы сильно не загружать. Заранее благодарен, Борис (bor1999@mail.ru)
Хранить можно в самом простом варианте вот где.
Давайте рассмотрим каждый вариант. Начнем с текстового файла. Создавайте приложение на базе диалогового окна с именем 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 для обрабоки исключений программным путем.