Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Телефон.doc
Скачиваний:
8
Добавлен:
01.05.2025
Размер:
817.66 Кб
Скачать

Определения основных обработчиков событий

Основная деятельность происходит в классе вида. В нем можно выделить два обработчика.

ON_BN_CLICKED – обработчик события нажатия на кнопки.

ON_WM_TIMER- обработчик события таймера

Результаты тестирования

В результате тестирования не обнаружены серьезные ошибки.

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

Также следует отметить такой недостаток, что для вызова абонента необходимо нажать кнопку CALL (Набрать номер), что не совсем удобно. Удобнее бы был автоматический набор номера.

Эти недостатки могут быть исправлены в будущем.

Заключение

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

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

Разработанная на данный момент система имеет большой потенциал для увеличения функциональных возможностей, так, например, в эту систему можно внедрить нескольких пользователей, которые могут общаться одновременно, что будет достаточно востребовано. Также можно внедрить настройки телефона. Чтобы пользователь мог настраивать максимальное время соединения или ожидания соединения, автодозвон, определитель номера и др. Возможно добавление в программу функции отправки коротких сообщений.

Список использованной литературы

  1. Девид Дж. Круглински, Скотт Уингоу, Джордж Шеферд. «Программирование на Microsoft Visual C++ 6.0»

  2. Терри Кватрани, Джим Палистрант. «Визуальное моделирование с помощью IBM Rational Software Architect и UML»

Приложение

Use case diagram

Activity diagram

Sequence diagram

Collaboration diagram

State Machine Diagram

ClassDiagramm

Руководство пользователя

В данной программе реализован интуитивно понятный интерфейс. Кнопка «Снять трубку» , «Положить трубку», «Набрать номер», «С» - сбросить набранный номер, «#» - набрать последний набранный номер, «Добавить» - добавить запись в телефонную книгу, «Удалить» - удалить выбранную запись из телефонной книги .

После того, как ВЫ сняли трубку необходимо нажать кнопку «Набрать номер», чтобы дозвониться до нужного абонента. При приёме звонка нужно нажать на кнопку «Снять трубку», после чего можно разговаривать со звонящим.

Руководство программиста

Компиляция и компоновка производится в среде Microsoft Visual C++ 2005.

Проект содержит следующие файлы:

AutoTelStation.h,. AutoTelStation.cpp - определение и реализация класса AutoTelStation

LastNumber.h,. LastNumber.cpp - определение и реализация класса LastNumber

Phone.h, Phone.cpp - определение и реализация класса Phone

СTelSystemView.h, СTelSystemView.cpp – определение и реализация класса вида

TelSystemDoc.h, TelSystemDoc.cpp - определение и реализация класса документа.

Resource.h, TelSystem.rc – файлы ресурсов.

TelSystem.h,. СTelSystem.cpp - определение и реализация класса приложения.

MainFrm.h, MainFrm.cpp - определение и реализация класса главного окна-рамки.

СTelSystem.dsp, СTelSystem.dsw – файлы проекта.

Листинг программы

AutoTelStation.h

#if !defined(AFX_AUTOTELSTATION_H__A7AF82D2_E426_416F_93EF_9C67B869F03E__INCLUDED_)

#define AFX_AUTOTELSTATION_H__A7AF82D2_E426_416F_93EF_9C67B869F03E__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "Phone.h"

class Phone;//класс Телефон

class AutoTelStation //класс Автоматическая телефонная станция

{

int condition;//состояние

public:

Phone* phone;//указатель на обект класса Телефон

void SetCondition(int );//устанавливает состояние

int GetCondition();//получает состояние

void TakeTubeState(int );//ф-ция, вызывается при поднятии трубки

int TalkState(int );//начался разговор

};

#endif // !defined(AFX_AUTOTELSTATION_H__A7AF82D2_E426_416F_93EF_9C67B869F03E__INCLUDED_)

AutoTelStation.cpp

#include "stdafx.h"

#include "TelSystem.h"

#include "AutoTelStation.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

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

// Construction/Destruction

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

int AutoTelStation::TalkState(int Flag )//ф-ция устанавливает телефон в режим разговор

{

phone->SetCondition(Flag);//переводит телефон в состояние разговора

return Flag;//возвращает это состояние

}

int AutoTelStation::GetCondition()//получает состояние

{

return condition;//возвращает текущее состояние

}

void AutoTelStation::SetCondition(int Condition)//устанавливает состояние

{

condition = Condition;//изменяет текущее состояние на новое

}

void AutoTelStation::TakeTubeState(int Flag )//ф-ция при поднятии трубки

{

phone->SetCondition(Flag); }//устанавливает телефон в состояние поднятой трубки

LastNumber.h

#if !defined(AFX_LASTNUMBER_H__6A8EE29A_7F17_4BE3_A9A2_3769D918442C__INCLUDED_)

#define AFX_LASTNUMBER_H__6A8EE29A_7F17_4BE3_A9A2_3769D918442C__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class LastNumber//класс память телефона

{

char* ls_number;//строка, для хранения последнего набранного номера

public:

LastNumber();//конструктор без параметров

void Remember(char* );//запоминает номер(указатель на номер, кот. хотим запомнить)

char* Recall();//извлечение номера из памяти

virtual ~LastNumber();//деструктор

};

#endif // !defined(AFX_LASTNUMBER_H__6A8EE29A_7F17_4BE3_A9A2_3769D918442C__INCLUDED_)

LastNumber.cpp

#include "stdafx.h"

#include "TelSystem.h"

#include "LastNumber.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

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

// Construction/Destruction

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

char* LastNumber::Recall()//извлечение номера из памяти

{

return ls_number;//возвращает номер из памяти

}

LastNumber::LastNumber()//конструктор без параметров

{

ls_number = new char[3];//выделяется динамическая память на строку из 3-х симвалов

strcpy(ls_number,"000");//копирование

}

void LastNumber::Remember(char* Ls_Number)//запоминание номера

{

strcpy(ls_number,Ls_Number);//копирование

}

LastNumber::~LastNumber()//деструктор

{ }

PersonDlg.h

#if !defined(AFX_PERSONDLG_H__FD74D70E_FC79_40F5_BD80_C7A32A957C8C__INCLUDED_)

#define AFX_PERSONDLG_H__FD74D70E_FC79_40F5_BD80_C7A32A957C8C__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// PersonDlg.h : header file

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

// PersonDlg dialog

//диалог при добавлении записи в телефонную книгу

class PersonDlg : public CDialog

{

// Construction

public:

PersonDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(PersonDlg)

enum { IDD = IDD_DIALOG1 };

CString m_fio;//Ф.И.О.

CString m_phone;//номер телефона

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(PersonDlg)

protected:

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

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(PersonDlg)

afx_msg void OnOk();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

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

#endif // !defined(AFX_PERSONDLG_H__FD74D70E_FC79_40F5_BD80_C7A32A957C8C__INCLUDED_)

PersonDlg.cpp

#include "stdafx.h"

#include "TelSystem.h"

#include "PersonDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// PersonDlg dialog

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

: CDialog(PersonDlg::IDD, pParent)//конструктор

{

//{{AFX_DATA_INIT(PersonDlg)

//по умолчанию инициализируется пустая строка

m_fio = _T("");

m_phone = _T("");

//}}AFX_DATA_INIT

}

void PersonDlg::DoDataExchange(CDataExchange* pDX)// обмен между элементами управления диалога или формы и членами-данными класса диалога или формы

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(PersonDlg)

DDX_Text(pDX, IDC_EDIT1, m_fio);

DDX_Text(pDX, IDC_EDIT2, m_phone);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(PersonDlg, CDialog)//карта сообщений

//{{AFX_MSG_MAP(PersonDlg)

ON_BN_CLICKED(IDOK2, OnOk)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

// PersonDlg message handlers

void PersonDlg::OnOk()

{

// TODO: Add your control notification handler code here

CDialog::OnOK();

}

Phone.h

#if !defined(AFX_PHONE_H__2575054F_6125_4983_8119_235D33BC794E__INCLUDED_)

#define AFX_PHONE_H__2575054F_6125_4983_8119_235D33BC794E__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "LastNumber.h"

#include "AutoTelStation.h"

class AutoTelStation;//класс Автоматическая телефонная станция

class Phone //класс Телефон

{

int condition;//состояние телефона

char* number;//текущий номер телефона

public:

Phone();//конструктор без параметров

void SetTelNumb(char* );//устанавливает текущий номер

char* GetTelNumb();//получает текущий номер

LastNumber* lsnumber;//указатель на объект типа память телефона

AutoTelStation* ats;//указатель на объект типа телефонная станция

void SetCondition(int );//устанавливает состояние телефона

int GetCondition();//получает состояние телефона

int NextCondition();//устанавливает следующее состояние

int FirstCondition();//устанавливает первое состояние

int AbonentNumberD(int );//добавление цифры к номеру

int Call();//звонок

void FreeNumber();//очищение текущего номера

void LastNumber();//устанавливает предыдущий номер

void TakeTubeState(int );//устанавливает состояние поднятой трубки

virtual ~Phone();//деструктор

};

#endif // !defined(AFX_PHONE_H__2575054F_6125_4983_8119_235D33BC794E__INCLUDED_)

Phone.cpp

#include "stdafx.h"

#include "TelSystem.h"

#include "Phone.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

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

// Construction/Destruction

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

int Phone::GetCondition()

{

return condition;

}

void Phone::SetCondition(int Condition)

{

condition = Condition;

}

Phone::Phone()//конструктор без параметров

{

condition = 1;//устанавливаем состояние 1

number = new char[3];//выделение памяти под номер

strcpy(number,"");//номер пуст

}

int Phone::Call()//звонок

{

SetCondition(2);//устанавливаем состояние 2(в состояние разговора)

return 0;

}

Phone::~Phone()//деструктор

{ }

int Phone::NextCondition()//получение следующего состояния

{

if (condition == 1) condition = 2;

if (condition == 3) condition = 4;

return 0;

}

int Phone::FirstCondition()//первое состояние

{

condition = 1;//состояние 1

strcpy(number,"");//пустая строка копируется в номер

return 0;

}

void Phone::LastNumber()//функцмя, устанавливающая вместо текущего номера предыдущий

{

number = lsnumber->Recall();//извлекаем предыдущий номер и присваиваем текущему

}

int Phone::AbonentNumberD(int Number)//добавление цифры к номеру

{

char* n = new char[10];//выделение памяти под строку

itoa(Number,n,10);//преведение типов

strcat(number,n);//добавление к номеру последней цифры

return 0;

}

void Phone::FreeNumber()//очищение номера

{

strcpy(number,"");

}

void Phone::SetTelNumb(char* Number)//устанавливает телефонный номер

{

strcpy(number,Number);//изменяем текущий номер

}

void Phone::TakeTubeState(int Flag)//установить состояние, что трубка снята

{

SetCondition(Flag);//устанавливаем флаг, соответствующий состояние снятой трубки

}

char* Phone::GetTelNumb()//получение телефонного номера

{

return number;//получает текущий номер

}

RecordTel.h

#if !defined(AFX_TELSYSTEMDOC_H__D84FBEA6_9B90_4C88_BF9A_83522A23A895__INCLUDED_)

#define AFX_TELSYSTEMDOC_H__D84FBEA6_9B90_4C88_BF9A_83522A23A895__INCLUDED_

#include <afxtempl.h>

#include "LastNumber.h"

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class RecordTel //запись в телефонную книгу

{

public:

RecordTel(char* , UINT );//конструктор с параметрами( имя человека, номер телефона)

RecordTel();//конструктор без параметров

RecordTel(const RecordTel& );//конструктор копирования

~RecordTel();//деструктор

CString name; //имя

UINT number; //номер

};

RecordTel.cpp

#include "stdafx.h"

#include "TelSystem.h"

#include "TelSystemDoc.h"

#include "TelSystemView.h"

#include "LastNumber.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

RecordTel::RecordTel(char *nm, UINT num): name(nm), number(num)//для записи

{

}

RecordTel::RecordTel()//конструктор без параметров

{

}

RecordTel::RecordTel(const RecordTel &Other)//конструктор копирования

{

name = Other.name;

number = Other.number;

}

RecordTel::~RecordTel()//деструктор

{

}

TelSystemDoc.h

#if !defined(AFX_TELSYSTEMDOC_H__D84FBEA6_9B90_4C88_BF9A_83522A23A895__INCLUDED_)

#define AFX_TELSYSTEMDOC_H__D84FBEA6_9B90_4C88_BF9A_83522A23A895__INCLUDED_

#include <afxtempl.h>

#include "LastNumber.h"

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CTelSystemDoc : public CDocument//класс содержащий данные программы

{

protected: // create from serialization only

CTelSystemDoc();

DECLARE_DYNCREATE(CTelSystemDoc)

// Attributes

public:

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CTelSystemDoc)

public:

virtual BOOL OnNewDocument();

virtual void Serialize(CArchive& ar);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CTelSystemDoc();//деструктор

CList<RecordTel, RecordTel&> list; //стандартная коллекция

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

protected:

//{{AFX_MSG(CTelSystemDoc)

// NOTE - the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code !

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

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

//{{AFX_INSERT_LOCATION}}

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

#endif // !defined(AFX_TELSYSTEMDOC_H__D84FBEA6_9B90_4C88_BF9A_83522A23A895__INCLUDED_)

TelSystemDoc.cpp

#include "stdafx.h"

#include "TelSystem.h"

#include "TelSystemDoc.h"

#include "TelSystemView.h"

#include "LastNumber.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// CTelSystemDoc

IMPLEMENT_DYNCREATE(CTelSystemDoc, CDocument)

BEGIN_MESSAGE_MAP(CTelSystemDoc, CDocument)

//{{AFX_MSG_MAP(CTelSystemDoc)

// NOTE - the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

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

// CTelSystemDoc construction/destruction

//для хранения данных

CTelSystemDoc::CTelSystemDoc()//конструктор без параметров

{

// TODO: add one-time construction code here

}

CTelSystemDoc::~CTelSystemDoc()//деструктор

{

list.RemoveAll();//очищение телефонной книги

}

BOOL CTelSystemDoc::OnNewDocument()//обновление документа(вызывается, когда нажимаем на иконку листок бумаги на панеле инструментов)

{

if (!CDocument::OnNewDocument())

return FALSE;

// TODO: add reinitialization code here

// (SDI documents will reuse this document)

list.RemoveAll();//очищение книги

POSITION position = GetFirstViewPosition(); //получение позиции главного вида

CTelSystemView* pView = (CTelSystemView*)GetNextView(position);//делаем текущий вид первым

pView->MakeUpdate();//обновляем вид

return TRUE;//успешное выполнение ф-ции

}

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

// CTelSystemDoc serialization

void CTelSystemDoc::Serialize(CArchive& ar)//сериализация-для сохранения записей в файл и чтения из него

{

int Kol = 0;//количество записей обнуляем

if (ar.IsStoring())//если объект ar используется для записи

{

// TODO: add storing code here

Kol = list.GetCount();//kol присваиваем количество записей в книге

ar<<Kol;//записываем количество

POSITION position = list.GetHeadPosition(); //присваиваем первую позицию элемента в книге

while(position!= 0)//пока есть незаписанные элементы в списке

{

RecordTel person = list.GetNext(position);//создаем запись person и присваиваем ей следующую запись из списка

ar<<person.name;//записываем имя

ar<<person.number;//записываем номер телефона

}

}

else//если объект ar используется для чтения

{

// TODO: add loading code here

list.RemoveAll();удаляем все записи

ar>>Kol;//читаем количество элементов в книге

for(int i = 0; i<Kol ; i++)//цикл пока не считаем все записи

{

RecordTel person;//создаем объек person для чтения в него записи

ar>>person.name;//читаем имя

ar>>person.number;//читаем номер

list.AddTail(person);//добавляем запись в конец колекции(телефонной книги)

}

}

UpdateAllViews(NULL);

POSITION position = GetFirstViewPosition();

CTelSystemView* pView = (CTelSystemView*)GetNextView(position);

pView->MakeUpdate();

}

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

// CTelSystemDoc diagnostics

#ifdef _DEBUG

void CTelSystemDoc::AssertValid() const

{

CDocument::AssertValid();

}

void CTelSystemDoc::Dump(CDumpContext& dc) const

{

CDocument::Dump(dc);

}

#endif //_DEBUG

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

// CTelSystemDoc commands

TelSystemView.h

#if !defined(AFX_TELSYSTEMVIEW_H__05AB2460_14A4_43BC_BF7F_437596EEE2AB__INCLUDED_)

#define AFX_TELSYSTEMVIEW_H__05AB2460_14A4_43BC_BF7F_437596EEE2AB__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "Phone.h"

class Phone;// класс Телефон

class LastNumber;// класс память телефона

class AutoTelStation;// класс Автоматическая телефонная станция

class CTelSystemView : public CFormView//класс отображения, наследуется от класса CFormView

{

protected: // create from serialization only

CTelSystemView();//конструктор без параметров

DECLARE_DYNCREATE(CTelSystemView)

public:

//{{AFX_DATA(CTelSystemView)

enum { IDD = IDD_TELSYSTEM_FORM };

CButton m_k9;//CButton-кнопки, создаем через Class Wizard(цифра 9)

CButton m_k8;//цифра 8

CButton m_k7;

CButton m_k6;

CButton m_k5;

CButton m_k4;

CButton m_k3;

CButton m_k2;

CButton m_k16;

CButton m_k15;

CButton m_k14;

CButton m_k11;

CButton m_k10;

CButton m_k1;

CButton m_k0;

CString m_text;//переменная для хранения номера

//}}AFX_DATA

// Attributes

public:

CTelSystemDoc* GetDocument();

Phone* phone;//создаем указатель на объект типа Телефон

LastNumber* ls_num;//указатель на объект типа память телефона

AutoTelStation* ats;

//счетчики срабатывания таймеров

int first_tm;

int second_tm;

int third_tm;

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CTelSystemView)

public:

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

virtual BOOL IsSelected(const CObject* pDocItem) const;

protected:

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

virtual void OnInitialUpdate(); // called first time after construct

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CTelSystemView();//деструктор

void MakeUpdate();//ф-ция для обновления кники(списка)

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

protected:

//{{AFX_MSG(CTelSystemView)

//обработчики кнопок

afx_msg void OnButton0();

afx_msg void OnButton1();

afx_msg void OnButton2();

afx_msg void OnButton3();

afx_msg void OnButton4();

afx_msg void OnButton5();

afx_msg void OnButton6();

afx_msg void OnButton7();

afx_msg void OnButton8();

afx_msg void OnButton9();

afx_msg void OnButton10();

afx_msg void OnButton11();

afx_msg void OnButton16();

afx_msg void OnDblclkList1();//обработчик двойного щелчка на списке ListBox

afx_msg void OnButtonNew();

afx_msg void OnButton14();

afx_msg void OnButtonPlaceTube();

afx_msg void OnTimer(UINT nIDEvent); //обработчик срабатывания таймера

afx_msg void OnButtonDel();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

#ifndef _DEBUG // debug version in TelSystemView.cpp

inline CTelSystemDoc* CTelSystemView::GetDocument()

{ return (CTelSystemDoc*)m_pDocument; }

#endif

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

//{{AFX_INSERT_LOCATION}}

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

#endif // !defined(AFX_TELSYSTEMVIEW_H__05AB2460_14A4_43BC_BF7F_437596EEE2AB__INCLUDED_)

TelSystemView.cpp

#include "stdafx.h"

#include "TelSystem.h"

#include "TelSystemDoc.h"

#include "TelSystemView.h"

#include "PersonDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

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

// CTelSystemView

IMPLEMENT_DYNCREATE(CTelSystemView, CFormView)//карта сообщений

BEGIN_MESSAGE_MAP(CTelSystemView, CFormView)

//{{AFX_MSG_MAP(CTelSystemView)

ON_BN_CLICKED(IDC_BUTTON0, OnButton0)

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_BN_CLICKED(IDC_BUTTON2, OnButton2)

ON_BN_CLICKED(IDC_BUTTON3, OnButton3)

ON_BN_CLICKED(IDC_BUTTON4, OnButton4)

ON_BN_CLICKED(IDC_BUTTON5, OnButton5)

ON_BN_CLICKED(IDC_BUTTON6, OnButton6)

ON_BN_CLICKED(IDC_BUTTON7, OnButton7)

ON_BN_CLICKED(IDC_BUTTON8, OnButton8)

ON_BN_CLICKED(IDC_BUTTON9, OnButton9)

ON_BN_CLICKED(IDC_BUTTON10, OnButton10)

ON_BN_CLICKED(IDC_BUTTON11, OnButton11)

ON_BN_CLICKED(IDC_BUTTON16, OnButton16)

ON_LBN_DBLCLK(IDC_LIST1, OnDblclkList1)

ON_BN_CLICKED(IDC_BUTTON12, OnButtonNew)

ON_BN_CLICKED(IDC_BUTTON14, OnButton14)

ON_BN_CLICKED(IDC_BUTTON15, OnButtonPlaceTube)

ON_WM_TIMER()

ON_BN_CLICKED(IDC_BUTTON13, OnButtonDel)

//}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)

END_MESSAGE_MAP()

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

// CTelSystemView construction/destruction

CTelSystemView::CTelSystemView()

: CFormView(CTelSystemView::IDD)//конструктор базового класса форма

{

//{{AFX_DATA_INIT(CTelSystemView)

m_text = _T("");//строка где храниться номер-пустая

//}}AFX_DATA_INIT

// TODO: add construction code here

ats = new AutoTelStation ;//выделяем память под объект ats

phone = new Phone;// выделяем память под объект phone

ls_num = new LastNumber;// выделяем память под объект LastNumber

}

CTelSystemView::~CTelSystemView()//деструктор

{

}

void CTelSystemView::DoDataExchange(CDataExchange* pDX)

{

CFormView::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CTelSystemView)

//связываем кнопки с переменными

DDX_Control(pDX, IDC_BUTTON9, m_k9);

DDX_Control(pDX, IDC_BUTTON8, m_k8);

DDX_Control(pDX, IDC_BUTTON7, m_k7);

DDX_Control(pDX, IDC_BUTTON6, m_k6);

DDX_Control(pDX, IDC_BUTTON5, m_k5);

DDX_Control(pDX, IDC_BUTTON4, m_k4);

DDX_Control(pDX, IDC_BUTTON3, m_k3);

DDX_Control(pDX, IDC_BUTTON2, m_k2);

DDX_Control(pDX, IDC_BUTTON16, m_k16);

DDX_Control(pDX, IDC_BUTTON15, m_k15);

DDX_Control(pDX, IDC_BUTTON14, m_k14);

DDX_Control(pDX, IDC_BUTTON11, m_k11);

DDX_Control(pDX, IDC_BUTTON10, m_k10);

DDX_Control(pDX, IDC_BUTTON1, m_k1);

DDX_Control(pDX, IDC_BUTTON0, m_k0);

DDX_Text(pDX, IDC_EDIT1, m_text);

//}}AFX_DATA_MAP

}

BOOL CTelSystemView::PreCreateWindow(CREATESTRUCT& cs)

{

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

// the CREATESTRUCT cs

return CFormView::PreCreateWindow(cs);

}

void CTelSystemView::OnInitialUpdate()

{

CFormView::OnInitialUpdate();

GetParentFrame()->RecalcLayout();

ResizeParentToFit();

}

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

// CTelSystemView printing

BOOL CTelSystemView::OnPreparePrinting(CPrintInfo* pInfo)

{

// default preparation

return DoPreparePrinting(pInfo);

}

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

{

// TODO: add extra initialization before printing

}

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

{

// TODO: add cleanup after printing

}

void CTelSystemView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)

{

// TODO: add customized printing code here

}

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

// CTelSystemView diagnostics

#ifdef _DEBUG

void CTelSystemView::AssertValid() const

{

CFormView::AssertValid();

}

void CTelSystemView::Dump(CDumpContext& dc) const

{

CFormView::Dump(dc);

}

CTelSystemDoc* CTelSystemView::GetDocument() // non-debug version is inline

{

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

return (CTelSystemDoc*)m_pDocument;

}

#endif //_DEBUG

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

// CTelSystemView message handlers

//реализация обработчиков сообщений от элементов управления

void CTelSystemView::OnButton0() // обрабатываем кнопку 0

{

phone->GetTelNumb();//получаем номер телефыона

if( strlen(phone->GetTelNumb())<3 )//если номер короче 3-х символов

{

phone->AbonentNumberD(0);//добавляем к номеру цифру 0

m_text=phone->GetTelNumb();// в переменную m_text записываем измененный номер

UpdateData(0);//чтобы вывести номер, хранящийся в m_text на экран

}

if( strlen(phone->GetTelNumb())==3 )//если длина строки=3

m_k16.EnableWindow(true);//делаем кнопку набора номера активной

}

void CTelSystemView::OnButton1()

{

phone->GetTelNumb();

if(strlen(phone->GetTelNumb())<3)

{

phone->AbonentNumberD(1);//добавляем цифру 1 к номеру

m_text=phone->GetTelNumb();

UpdateData(0);

}

if(strlen(phone->GetTelNumb())==3)

m_k16.EnableWindow(true);

}

void CTelSystemView::OnButton2()

{

phone->GetTelNumb();

if(strlen(phone->GetTelNumb())<3)

{

phone->AbonentNumberD(2);//добавляем цифру 2 к номеру

m_text=phone->GetTelNumb();

UpdateData(0);

}

if(strlen(phone->GetTelNumb())==3)

m_k16.EnableWindow(true);

}

void CTelSystemView::OnButton3()

{

phone->GetTelNumb();

if(strlen(phone->GetTelNumb())<3)

{

phone->AbonentNumberD(3);

m_text=phone->GetTelNumb();

UpdateData(0);

}

if(strlen(phone->GetTelNumb())==3)

m_k16.EnableWindow(true);

}

void CTelSystemView::OnButton4()

{

phone->GetTelNumb();

if(strlen(phone->GetTelNumb())<3)

{

phone->AbonentNumberD(4);

m_text=phone->GetTelNumb();

UpdateData(0);

}

if(strlen(phone->GetTelNumb())==3)

m_k16.EnableWindow(true);

}

void CTelSystemView::OnButton5()

{

phone->GetTelNumb();

if(strlen(phone->GetTelNumb())<3)

{

phone->AbonentNumberD(5);

m_text=phone->GetTelNumb();

UpdateData(0);

}

if(strlen(phone->GetTelNumb())==3)

m_k16.EnableWindow(true);

}

void CTelSystemView::OnButton6()

{

phone->GetTelNumb();

if(strlen(phone->GetTelNumb())<3)

{

phone->AbonentNumberD(6);

m_text=phone->GetTelNumb();

UpdateData(0);

}

if(strlen(phone->GetTelNumb())==3)

m_k16.EnableWindow(true);

}

void CTelSystemView::OnButton7()

{

phone->GetTelNumb();

if(strlen(phone->GetTelNumb())<3)

{

phone->AbonentNumberD(7);

m_text=phone->GetTelNumb();

UpdateData(0);

}

if(strlen(phone->GetTelNumb())==3)

m_k16.EnableWindow(true);

}

void CTelSystemView::OnButton8()

{

phone->GetTelNumb();

if(strlen(phone->GetTelNumb())<3)

{

phone->AbonentNumberD(8);

m_text=phone->GetTelNumb();

UpdateData(0);

}

if(strlen(phone->GetTelNumb())==3)

m_k16.EnableWindow(true);

}

void CTelSystemView::OnButton9()

{

phone->GetTelNumb();

if(strlen(phone->GetTelNumb())<3)

{

phone->AbonentNumberD(9);

m_text=phone->GetTelNumb();

UpdateData(0);

}

if(strlen(phone->GetTelNumb())==3)

m_k16.EnableWindow(true);

}

void CTelSystemView::OnButton10() //нажатие на кнопку сброса набранного номера

{

phone->FreeNumber();//очищаем текущий номер в телефоне

m_text="Наберите номер";

m_k16.EnableWindow(false);//делаем кнопку набора номера не активной

UpdateData(0); //выводим "Наберите номер" на экран

}

void CTelSystemView::OnButton11()//нажатие на кнопку #

{

phone->SetTelNumb(ls_num->Recall());//извлекаем номер из памяти телефона

m_text=phone->GetTelNumb();//в m_text вставляем номер телефона

UpdateData(0);//выводим номер телефона на экран

m_k16.EnableWindow(true);//делаем активной кнопку "Набрать номер"

}

BOOL CTelSystemView::IsSelected(const CObject* pDocItem) const//выделена ли?

{

// TODO: Add your specialized code here and/or call the base class

return CFormView::IsSelected(pDocItem);//возвращает выделен или нет вид

}

void CTelSystemView::OnButton16()//нажатие на кнопку "Набрать номер"

{

m_text="Вызов абонента";

UpdateData(0);//вывод на экран

//делаем указанные кнопки не активными или активными

m_k1.EnableWindow(false);

m_k2.EnableWindow(false);

m_k3.EnableWindow(false);

m_k4.EnableWindow(false);

m_k5.EnableWindow(false);

m_k6.EnableWindow(false);

m_k7.EnableWindow(false);

m_k8.EnableWindow(false);

m_k9.EnableWindow(false);

m_k0.EnableWindow(false);

m_k10.EnableWindow(false);

m_k11.EnableWindow(false);

m_k14.EnableWindow(false);

m_k15.EnableWindow(true);

m_k16.EnableWindow(false);

first_tm = 0;//обнуляем время испльзовани 1-ого таймера

SetTimer(1,1000,NULL);//устанавливаем 1ый таймер на 1 сек.

ls_num->Remember(phone->GetTelNumb());//запоминаем набранный номер в памяти телефона

}

void CTelSystemView::MakeUpdate()//обновляем отображение телефонной книги

{

CListBox *ListBox = (CListBox*)GetDlgItem(IDC_LIST1);//получаем указатель на объект окна книги, т.е. где отображаются на экране наши записи

int Kol = ListBox->GetCount();//получаем количество записей

while(Kol--)//пока есть записи, количество уменьшаем

ListBox->DeleteString(0);//удаляем 0 строку в цикле(т.е. все строки)

CTelSystemDoc *Document = GetDocument();//получаем указатель на документ

POSITION position = Document->list.GetHeadPosition();//получаем позицию первой записи

for(int i = 0; i < Document->list.GetCount(); i++)//пробегаем по циклу

ListBox->AddString(Document->list.GetNext(position).name);//добавляем в окно списка имя добавленного человека

}

void CTelSystemView::OnDblclkList1() // обработчик двойного щелчка на строке списка

{

CTelSystemDoc* Document = GetDocument();

CListBox* ListBox = (CListBox*)GetDlgItem(IDC_LIST1);

int fl = ListBox->GetCurSel();//получаем номер выделенной строки в списке на экране

if(fl == LB_ERR)

return;

CString str_to_numb; // имя человека, по которому будем искать его телефон в коллекции

ListBox->GetText(fl,str_to_numb);

POSITION position = Document->list.GetHeadPosition();//получаем позицию первой записи

int Kol = Document->list.GetCount();

for(int i = 0; i < Kol; i++){

if ( strcmp(str_to_numb.GetBuffer(0),Document->list.GetAt(position).name))//имена не совпали

Document->list.GetNext(position); // GetNext - переходим к следующей записи

else{

RecordTel person = Document->list.GetAt(position); // берем текущую запись, для которой имена совпали

CString s;//создаем строку s

s.Format("%i", person.number);//вставляем в нее номер телефона в записи

GetDlgItem(IDC_EDIT1)->SetWindowText(s.GetBuffer(0));//выводим на экран выбранный номер

break;

}

}

m_k11.EnableWindow(true);//включаем кнопку "Набор последнего номера"

m_k14.EnableWindow(false);//выключаем кнопку "Снять трубку"

m_k15.EnableWindow(true);//включаем номер "Положить трубку"

m_k16.EnableWindow(true);//включаем кнопку "Набрать номер"

}

void CTelSystemView::OnButtonNew() //добавить запись

{

PersonDlg dlg(this);//создаем диалог для ввода данных о человеке

CListBox *ListBox = (CListBox*)GetDlgItem(IDC_LIST1);//получаем указатель на список на экране

if(dlg.DoModal() == IDOK)//если нажали кнопку ok

{

UINT Number = 0;//номеру присваиваем 0

sscanf(dlg.m_phone.GetBuffer(0), "%i", &Number); //преобразуем строку с номером телефона в диалоге в номер телефона Number, кот. имеет тип int

if( (Number <= 99) || (Number >= 1000) )..если номер не 3-х значный

{

MessageBox("Номер должен быть трехзначным", "Ошибка");//сообщение об ошибке

}

else//иначе

{

RecordTel person( dlg.m_fio.GetBuffer(0), Number);//создаем запись person и инициализируем её имя и номер

GetDocument()->list.AddTail(person); //добавляем запись в конец списка

MakeUpdate();//обновляем отображение книги

}

}

}

void CTelSystemView::OnButton14() //нажатие на кнопку "Снять трубку"

{

if (phone->GetCondition() == 1)//если состояние телефона 1, т.е. сняли трубку

{

//включаем все кнопки кроме кнопок "Снять трубку" и "Набрать номер"

m_k1.EnableWindow(true);

m_k2.EnableWindow(true);

m_k3.EnableWindow(true);

m_k4.EnableWindow(true);

m_k5.EnableWindow(true);

m_k6.EnableWindow(true);

m_k7.EnableWindow(true);

m_k8.EnableWindow(true);

m_k9.EnableWindow(true);

m_k0.EnableWindow(true);

m_k10.EnableWindow(true);

m_k11.EnableWindow(true);

m_k14.EnableWindow(false);

m_k15.EnableWindow(true);

m_text.Insert(0,"Наберите номер");//в поле edit пишем "Набрать номер"

UpdateData(0);

}

if (phone->GetCondition()==3)//если состояние телефона 3, т.е. нажали "Набрать номер"

{

//включаем все кнопки, кроме "Положить трубку" и "Добавить"

m_k1.EnableWindow(false);

m_k2.EnableWindow(false);

m_k3.EnableWindow(false);

m_k4.EnableWindow(false);

m_k5.EnableWindow(false);

m_k6.EnableWindow(false);

m_k7.EnableWindow(false);

m_k8.EnableWindow(false);

m_k9.EnableWindow(false);

m_k0.EnableWindow(false);

m_k10.EnableWindow(false);

m_k11.EnableWindow(false);

m_k14.EnableWindow(false);

m_k15.EnableWindow(true);

m_k16.EnableWindow(false);

second_tm = 0;//обнуляем время использования 2-ого таймера

SetTimer(2,1000,NULL);//устанавливаем 2-ой таймер на 1 сек.

}

KillTimer(3);//уничтожаем 3-ий таймер

phone->NextCondition(); //переводим в следующее состояние телефон

}

void CTelSystemView::OnButtonPlaceTube() //нажали кнопку "Положить трубку"

{

//выключили все кнопки кроме "Снять трубку" и "Добавить"

m_k1.EnableWindow(false);

m_k2.EnableWindow(false);

m_k3.EnableWindow(false);

m_k4.EnableWindow(false);

m_k5.EnableWindow(false);

m_k6.EnableWindow(false);

m_k7.EnableWindow(false);

m_k8.EnableWindow(false);

m_k9.EnableWindow(false);

m_k0.EnableWindow(false);

m_k10.EnableWindow(false);

m_k11.EnableWindow(false);

m_k14.EnableWindow(true);

m_k15.EnableWindow(false);

m_k16.EnableWindow(false);

m_text="";//в m_text пустую строку

UpdateData(0);//выводим её на экран в поле edit

KillTimer(1);//уничтожаем 1 таймер

KillTimer(2);//уничтожаем 2 таймер

third_tm = 0;//обнуляем время использования 3-его таймера

SetTimer(3,1000,NULL);//устанавливаем 3 таймер

phone->FirstCondition();//переводим телефон в 1 состояние

}

void CTelSystemView::OnTimer(UINT nIDEvent) //обработка сообщений таймера

{

if (nIDEvent==1)//сработал 1 таймер(начало разговора)

{

first_tm += 1;//время использования 1-ого таймера увеличиваем на единицу

int p = rand()%10+2;//вычисляем вероятность

if(first_tm >= p)

{

m_text="Разговор";//в m_text помещаем "Разговор"

UpdateData(0);//выводим его в поле edit на экран

second_tm = 0;//обнуляем время использования 2 таймера

SetTimer(2,1000,NULL);//устанавливаем 2 таймер

phone->SetCondition(3);//переводим телефон в 3 состояние

KillTimer(1);//уничтожаем 1 таймер

}

if ( (p > 5) && ( first_tm == 1 ) )

{

m_text="Занято";

UpdateData(0);

MessageBox("Занято");//показываем информационное окно, где выводим "Занято"

KillTimer(1);//уничтожаем 1 таймер

}

}

if (nIDEvent == 2)//сработал 2 таймер (период разговора)

{

int p = rand()%15+4;//вычисляем вероятность

if (second_tm < p){

char* s = new char[20];//выделяем память под строку s

strcpy(s, "Разговор " );

char *hr = new char[3];//выделяем память под строку hr

second_tm+=1;//увеличиваем время использования 2 таймера

itoa(second_tm,hr,10);//преобразуем время использования таймера из типа int в строку hr

strcat( s,hr );//объединяем строку s со строкой hr

strcat( s, " сек" );//объединяем строку s с строкой "сек"

m_text = s;

UpdateData(0);//выводим в поле edit на экран строку s

}

else

{

KillTimer(2);

m_text="Соединение завершено";

MessageBox("Соединение завершено");

UpdateData(0);

}

}

if (nIDEvent==3)..если сработал 3 таймер

{

third_tm += 1;//увеличиваем время использования 3 таймера

int p = rand()%10+3;//вычисляем вероятность

if (third_tm >= p)

{

m_text="Вызов";

m_k15.EnableWindow(true);//делаем активной кнопку "Положить трубку"

UpdateData(0);

phone->SetCondition(3);//переводим телефон в состояние 3

KillTimer(3);//уничтожаем 3 таймер

}

}

CFormView::OnTimer(nIDEvent);//обработчик по умолчанию, создается средой

}

void CTelSystemView::OnButtonDel() //удаление записи из списка

{

CTelSystemDoc* Document = GetDocument();//получаем документ(где все данные)

CListBox* ListBox = (CListBox*)GetDlgItem(IDC_LIST1);//приведение типов

int fl = ListBox->GetCurSel();//получаем номер выбранной записи

if(fl == LB_ERR)//проверяем корректный выбор

return;

CString str_to_numb; // имя человека, по которому будем искать его телефон в коллекции

ListBox->GetText(fl,str_to_numb);

POSITION position = Document->list.GetHeadPosition();//получаем позицию первой записи в колекции(тел.книге)

int Kol = Document->list.GetCount();

for(int i = 0; i < Kol; i++){

if ( strcmp(str_to_numb.GetBuffer(0),Document->list.GetAt(position).name ) )// имена не совпали

Document->list.GetNext(position); // GetNext - переходим к следующей записи

else{

Document->list.RemoveAt(position);//удаляем элемент который располагается на найденной позиции

break;

}

}

MakeUpdate();//обновляем отображение телефонной книги

}

57