Объектно-ориентированное программирование Автобусы и маршруты

Реферат - Компьютеры, программирование

Другие рефераты по предмету Компьютеры, программирование

des

//{{AFX_VIRTUAL(CTypeForm)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

 

// Implementation

protected:

 

// Generated message map functions

//{{AFX_MSG(CTypeForm)

virtual BOOL OnInitDialog();

afx_msg void OnClose();

afx_msg void OK_onClick();

afx_msg void AddBusType_onClick();

afx_msg void EditBusType_onClick();

afx_msg void DeleteBusType_onClick();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

 

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

 

#endif // !defined(AFX_CTYPEFORM_H__7C58861A_0178_48E8_A650_7CB3A7C3C4D9__INCLUDED_)

main.cpp

#include "stdafx.h"

#include "main.h"

#include "Forms/CMainForm.h"

#include

#include "ExLibrary/CMyRecordset.h"

 

 

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

 

 

BEGIN_MESSAGE_MAP(CApp, CWinApp)

//{{AFX_MSG_MAP(CApp)

//}}AFX_MSG

ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()

 

CApp::CApp(){}

 

BOOL CApp::InitInstance(){

AfxEnableControlContainer();

CMainForm dlg;

m_pMainWnd = &dlg;

int nResponse = dlg.DoModal();

if (nResponse == IDOK)

{

}

else if (nResponse == IDCANCEL)

{

}

return FALSE;}

 

CApp theApp;

CDatabase DB;

CMyRecordset* RS;

 

/* ============================

===== User realization =====

============================ */

 

char buf[10]; char* toString(int value,int radix=10){

itoa(value,buf,radix);

return buf;};

 

CString IsEmpty_CEdit(CEdit* ctrl){

CString newValue;

ctrl->GetWindowText(newValue);

// >>>

if(!newValue.GetLength()){

AfxMessageBox("New value can't be empty!");

return "";}

return newValue;}

 

void sqlFilter(CString* value){

value->Replace("'","\"");}

 

long isExistRecordsOnCondition(CString sql,CString fields){

RS=new CMyRecordset(&DB);

RS->Open(sql,fields);

RS->DefineRealCount();

int Count=RS->Count;

RS->Close();

delete RS;

return Count;}

 

bool isUnique(CString sql,CString fields){

if(isExistRecordsOnCondition(sql,fields)>0){

AfxMessageBox("New value must be unique!");

return 0;}

return 1;}

 

bool isRelate(CString sql,CString fields){

if(isExistRecordsOnCondition(sql,fields)>0){

AfxMessageBox("The record cannot be deleted because this record related!!");

return 1;}

return 0;}

 

void Load_List(CString sql,CString fields,

CListBox* ctrl,

void clearIdxFunc(void),

void initIdxFunc(int),

void setIdxFunc(int,int)){

ctrl->ResetContent();

RS=new CMyRecordset(&DB);

RS->Open(sql,fields);

RS->DefineRealCount();

clearIdxFunc();

if(RS->Count){

initIdxFunc(RS->Count);

for(int i=0;iCount;i++){

setIdxFunc(i,RS->fieldsValue[0].m_lVal);

ctrl->InsertString(i,RS->fieldsValue[1].m_cstring);

RS->MoveNext();}}

RS->Close();

delete RS;}

 

void Load_List(CString sql,CString fields,

CComboBox* ctrl,

void clearIdxFunc(void),

void initIdxFunc(int),

void setIdxFunc(int,int)){

ctrl->ResetContent();

RS=new CMyRecordset(&DB);

RS->Open(sql,fields);

RS->DefineRealCount();

clearIdxFunc();

if(RS->Count){

initIdxFunc(RS->Count);

for(int i=0;iCount;i++){

setIdxFunc(i,RS->fieldsValue[0].m_lVal);

ctrl->InsertString(i,RS->fieldsValue[1].m_cstring);

RS->MoveNext();}}

RS->Close();

delete RS;}

main.h

#if !defined(AFX_MAIN_H__91D8EF8A_1C83_4AD5_8267_EBB877E382FD__INCLUDED_)

#define AFX_MAIN_H__91D8EF8A_1C83_4AD5_8267_EBB877E382FD__INCLUDED_

 

#if _MSC_VER > 1000

#pragma once

#endif

 

#ifndef __AFXWIN_H__

#error include 'stdafx.h' before including this file for PCH

#endif

 

#include "resource.h"

 

class CApp:public CWinApp{

public:

CApp();

//{{AFX_VIRTUAL(CApp)

public:

virtual BOOL InitInstance();

//}}AFX_VIRTUAL

//{{AFX_MSG(CApp)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()};

 

//{{AFX_INSERT_LOCATION}}

#endif // !defined(AFX_MAIN_H__91D8EF8A_1C83_4AD5_8267_EBB877E382FD__INCLUDED_)

CMyRecordset.cpp

#include "stdafx.h"

#include "../main.h"

#include "CMyRecordset.h"

 

void CMyRecordset::Open(CString sql,CString fields){

for(int i=0,j=0;i<fields.GetLength();i++)

if(fields[i]==',') m_nFields++;

m_nFields++;

// >>>

fieldsValue=new CMyDBVariant[m_nFields];

fieldsNames=new CString[m_nFields];

// >>>

for(i=0;i<fields.GetLength();i++)

if(fields[i]==',') j++;

else fieldsNames[j]+=fields[i];

// >>>

((CRecordset*)this)->Open(AFX_DB_USE_DEFAULT_TYPE,sql);}

 

void CMyRecordset::Close(){

delete []fieldsValue;

delete []fieldsNames;}

 

/* =========

$ String

% Integer

& Long

# Time

========= */

 

void CMyRecordset::DoFieldExchange(CFieldExchange* pFX){

pFX->SetFieldType(CFieldExchange::outputColumn);

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

switch(fieldsNames[i].GetAt(fieldsNames[i].GetLength()-1)){

case '$': RFX_Text(pFX,_T(fieldsNames[i].Left(fieldsNames[i].GetLength()-1)),fieldsValue[i].m_cstring); break;

case '&': RFX_Long(pFX,_T(fieldsNames[i].Left(fieldsNames[i].GetLength()-1)),fieldsValue[i].m_lVal); break;

case '#': RFX_Date(pFX,_T(fieldsNames[i].Left(fieldsNames[i].GetLength()-1)),fieldsValue[i].m_time); break;

case '%': break;}};

 

void CMyRecordset::DefineRealCount(){

Count=0;

try{

MoveLast();

while(!IsBOF()){

MovePrev();

Count++;};

MoveFirst();}

catch(CDBException *pError){

pError->Delete();}}

CMyRecordset.h

#include

 

/* ============================

======= CMyDBVariant =======

============================ */

 

class CMyDBVariant:public CDBVariant{

public:

CString m_cstring;

CTime m_time;};

 

/* ============================

======= CMyRecordset =======

============================ */

 

class CMyRecordset:public CRecordset{

virtual void DoFieldExchange(CFieldExchange*);

public:

CMyRecordset(CDatabase* pdb):CRecordset(pdb){};

long Count;

void DefineRealCount();

void Open(CString,CString);

virtual void Close();

// >>>

CMyDBVariant* fieldsValue;

CString* fieldsNames;};

6. Результат работы программы

Ниже на рисунках представлены внешние виды форм, разработанных для данного проекта.

 

Рисунок 2 - Основная форма приложения

Рисунок 3 - Форма работы с автобусами

Рисунок 4 - Форма работы с типами автобусов

Рисунок 5 - Форма работы с временами отправлений

Рисунок 6 - Форма работы с рейсами

Рисунок 7 - Форма работы с маршрутами (путями)

Рисунок 8 - Форма работы с остановками

Рисунок 9 - Форма “О программе”

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

Также имеются сообщения, информативного характера, не несущие в себе каких-либо ограничений.

 

Рисунок 10 - Сообщение в форме “Времена отправлений”

Рисунок 11 - Сообщение о необходимости выбора