Шаг 202 - Сохранение файлов и CDocument

То что в результате сохранения данных из класса документа вызывается функция Serialize мы с Вами уже знаем. Вот такой код гененирует AppWizard.

///////////////////////////////////////////
// CTestSaveDoc serialization

void CTestSaveDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

Но мы то с Вами хотим больше и больше и еще больше контроля над процессом бритья ой :-) сохранения. Так вот в классе CDocument есть возможность улучшить контроль над сохранением файлов и добавить свои специфические действия. Это делается путем перегрузки виртуальных функций. Как их увидеть ??? Выделите класс потомок от CDocument, после этого нажмите правую кнопку мыши и выберите пункт меню Add Virtual Funсtion. Нас интересуют функции связанные с сохранением документа, а это OnSaveDocument(LPCTSTR lpszPathName) и SaveModified().

202.gif (3681 b)

Перегрузите их для исследования и добавьте следующий код с сообщениями

//////////////////////////////////
// CTestSaveDoc commands

BOOL CTestSaveDoc::SaveModified() 
{
	AfxMessageBox("SaveModified()");
	return CDocument::SaveModified();
}

BOOL CTestSaveDoc::OnSaveDocument(LPCTSTR lpszPathName) 
{
	AfxMessageBox("OnSaveDocument(LPCTSTR lpszPathName)");
	return CDocument::OnSaveDocument(lpszPathName);
}

Для полноты картины создадим пукт меню, который будет сообщать о том, что документ изменен. Мы это делали уже.

void CTestSaveDoc::OnEditModified() 
{
	SetModifiedFlag();
}

Вот. Давайте разбираться когда вызывается какая функция. OnSaveDocument() вызывается всегда когда сохраняется документ, в том числе и пунктами меню Save и Save As... из приложений созданных App Wizard. Так же Вы сами можете вызывать эту функцию во всяких специфических ситуациях, например, при получении сигнала с блока питания о перебоях с питанием :-). Эта функция вызовет Serialize.

virtual BOOL OnSaveDocument( LPCTSTR lpszPathName );

Функция SaveModified() вызывается перед закрытием измененного документа и именно она выводит диалоговое окно о том, что документ был изменен. Ее вам надо переопределять для того, чтобы вставить свои специфические действия. Какие ??? Ну, например, сообщить серверу кто правил документ, записать это в БД чтобы потом найти крайнего и виноватого :-). Общая схема такая.

Сохранение документа
 	OnSaveDocument
		Serialize	
Закрытие документа
	SaveModified
	 	OnSaveDocument
			Serialize	

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.