Объектно-ориентированное программирование Автобусы и маршруты
Реферат - Компьютеры, программирование
Другие рефераты по предмету Компьютеры, программирование
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 - Сообщение о необходимости выбора