Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
егннщшзщхзжжщ22222222.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
225 Кб
Скачать
☆

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;