Скачиваний:
38
Добавлен:
01.04.2014
Размер:
158.92 Кб
Скачать

Лабораторная работа №7. Sdi – приложение. Работа с данными в архитектуре «Документ/представление» («Document/view»)

Задание

Создать SDI-приложение для формирования и просмотра данных из файла в соответствии с индивидуальным заданием.

Требования для создаваемого приложения.

1. Управление заданием имени файла, его открытием или созданием и т.п. выполняется через команды меню или кнопки панели инструментов.

2. Просмотр загруженных данных из файла, а также формируемых в приложении, данных выполняется в диалоговом окне с использованием элемента управления Listbox. В этом списке отображается либо все данные, либо данные, формируемые в соответствии с функцией, определенной в индивидуальном задании. Порядок вывода управляется с помощью кнопок. Исходно выводится полный список.

3. Формирование данных в приложении осуществляется в другом диалоговом окне с использованием элементов управления Combobox и Edit.

4. До задания имени файла элементы меню и соответствующие кнопки управления открытием и сохранением данных в файл должны быть не доступны.

5. После задания имени файла все команды работы с файлом должны иметь место только для этого файла.

6. Имя заданного файла должно отображаться в строке статуса.

Индивидуальные задание

14. Продовольственные товары (наименование, отдел магазина, дата выпуска, срок хранения, последний срок реализации – функция Run (), вес).

Решение:

// MDIDoc.cpp : implementation of the CMDIDoc class

//

#include "stdafx.h"

#include "MDI.h"

#include "MDIDoc.h"

#include "MyDialog.h"

#include "MyDialog2.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CMDIDoc

IMPLEMENT_DYNCREATE(CMDIDoc, CDocument)

BEGIN_MESSAGE_MAP(CMDIDoc, CDocument)

//{{AFX_MSG_MAP(CMDIDoc)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CMDIDoc construction/destruction

CMDIDoc::CMDIDoc()

{

// TODO: add one-time construction code here

}

CMDIDoc::~CMDIDoc()

{

}

CMDIDoc* CMDIDoc::GetDoc()

{

CMDIChildWnd * pChild =

((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();

if ( !pChild )

return NULL;

CDocument * pDoc = pChild->GetActiveDocument();

if ( !pDoc )

return NULL;

// Ошибка, если документ неправильного типа

if ( ! pDoc->IsKindOf( RUNTIME_CLASS(CMDIDoc) ) )

return NULL;

return (CMDIDoc *) pDoc;

}

BOOL CMDIDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

m_data.SetSize(1, 1);

return TRUE;

}

/////////////////////////////////////////////////////////////////////////////

// CMDIDoc serialization

void CMDIDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

ar << m_data.GetSize();

for (int i=0; i < m_data.GetSize(); i++)

{

ar << m_data.GetAt(i).naim;

ar << m_data.GetAt(i).otd;

ar << m_data.GetAt(i).dt4;

ar << m_data.GetAt(i).dtm;

ar << m_data.GetAt(i).dtg;

ar << m_data.GetAt(i).srd;

ar << m_data.GetAt(i).srm;

ar << m_data.GetAt(i).srg;

}

}

else

{

int size;

STRUCTRECORD rec;

ar >> size;

m_data.SetSize(size, 1);

for (int i=0; i < size; i++)

{

ar >> rec.naim;

ar >> rec.otd;

ar >> rec.dt4;

ar >> rec.dtm;

ar >> rec.dtg;

ar >> rec.srd;

ar >> rec.srm;

ar >> rec.srg;

m_data.SetAt(i,rec);

}

}

}

/////////////////////////////////////////////////////////////////////////////

// CMDIDoc diagnostics

#ifdef _DEBUG

void CMDIDoc::AssertValid() const

{

CDocument::AssertValid();

}

void CMDIDoc::Dump(CDumpContext& dc) const

{

CDocument::Dump(dc);

}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////

// CMDIDoc commands

// MDIView.cpp : implementation of the CMDIView class

//

#include "stdafx.h"

#include "MDI.h"

#include "MDIDoc.h"

#include "MDIView.h"

#include "MyDialog.h"

#include "MyDialog2.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CMDIView

IMPLEMENT_DYNCREATE(CMDIView, CView)

BEGIN_MESSAGE_MAP(CMDIView, CView)

//{{AFX_MSG_MAP(CMDIView)

ON_COMMAND(ID_MYBUTTON, OnMybutton)

ON_COMMAND(ID_MYBUTTON2, OnMybutton2)

//}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CMDIView construction/destruction

CMDIView::CMDIView()

{

// TODO: add construction code here

}

CMDIView::~CMDIView()

{

}

BOOL CMDIView::PreCreateWindow(CREATESTRUCT& cs)

{

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);

}

/////////////////////////////////////////////////////////////////////////////

// CMDIView drawing

void CMDIView::OnDraw(CDC* pDC)

{

CMDIDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc); // TODO: add draw code for native data here

CString s;

int i = pDoc->m_data.GetSize();

pDC->TextOut(10, 0, s);

for (int j=0; j<(i-1); j++) {

s.Format("%2d. %10s %10s %2d - %2d - %2d %2d - %2d - %2d ",(j+1),

pDoc->m_data.GetAt(j).naim,

pDoc->m_data.GetAt(j).otd,

pDoc->m_data.GetAt(j).dt4,

pDoc->m_data.GetAt(j).dtm,

pDoc->m_data.GetAt(j).dtg,

pDoc->m_data.GetAt(j).srd,

pDoc->m_data.GetAt(j).srm,

pDoc->m_data.GetAt(j).srg);

pDC->TextOut(10, (20+j*20), s);

}

}

/////////////////////////////////////////////////////////////////////////////

// CMDIView printing

BOOL CMDIView::OnPreparePrinting(CPrintInfo* pInfo)

{

// default preparation

return DoPreparePrinting(pInfo);

}

void CMDIView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: add extra initialization before printing

}

void CMDIView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: add cleanup after printing

}

/////////////////////////////////////////////////////////////////////////////

// CMDIView diagnostics

#ifdef _DEBUG

void CMDIView::AssertValid() const

{

CView::AssertValid();

}

void CMDIView::Dump(CDumpContext& dc) const

{

CView::Dump(dc);

}

CMDIDoc* CMDIView::GetDocument() // non-debug version is inline

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMDIDoc)));

return (CMDIDoc*)m_pDocument;

}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////

// CMDIView message handlers

CMDIView* CMDIView::GetView()

{

CMDIChildWnd * pChild =

((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();

if ( !pChild )

return NULL;

CView * pView = pChild->GetActiveView();

if ( !pView )

return NULL;

// Ошибка, если Вид неправильного типа

if ( ! pView->IsKindOf( RUNTIME_CLASS(CMDIView) ) )

return NULL;

return (CMDIView *) pView;

}

void CMDIView::OnInitialUpdate()

{

CView::OnInitialUpdate();

CMDIDoc* pDoc = GetDocument();

}

void CMDIView::OnMybutton()

{

CMDIDoc* pDoc = GetDocument();

CMyDialog MyD;

MyD.DoModal(); // создаём новый диалог

STRUCTRECORD rec;

if (MyD.m_naim!="")

{

rec.naim = MyD.m_naim;

rec.otd = MyD.m_otd;

rec.dt4 = MyD.m_dt4;

rec.dtm = MyD.m_dtm;

rec.dtg = MyD.m_dtg;

rec.srd = MyD.m_srd;

rec.srm = MyD.m_srm;

rec.srg = MyD.m_srg;

int i = pDoc->m_data.GetSize();

pDoc->m_data.SetAt((i-1),rec); // получаем новые значения

pDoc->m_data.SetSize((i+1),1); // увеличиваем размер массива

OnInitialUpdate(); // синхронизируем данные

Invalidate( TRUE ); // перерисовываем экран(вызов OnDraw())

pDoc->SetModifiedFlag(); // ставим флаг изменения документа

}

}

void CMDIView::OnMybutton2()

{

CMDIDoc* pDoc = GetDocument();

CMyDialog2 MyD;

MyD.DoModal();

OnInitialUpdate(); // синхронизируем данные

Invalidate( TRUE ); // перерисовываем экран(вызов OnDraw())

pDoc->SetModifiedFlag();

}

// MyDialog2.cpp : implementation file

//

#include "stdafx.h"

#include "MDI.h"

#include "MDIDoc.h"

#include "MDIView.h"

#include "MyDialog2.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CMyDialog2 dialog

CMyDialog2::CMyDialog2(CWnd* pParent /*=NULL*/)

: CDialog(CMyDialog2::IDD, pParent)

{

//{{AFX_DATA_INIT(CMyDialog2)

n = 0;

//}}AFX_DATA_INIT

}

void CMyDialog2::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMyDialog2)

DDX_Control(pDX, IDC_LIST1, m_l);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CMyDialog2, CDialog)

//{{AFX_MSG_MAP(CMyDialog2)

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_BN_CLICKED(IDC_BUTTON2, OnButton2)

ON_BN_CLICKED(IDC_BUTTON3, OnButton3)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CMyDialog2 message handlers

void CMyDialog2::OnButton1() //..........работает

{

// TODO: Add your control notification handler code here

m_l.ResetContent();

int i = CMDIDoc::GetDoc()->m_data.GetSize();

CString str;

UpdateData(true);

for (int j=0; j<(i-1); j++) {

str.Format("%2d.Наименование %10s Отдел %10s Дата изготовления %2d - %2d - %2d Срок хранения %2d - %2d - %2d ",(j+1),

CMDIDoc::GetDoc()->m_data.GetAt(j).naim,

CMDIDoc::GetDoc()->m_data.GetAt(j).otd,

CMDIDoc::GetDoc()->m_data.GetAt(j).dt4,

CMDIDoc::GetDoc()->m_data.GetAt(j).dtm,

CMDIDoc::GetDoc()->m_data.GetAt(j).dtg,

CMDIDoc::GetDoc()->m_data.GetAt(j).srd,

CMDIDoc::GetDoc()->m_data.GetAt(j).srm,

CMDIDoc::GetDoc()->m_data.GetAt(j).srg );

m_l.AddString(str); UpdateData(false);

}

}

void CMyDialog2::OnButton2() //..........работает

{ // TODO: Add your control notification handler code here

m_l.ResetContent();

}

void CMyDialog2::OnButton3()

{

m_l.ResetContent();

int i = CMDIDoc::GetDoc()->m_data.GetSize();

CString str;

int j,d,m,g,d1;

UpdateData(true);

{

for ( j=0; j<(i-1); j++) {

d1=CMDIDoc::GetDoc()->m_data.GetAt(j).dtm;

d=CMDIDoc::GetDoc()->m_data.GetAt(j).dt4+CMDIDoc::GetDoc()->m_data.GetAt(j).srd;

m=CMDIDoc::GetDoc()->m_data.GetAt(j).dtm+CMDIDoc::GetDoc()->m_data.GetAt(j).srm;

g=CMDIDoc::GetDoc()->m_data.GetAt(j).dtg+CMDIDoc::GetDoc()->m_data.GetAt(j).srg;

if ((d1==1)||(d1==3)||(d1==5)||(d1==7)||(d1==8)||(d1==10)||(d1==12))

{ if (d>31)

{d-=31; m++;}

}

else if (d1==2)

{ if (d>28)

{d-=28; m++;}

}

else if (d>30)

{d-=30; m++;}

if (m>12) g++;

str.Format("%d. Наименование %10s Отдел %10s Срок реализации: %2d - %2d - %4d",(j+1),

CMDIDoc::GetDoc()->m_data.GetAt(j).naim,

CMDIDoc::GetDoc()->m_data.GetAt(j).otd,

d,m,g );

m_l.AddString(str); UpdateData(false);

}

}

}