Оголошення класу документа

Лекція № 4

Тема: Клас CDocument

План

1. Клас CDocument

2. Оголошення класу документа

3. Функції-члени класу CDocument

 

Клас CDocument

Клас CDocument забезпечує стандартну поведінка об'єктів документа додатку MFC. Клас CDocument дозволяє створювати нові документи, зберігати дані документа на диску (сериализация), забезпечувати стандартну взаємодію між об'єктом документа і вікном уявлення, а також виконувати ряд Інших маніпуляцій. Серед класів MFC існує також ряд інших класів, похідних від CDocument, які реалізують спеціалізовані функціональні можливості деяких типів додатків. Наприклад, такі класи MFC, як CRecordset і CDAORecordset, дозволяють істотно спростити створення уявлень в додатках баз даних. Відносини між документом і уявленнями проілюстровані на мал.

 

Мал. Відносини "один до багатьом" між

документом і його уявленнями

 

Оголошення класу документа

Якщо для створення додатку використовується майстер AppWizard, то, часто, про оголошення базового класу документа можна не турбуватися — майстер AppWizard зробить це сам. Проте, розуміння поведінки класу CDocument може стати в нагоді, оскільки складнішим застосуванням може знадобитися декілька різних класів документа, похідних від базового класу CDocument. Крім того, розуміючи поведінку класу CDocument, легко модифікувати заготівку додатку, створену за допомогою майстра AppWizard.

Незалежно від того, чи створюється додаток однодокументного інтерфейсу або багатодокументного, майстер AppWizard створює лише один клас документа, похідний від базового класу MFC CDocument.

При створенні простого додатку MFC модифікації класу документа, наданого майстром AppWizard, часто вельми незначні. Іноді досить додати в клас декілька змінних-членів і функцій, що забезпечують доступ до цих змінних з інших частин програми.

Наприклад, об'єкт документа для простого додатку зв'язку (такого як емулятор терміналу) міг би містити змінні-члени для зберігання параметрів модему. В цьому випадку в змінних-членах могла б зберігатися така інформація, як номер телефону, швидкість передачі, парність, кількість битий в кожному сегменті передачі і так далі Таким чином, в класі документа, похідному від класу CDocument, параметри установки зв'язку можна легко представити у вигляді набору простих змінних-членів, як показано в наступному фрагменті коди:

 

class CSimpleTermDoc : public CDocument

{

protected:

CSimpleTermDoc();

DECLAREJ3YNCREATE(CSimpleTermDoc)

public:

CString m_sPhoneNum;

DWORD m_dwTransSpeed;

WORD m_nTransParity;

WORD m_nTransBits;

DWORD m_dwConnectTime;

 

Оголосивши змінні-члени, необхідно упевнитися, що програма ініціалізувала змінні деякими початковими значеннями. Для цього використовується функція-член OnNewDocument класу CSimpleTermDoc. Крім того, у функцію Serialize необхідно додати додатковий код, для правильного збереження значень змінних. Код функцій-членів OnNewDocument і Serialize такого застосування міг би виглядати так, як приведено нижче. У цьому фрагменті коди змінні-члени ініціалізувалися.

 

// Стандартний код для функцій-членів

// OnNewDocument () і Serialize()

BOOL CSimpleTerraDoc::OnNewDocument

{

if {!CDocument::OnNewDocument()) return FALSE;

m_sPhoneNum = _T ("555-1212");

m_dwTransSpeed = 28800;

m_nTransParity = 0;

m_nTransBits = 8;

m_dwConnectTime = 0;

return TRUE;

}

 

Як можна відмітити в наступному фрагменті коди, в процесі збереження (сериа-лизации— serialization) використовується клас CArchive. Цей клас дозволяє легко записувати на диск і прочитувати з нього складні типи даних, використовуючи операторів C++ << (extraction — витягання) і >> (insertion — вставка). При виклику код функції CArchive: :IsStoring спочатку перевіряє, чи є поточний процес операцією читання або запису. На підставі повертаного значення (true при записі, false при читанні) ухвалюється рішення про застосування операторів витягання або збереження даних.

 

void CSimpleTermDoc::Serialize(CArchive &ar)

{

if (ar.IsStoring())

{

ar << m_sPhoneNum;

ar « m_dwTransSpeed;

ar « m__nTransParity;

ar << m_nTransBits;

ar << m_dwConnectTime;

} else {

ar » m_sPhoneNum;

ar » m_dwTransSpeed;

ar » m_nTransParity;

ar » m_nTransBits;

ar >> m dwConnectTime;

}

}

 

У простих застосуваннях, подібних цьому, для створення повнофункціонального класу документа, окрім забезпечення ініціалізації і збереження призначених для користувача змінних-членів, можна не робити нічого.