At
Гость
|
|
« : 28-03-2010 14:22 » |
|
Помогите с Лабой, препод тупа отказывается обьяснять,а сам я не могу дойти... Мои вопросы: -Где (В каком классе)описывать (1)? -Где описывать(2)?
Вот вырезка из методички:
Данными, с которыми работает приложение, будут фамилия, имя, отчество абитуриента и оценки по 3-м дисциплинам – математике, физике и русскому языку. Описать эти данные можно следующей структурой:
typedef struct { CString name1; CString name2; CString name3; //------------(1) int mark1; int mark2; int mark3; } SRTUCTRECORD;
В классе документа эти данные опишем в виде массива, используя шаблон для класса CArray:
class CLb7Doc : public CDocument { protected: // create from serialization only CLb7Doc(); DECLARE_DYNCREATE(CLb7Doc) …// Attributes public: CArray <SRTUCTRECORD, SRTUCTRECORD> m_data;
Для занесения и извлечения данных из массива используются методы класса CArray , поэтому здесь не будем использовать собственные методы, тем более, что член класса m_data является открытым. Для сохранения и чтения из файла данных в документ, а также для создания документа MFC AppWizard реализованы команды ID_FILE_OPEN и ID_FILE_SAVE, ID_FILE_SAVE_AS и ID_FILE_NEW
Для выполнения этих команд библиотекой MFC вызываются соответствующие методы, реализация которых скрыта от программиста. Только два метода могут быть изменены: - OnNewDocument() – здесь можно произвести инициализацию данных документа для MDI- приложения или очистку данных для SDI-приложения, т.е. уничтожение старых данных. Например, для нашего случая это может быть следующий код
BOOL CLab7Doc::OnNewDocument() { // Всю стандартную обработку по созданию документа возлагаем // на библиотеку MFC if (!CDocument::OnNewDocument()) return FALSE; //После успешного создания проводим очистку массива сданными m_data.RemoveAll(); return TRUE; } Метод Serialize() – здесь выполняется, собственно, сохранение данных в файл или чтение из файла данных в структуры документа. Этот метод вызывается при выполнении команд Open, Save или Save As после выбора блоком диалога имени файла. Метод Serialize называется сериализацией – преобразование в последовательную форму и наоборот, позволяет сохранять и восстанавливать объекты классов, созданных на базе класса CObject. В нашем случае, нужно дополнить этот метод кодом по сохранению и восстановлению данных из файлового бинарного потока (данные записываются в файл без преобразования), который называют архивом. В качестве параметра в этот метод передается указатель на созданный экземпляр класса CArchiv , с которым ассоциирован объект класса CFile. Имя файла подставляется после выполнения кода диалогового окна по выбору имени файла. В классе CArchiv реализованы несколько вариантов перегружаемых операторов >> и << , которые, собственно, загружают объекты (или простые типы) из архива или сохраняют их в архиве. Они имеют следующие однотипные формы:
fried CArchive& operator << (CArchive &ar, CObject *&pOb) fried CArchive& operator >> (CArchive &ar, CObject *&pOb) или для простых типов //------------------------(2) fried CArchive& operator << (Data_Type& data) fried CArchive& operator >> (Data_Type& data),
где через Data_Type обозначены примитивные типы данных BYTE, WORD, int, DWORD, float double.
Метод CArchive::IsStoring возвращает направление потока void CLb7Doc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here // Работа с потоком выполняется с простыми типами ar << m_data.GetSize(); for (int i=0; i < m_data.GetSize(); i++) { ar << m_data.GetAt(i).name1; ar << m_data.GetAt(i).name2; ar << m_data.GetAt(i).name3; ar << m_data.GetAt(i).mark1; ar << m_data.GetAt(i).mark2; ar << m_data.GetAt(i).mark3; } } else { // TODO: add loading code here int size; SRTUCTRECORD rec; ar >> size; m_data.SetSize(size, 1); for (int i=0; i < size; i++) { ar >> rec.name1; ar >> rec.name2; ar >> rec.name3; ar >> rec.mark1; ar >> rec.mark2; ar >> rec.mark3; m_data.SetAt(i,rec); } }}
|