Kselax.ru

Hacker Kselax — the best hacker in the world

Menu
  • Блог
  • Контакты
  • wp plugin генератор
  • Русский
    • Русский
    • English
Menu

MFC Сериализация диалогового приложения Serialize

Posted on 22 августа, 201522 августа, 2015 by admin

Здорова!

Сегодня разберем как создать сериализацию для диалогового приложения. И так приступим. Создаем диалоговое приложение, в классе диалога перезагружаем функцию Serialize и добавляем в нее код

Ctest_fl_ruDlg::Serialize »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Ctest_fl_ruDlg::Serialize(CArchive& ar)
{
AfxMessageBox(L"Serialize");
TRACE("Serialize\n");
CDialogEx::Serialize(ar);//вызываем функцию предка
if (ar.IsStoring())
{ // storing code
ar <<m_cLogin<<m_cPass;
}
else
{ // loading code
TRACE("Loading code\n");
ar >>m_cLogin>>m_cPass;
}
}

[warning]Нужно вроде обязательно вызвать функцию для базового класса CDialogEx::Serialize[/warning]

Дальше нужно добавить в определение класса макрос

1
DECLARE_SERIAL(Ctest_fl_ruDlg)

и в файл с определениями функций класса

1
IMPLEMENT_SERIAL(Ctest_fl_ruDlg,CDialogEx,1)

Если мы сейчас скомпилируем приложение то функция сериализации вызываться не будет, нам нужно добавить в конструктор ее вызов и в деструктор класса. Ну я так сделал. Вот код конструктора

Ctest_fl_ruDlg::Ctest_fl_ruDlg »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Ctest_fl_ruDlg::Ctest_fl_ruDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(Ctest_fl_ruDlg::IDD, pParent)
, m_cLogin(_T(""))
, m_cPass(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 
//читаем из файла
// try
{
CFile file;
if(file.Open(L"SAVE.TXT", CFile::modeRead)) // создать файл
{
CArchive ar(&file, CArchive::load); // на основе него обьект архив
Serialize(ar); // записать в архив
ar.Close(); // закрыть архив
file.Close();
}
}
/*catch(CArchiveException* e)
{
if (e->m_cause == CArchiveException::endOfFile)
{
e->Delete();
return;
}
else
{
throw;
}
}*/
}

Ctest_fl_ruDlg::~Ctest_fl_ruDlg »

1
2
3
4
5
6
7
8
9
Ctest_fl_ruDlg::~Ctest_fl_ruDlg()
{
//делаем сериализацию
CFile file(L"SAVE.TXT", CFile::modeWrite | CFile::modeCreate); // создать файл
    CArchive ar(&file, CArchive::store); // на основе него обьект архив
    Serialize(ar); // записать в архив
ar.Close(); // закрыть архив
    file.Close(); // закрыть файл
}

Мы в конструкторе и деструкторе создаем архив и вызываем функцию Serialize

[warning]У меня были проблемы, постоянно вылетало необработаное исключение что типо конец файла не определен, оно перестало вылетать когда я изменил флаг на CFile::modeRead, а был у меня CFile::modeRead|СFile::modeCreate[/warning]

И CArchive создается в деструкторе с флагом CArchive::store для записи, а в конструкторе с CArchive::load для загрузки.

За CArchive можно почитать тут.

На этом все, я такой способ использовал. Кстати в коде выше вы можете увидеть как обрабатываются исключения CArchiveException* e, они закомментированы, да я ниже приведу код блока

Показать »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try
{
CFile file;
if(file.Open(L"SAVE.TXT", CFile::modeRead)) // создать файл
{
CArchive ar(&file, CArchive::load); // на основе него обьект архив
Serialize(ar); // записать в архив
ar.Close(); // закрыть архив
file.Close();
}
}
catch(CArchiveException* e)
{
        //проверяем тип сообщения
if (e->m_cause == CArchiveException::endOfFile)
{
e->Delete();
return;
}
else//идет обработка сообщений дальше
{
throw;
}
}

Таким способом вылавливаются исключения. 🙂

 

Добавить комментарий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Рубрики

  • C++ (293)
  • JavaScript (1)
  • linux (1)
  • MFC (39)
  • node.js (2)
  • React (3)
  • vBulletin (5)
  • Visual Studio (9)
  • wordpress (18)
  • Разное (29)

Метки

Ajax bootstrap CentOS CLI expressjs FormData GDlib google Invisible reCAPTCHA JWT media MFC php react-router-dom redux repository wordpress RTTI STL vBulletin vector Visual Studio WINAPI wordpress wp-plugins XMLHttpRequest Двоичное дерево Задачи С++ Игры С++ Исключения С++ О-большое Операторы_С++ Перегрузка операторов С++ Поиск С++ Потоки Проектирование_С++ С++ Типы_С++ Типы С++ Шаблоны С++ библиотеки локализация макросы С++ сортировка С++

Свежие комментарии

  • RA3PKJ к записи visual C++, создание диалоговых окон.
  • JasonReant к записи Создание и использование статических библиотек .lib в visual studio.
  • MyWin2020 к записи Программка для заполнения форума на vBulletin 3.8.7
  • ScottJip к записи Создание и использование статических библиотек .lib в visual studio.
  • ArnoldKig к записи Создание и использование статических библиотек .lib в visual studio.
©2021 Kselax.ru Theme by ThemeGiant