Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Visiul C++ 6.0 SDI  (Прочитано 5352 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
At
Гость
« : 28-03-2010 14:22 » new

Помогите с Лабой, препод тупа отказывается обьяснять,а сам я не могу дойти...
Мои вопросы:
-Где (В каком классе)описывать (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);
      }
   }}

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 28-03-2010 14:51 » 

At, вопрос я так и не понял... А по сериализации не знаю, что подсказать - не пользуюсь, это неудобно
Записан

At
Гость
« Ответ #2 : 28-03-2010 15:21 » 

Создаю новый MFC AppWizard архитектуры “Document/View”) потом, я обьявляю в CproDoc структуру (1), ошибки нет.
Потом прописываю  "CArray <SRTUCTRECORD, SRTUCTRECORD> m_data;" в class CLb7Doc : public CDocument жму компил и... 12 eror
в output :
d:\l7pro\l7prodoc.h(21) : error C2143: syntax error : missing ';' before '<'
d:\l7pro\l7prodoc.h(21) : error C2501: 'CArray' : missing storage-class or type specifiers
d:\l7pro\l7prodoc.h(21) : error C2059: syntax error : '<'
d:\l7pro\l7prodoc.h(21) : error C2238: unexpected token(s) preceding ';'
l7proDoc.cpp
d:\l7prodoc.h(21) : error C2143: syntax error : missing ';' before '<'
d:\l7pro\l7prodoc.h(21) : error C2501: 'CArray' : missing storage-class or type specifiers
d:\l7pro\l7prodoc.h(21) : error C2059: syntax error : '<'
d:\l7pro\l7prodoc.h(21) : error C2238: unexpected token(s) preceding ';'
l7proView.cpp
d:\l7pro\l7prodoc.h(21) : error C2143: syntax error : missing ';' before '<'
d:\l7pro\l7prodoc.h(21) : error C2501: 'CArray' : missing storage-class or type specifiers
d:\l7pro\l7prodoc.h(21) : error C2059: syntax error : '<'
d:\l7pro\l7prodoc.h(21) : error C2238: unexpected token(s) preceding ';'
Generating Code...
Error executing cl.exe.

l7pro.exe - 12 error(s), 0 warning(s)

вот, вроде всё по методе


« Последнее редактирование: 28-03-2010 15:47 от At » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 28-03-2010 18:12 » 

Структуру нужно объявить:
- или там же, где объявляется массив этих структур, - если нигде (в других классах) она больше не используется
- или в глобальной области видимости (отдельным заголовком) - в противном случае.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines