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 для обрабоки исключений программным путем.