- •Курсовой проект
- •Содержание
- •Введение
- •Описание предметной области
- •Техническое задание на курсовой проект по теме: «Интерактивный телефонный справочник» Технический проект
- •3.1 Описание архитектуры программного продукта
- •3.2 Блок-схемы основных алгоритмов
- •3.3 Краткое описание файлов программного продукта
- •3.5 Принцип работы основных функций
- •3.4 Описание классов (переменные и функции)
- •4 Используемые методики тестирования программного продукта
- •4.1 Тестирование программного продукта целиком
- •4.2 Тестирование отдельных функций
- •5 Эксплуатационная документация
- •5.1 Руководство программиста
- •Техническое задание
3.4 Описание классов (переменные и функции)
При проектировании программного продукта возникла необходимость в объявлении следующих глобальных переменных:
переменная Login типа AnsiString (для хранения логина);
переменная Password типа AnsiString (для хранения пароля);
переменная K_BACK типа bool (для отслеживания позиции курсора при вводе даты).
При проектировании программного продукта «Интерактивный телефонный справочник» были разработаны следующие функции:
функция ввода-вывода информации;
функция просмотра текущей даты;
функция просмотра как всех записей целиком, так и отсортированной по какому-либо запросу;
функция просмотра информации по эксплуатации программного продукта;
функция просмотра информации о разработчиках программного продукта.
Также в данном программном продукте реализованы следующие основные функции:
функция разграничения доступа к данным (осуществляется связь с базой данных);
функция сохранения данных в файл (сохраняет результат обработки данных в файл: *.csv);
функция печати данных (выводит на печать результат обработки данных);
функции выборки данных по запросам пользователя (осуществляет работу с базой данных, хранящей информацию пользователя);
функция добавления/удаления информации (производит добавление/удаление информации в базу данных).
3.5 Принцип работы основных функций
При проектировании программного продукта «Интерактивный телефонный справочник» использована технология ADO для связи компонентов Borland C++ Builder 6 с таблицами базы данных, реализованной в Access. ADO поддерживают манипулирование наборами данных, обработку транзакций, кэшируемые обновления и т. д. ADO является частью более крупномасштабной технологии под названием Microsoft Data Access Components (MDAC).
Ниже представлены листинги основных функций.
Функция разграничения доступа к данным позволяет осуществлять регистрацию нового пользователя.
Листинг 1 – Код функции – обработчик события по кнопке «Зарегистрировать»
AnsiString Password1; //глобальная переменная под пароль
Login=Edit1->Text;
Password=Edit2->Text;
Password1=Edit3->Text;
if(Password!=Password1)
{
Edit2->Text="";
Edit3->Text="";
Application->MessageBox("Не правильный ввод паролей","Повторите ввод",MB_OK);
}
else
{
ADOQuery1->Active=false;
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from [Пользователи]where [Логин]=:Login;");
ADOQuery1->Parameters->ParamByName("Login")->Value = Login;
ADOQuery1->Active=true;
int i = 0; //количество строк после выполнения запроса
ADOQuery1->First(); // встаем на первую строчку запроса
while(! ADOQuery1->Eof)
{
i++;
ADOQuery1->Next();
}
if( i == 1)
{
Edit1->Text="";
Application->MessageBox("Такой ЛОГИН уже существует, введите другой","Повторите ввод",MB_OK);
}
else
{
Edit1->Text="";
Edit2->Text="";
Edit3->Text="";
ADOQuery1->Active=false;
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("insert into [Пользователи] values(Login,Password);");
ADOQuery1->Parameters->ParamByName("Login")->Value = Login;
ADOQuery1->Parameters->ParamByName("Password")->Value = Password;
ADOQuery1->ExecSQL();
Application->MessageBox("Регистрация прошла успешно","Приятной работы",MB_OK);
OsnovnayaForma->Show();
Close();
}
}
Функция сохранения данных в файл позволяет сохранять результат обработки данных по запросу пользователя в файл *.csv. Данное расширение поддерживает Microsoft Office Excel.
Листинг 2 – Код функции – обработчик щелчка по кнопке «Сохранить»
TField *fld;
AnsiString str;
ofstream out;
TFieldList *fildLst;
ADOQuery3->First(); // встаем на начало таблицы
if(SaveDialog3->Execute())
{
str = SaveDialog3->FileName+".csv"; // берем путь к сохраняемому файлу и дописываем к нему расширение
out.open(str.c_str(), ios::out); // открываем файл для записи
while(! ADOQuery3->Eof) // пока не конец таблицы...
{
for(int i = 0; i < ADOQuery3->FieldCount; i++) // выбираем первую ячейку в текущей записи и пока не дойдем до последней
{
fildLst = ADOQuery3->FieldList; // получаем список полей в текущей записи
fld = fildLst->operator [](i); // запихиваем в промежуточную переменную текущее поле (геморой билдера)
str = fld->AsString; // приводим текущее поле к типу AnsiString
out << str.c_str() << ";"; // пишем в файл... c_str() возвращает нам указатель на массив char
}
out << "\n";
ADOQuery3->Next(); // переходим к следущей записи
}
out.close(); // закрываем файл
}
Функция печати данных осуществляет предварительный просмотр и печать результата обработки данных по запросу пользователя.
Листинг 3 – Код функции – обработчик щелчка по кнопке «Печать»
Field *fld;
AnsiString str;
ofstream out;
TFieldList *fildLst;
String str1;
ADOQuery3->First();
out.open("print.htm", ios::out);
out << "<html><head><title></title></head><body>";
out << "<table border='1' bordercolor='1'>\n";
out << "<tr><td>Фамилия</td><td>Имя</td><td>Сотовый</td><td>Домашний</td><td>Рабочий</td><td>Факс</td><td>Другой телефон</td><td>E-mail</td></tr>";
while(! ADOQuery3->Eof)
{
out << "<tr><td> ";
for(int i = 0; i < ADOQuery3->FieldCount; i++)
{
fildLst = ADOQuery3->FieldList;
fld = fildLst->operator [](i);
str = fld->AsString;
if(i != ADOQuery3->FieldCount - 1)
out << str.c_str() << " </td><td> ";
else
out << str.c_str() << " </td></tr>";
}
ADOQuery3->Next();
}
out << "</table></body></html>";
out.close();
WinExec("print.exe", SW_SHOWNORMAL);
Листинг 4 – Код исполняемого файла print.exe
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
return a.exec();
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QString>
#include <QTextStream>
#include <QTextCursor>
#include <QIODevice>
#include <QTextEdit>
#include <QTextDocument>
#include <QPrinter>
#include <QPrintDialog>
MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags) // конструктор
: QMainWindow(parent, flags)
{
ui.setupUi(this); // прописывается системой
QString fileName = "print.htm"; //файл который будем печатать
QFile fileOpen(fileName); // QFile используется для работы с файлами fileOpen это дескриптор нужен для связи потока с файлом
ui.textEdit->setAcceptRichText(true); // говорим что текстовое поле должно читать данные в формате RichText
if(fileOpen.open(QIODevice::ReadOnly)) // открываем файл для чтения QIODevice вспомогательный класс он задает параметры для открываемого документа (чтение/запись)
{
QString line; // строка в которую будем читаь текст файла
QTextStream in(&fileOpen); // обявляем переменную для работы с потоком (в данном случае поток для работы с текстом, а не с бинарными данными)
line = in.readAll(); // читаем сразу весь файл
ui.textEdit->insertHtml(line); // выводим в текстовое поле (textEdit) в формате HTML
QTextCursor cursor = ui.textEdit->textCursor(); // перематываем курсор в начало (следующие 3 строки)
cursor.movePosition(QTextCursor::Start);
ui.textEdit->setTextCursor(cursor);
}
fileOpen.close(); // закрываем файл
}
MainWindow::~MainWindow() // деструктор
{
}
void MainWindow::on_CancelButton_2_clicked() // событие OnClick для кнопки "Отмена"
{
close();
}
// QTextDocument это не визуальный объект нужен нам потому что нельзя напрямую распечатать информацию из текстового поля QTextEdit
void MainWindow::on_PrintButton_clicked()// событие OnClick для кнопки "Печать"
{
QTextDocument *qtdDocument= ui.textEdit->document(); // объявляем указатель на текстовый документ. функция document класса QTextEdit возвращает указатель на текстовый документ
QPrinter *qpPrinter = new QPrinter(); // объявляем указатель на объект класса QPrinter для работы с принтером
QPrintDialog qpdPrintDialog(qpPrinter); // вызываем диалоговое окно с выбором параметров печати
if (!qpdPrintDialog.exec()) return;
qtdDocument->setPageSize(QSizeF(qpPrinter->pageRect().width(),qpPrinter->pageRect().height())); // задаем размеры печати документа
qtdDocument->print(qpPrinter); // печатем
}
Функция добавления информации создает новые записи в базе данных. Ниже приведен листинг данной функции на одной из вкладок.
Листинг 5 – Код функции – обработчик щелчка по кнопке «Добавить» на форме добавления новой записи
AnsiString Fam; //переменная под фаимлию
AnsiString Imja; // переменная под имя
AnsiString Sotov; //переменная под сотовый телефон
AnsiString DomTel; //переменная под домашний телефон
AnsiString RabTel; //переменная под рабочий телефон
AnsiString Facs;
AnsiString DrTel;
AnsiString Email;
Fam=Edit1->Text;
Imja=Edit2->Text;
Sotov=Edit3->Text;
DomTel=Edit4->Text;
RabTel=Edit5->Text;
Facs=Edit6->Text;
DrTel=Edit7->Text;
Email=Edit8->Text;
ADOQuery1->Active=false;
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from [Телефонный Справочник]where (([Логин]=:Login)and ([Имя]=:Imja) and([Фамилия]=:Fam)) ;");
ADOQuery1->Parameters->ParamByName("Login")->Value = Login;
ADOQuery1->Parameters->ParamByName("Fam")->Value = Fam;
ADOQuery1->Parameters->ParamByName("Imja")->Value = Imja;
ADOQuery1->Active=true;
int i = 0; //количество строк после выполнения запроса
ADOQuery1->First(); // встаем на первую строчку запроса
while(! ADOQuery1->Eof)
{
i++;
ADOQuery1->Next();
}
if( i == 1)
{
Edit1->Text="";
Edit2->Text="";
Application->MessageBox("Абонент с таким Именем и Фамилией уже существует","Повторите ввод",MB_OK);
}
else
{
Edit1->Text="";
Edit2->Text="";
Edit3->Text="";
Edit4->Text="";
Edit5->Text="";
Edit6->Text="";
Edit7->Text="";
Edit8->Text="";
ADOQuery1->Active=false;
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("insert into [Телефонный Справочник](Фамилия,Имя,[Сотовый телефон],[Домашний телефон],[Рабочий телефон],[Факс],[Другой телефон],[E-mail],Логин) values(Fam,Imja,Sotov,DomTel,RabTel,Facs,DrTel,Email,Login);");
ADOQuery1->Parameters->ParamByName("Fam")->Value = Fam;
ADOQuery1->Parameters->ParamByName("Imja")->Value = Imja;
ADOQuery1->Parameters->ParamByName("Sotov")->Value = Sotov;
ADOQuery1->Parameters->ParamByName("DomTel")->Value = DomTel;
ADOQuery1->Parameters->ParamByName("RabTel")->Value = RabTel;
ADOQuery1->Parameters->ParamByName("Facs")->Value = Facs;
ADOQuery1->Parameters->ParamByName("DrTel")->Value = DrTel;
ADOQuery1->Parameters->ParamByName("Email")->Value = Email;
ADOQuery1->Parameters->ParamByName("Login")->Value = Login;
ADOQuery1->ExecSQL();
Application->MessageBox("Обновите список, нажав на кнопку - Все записи","Добавление новой записи прошло успешно",MB_OK);
OsnovnayaForma->Show();
Close();
}
Функция удаления информации производит удаление существующих записей из базы данных. Ниже приведен листинг данной функции на одной из вкладок.
Листинг 6 – Код функции – обработчик щелчка по кнопке «Удалить» на форме удаления текущей записи
AnsiString Fam; //переменная под фаимлию
AnsiString Imja; // переменная под имя
AnsiString Sotov; //переменная под сотовый телефон
AnsiString DomTel; //переменная под домашний телефон
AnsiString RabTel; //переменная под рабочий телефон
AnsiString Facs;
AnsiString DrTel;
AnsiString Email;
Fam=Edit1->Text;
Imja=Edit2->Text;
Sotov=Edit3->Text;
DomTel=Edit4->Text;
RabTel=Edit5->Text;
Facs=Edit6->Text;
DrTel=Edit7->Text;
Email=Edit8->Text;
ADOQuery1->Active=false;
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select * from [Телефонный Справочник]where (([Логин]=:Login)and ([Имя]=:Imja) and([Фамилия]=:Fam)) ;");
ADOQuery1->Parameters->ParamByName("Login")->Value = Login;
ADOQuery1->Parameters->ParamByName("Fam")->Value = Fam;
ADOQuery1->Parameters->ParamByName("Imja")->Value = Imja;
ADOQuery1->Active=true;
int i = 0; //количество строк после выполнения запроса
ADOQuery1->First(); // встаем на первую строчку запроса
while(! ADOQuery1->Eof)
{
i++;
ADOQuery1->Next();
}
if( i == 1)
{
Edit1->Text="";
Edit2->Text="";
Application->MessageBox("Абонент с таким Именем и Фамилией уже существует","Повторите ввод",MB_OK);
}
else
{
Edit1->Text="";
Edit2->Text="";
Edit3->Text="";
Edit4->Text="";
Edit5->Text="";
Edit6->Text="";
Edit7->Text="";
Edit8->Text="";
ADOQuery1->Active=false;
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("insert into [Телефонный Справочник](Фамилия,Имя,[Сотовый телефон],[Домашний телефон],[Рабочий телефон],[Факс],[Другой телефон],[E-mail],Логин) values(Fam,Imja,Sotov,DomTel,RabTel,Facs,DrTel,Email,Login);");
ADOQuery1->Parameters->ParamByName("Fam")->Value = Fam;
ADOQuery1->Parameters->ParamByName("Imja")->Value = Imja;
ADOQuery1->Parameters->ParamByName("Sotov")->Value = Sotov;
ADOQuery1->Parameters->ParamByName("DomTel")->Value = DomTel;
ADOQuery1->Parameters->ParamByName("RabTel")->Value = RabTel;
ADOQuery1->Parameters->ParamByName("Facs")->Value = Facs;
ADOQuery1->Parameters->ParamByName("DrTel")->Value = DrTel;
ADOQuery1->Parameters->ParamByName("Email")->Value = Email;
ADOQuery1->Parameters->ParamByName("Login")->Value = Login;
ADOQuery1->ExecSQL();
Application->MessageBox("Обновите список, нажав на кнопку - Все записи","Добавление новой записи прошло успешно",MB_OK);
OsnovnayaForma->Show();
Close();
}
Функции выборки данных по запросам пользователя осуществляют работу с базой данных, созданной в Microsoft Office Access, и позволяет сортировать данные в соответствии с запросом.
Ниже приведен листинг одной из функций сортировки.
Листинг 7 – Код функции – обработчик щелчка по кнопке «Поиск» (осуществляет поиск номера абонента из нескольких полей таблицы «Телефонный справочник» базы данных)
Button18->Enabled=true;
Button16->Enabled=true;
AnsiString nomer;
AnsiString nomer1;
AnsiString nomer2;
AnsiString nomer3;
AnsiString nomer4;
nomer=Edit6->Text;
nomer1=Edit6->Text;
nomer2=Edit6->Text;
nomer3=Edit6->Text;
nomer4=Edit6->Text;
Edit6->Text="";
DBGrid3->DataSource=DataSource3;
ADOQuery3->Active=false;
ADOQuery3->SQL->Clear();
ADOQuery3->SQL->Add("select * from [Телефонный Справочник] where ([Сотовый телефон]=:nomer) or ([Домашний телефон]=:nomer1) or ([Рабочий телефон]=:nomer2) or ([Другой телефон]=:nomer3) or ([Факс]=:nomer4);");
ADOQuery3->Parameters->ParamByName("nomer")->Value = nomer;
ADOQuery3->Parameters->ParamByName("nomer1")->Value = nomer1;
ADOQuery3->Parameters->ParamByName("nomer2")->Value = nomer2;
ADOQuery3->Parameters->ParamByName("nomer3")->Value = nomer3;
ADOQuery3->Parameters->ParamByName("nomer4")->Value = nomer4;
ADOQuery3->Active=true;
