Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB_TP_2013.doc
Скачиваний:
82
Добавлен:
02.06.2015
Размер:
15.36 Mб
Скачать

Тестирование и использование приложения

  1. Запустите приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск.

  2. Выполните тестирование по рис.7.5. Рекомендуется добавлять и удалять элементы с включенным индикатором. Команда Вывести список необходима при отладке и тестировании приложения.

  3. Составьте и выполните тесты, которые проверят правильность всех случаев добавления и удаления элементов подсписков (см. комментарии в файлах f_7.cpp и LR_7.cpp).

  4. Убедитесь в правильности сохранения списка в файле.

  5. Модифицируйте код, переместив данные-элементы классов TRoll и TBike в закрытые части классов. Выполните отладку. Результаты продемонстрируйте преподавателю.

Рис.7.5 – форма с результатами тестирования

Файл реализации LR_7.cppмодуляLR_7

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "LR_7.h"

#include "f_7.h"

#include<string.h>

#include<fstream.h>

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "CSPIN"

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

//при создании формы создаем заголовок таблицы

void __fastcall TForm1::FormCreate(TObject *Sender)

{

StringGrid1->FixedRows=1;

StringGrid1->RowCount=1;

StringGrid1->FixedCols=0;

StringGrid1->ColCount=8;

StringGrid1->Cells[0][0]="номер";

StringGrid1->Cells[1][0]="изделие";

StringGrid1->Cells[2][0]="кол-во(шт) в п/сп";

StringGrid1->Cells[3][0]="дата поступления";

StringGrid1->Cells[4][0]="производитель";

StringGrid1->Cells[5][0]="диам колес(мм)";

StringGrid1->Cells[6][0]="вес(кг)";

StringGrid1->Cells[7][0]="кол-во скоростей";

}

//---------------------------------------------------------------------------

//активация компонентов для ввода данных элемента списка - велосипед

void __fastcall TForm1::RadioButton1Click(TObject *Sender)

{

GroupBox1->Caption="Велосипед";

DateTimePicker1->SetFocus();

LabeledEdit3->Enabled=true;

CSpinEdit1->Enabled=true;

Label2->Enabled=true;

}

//---------------------------------------------------------------------------

//подготовка компонентов для ввода данных элемента

// списка - ролик. коньки

void __fastcall TForm1::RadioButton2Click(TObject *Sender)

{

GroupBox1->Caption="Ролик. коньки";

DateTimePicker1->SetFocus();

LabeledEdit3->Enabled=false;

CSpinEdit1->Enabled=false;

Label2->Enabled=false;

}

//---------------------------------------------------------------------------

listspisok;//создаем объект класса - список

void __fastcall TForm1::AddExecute(TObject *Sender)

{

if(RadioButton1->Checked)

{ //создаем элемент списка - велосипед

TBike *bike=new TBike;

strcpy(bike->date,(DateToStr(DateTimePicker1->Date)).c_str());

if(LabeledEdit1->Text=="")

{

MessageBox(NULL,"Введите название производителя!","Ошибка", 0);

LabeledEdit1->SetFocus();

return;

}

strcpy(bike->comp,(LabeledEdit1->Text).c_str());

if(LabeledEdit2->Text==""||!isdigit(LabeledEdit2->Text[1]))

{

MessageBox(NULL,"Введите диаметр колес!","Ошибка",0);

LabeledEdit2->SetFocus();

return;

}

bike->diam=StrToInt(LabeledEdit2->Text);

if(LabeledEdit3->Text==""||!isdigit(LabeledEdit3->Text[1]))

{

MessageBox(NULL,"Введите вес!","Ошибка",0);

LabeledEdit3->SetFocus();

return;

}

bike->weight=StrToFloat(LabeledEdit3->Text);

bike->speeds=CSpinEdit1->Value;

//созданный элемент добавляем в список

spisok.append_bike(bike);

}

if(RadioButton2->Checked)

{ //создаем элемент списка - роликовые коньки

TRoll *roll=new TRoll;

strcpy(roll->date,(DateToStr(DateTimePicker1->Date)).c_str());

if(LabeledEdit1->Text=="")

{

MessageBox(NULL,"Введите название производителя!","Ошибка",0);

LabeledEdit1->SetFocus();

return;

}

strcpy(roll->comp,(LabeledEdit1->Text).c_str());

if(LabeledEdit2->Text==""||!isdigit(LabeledEdit2->Text[1]))

{

MessageBox(NULL,"Введите диаметр колес!","Ошибка",0);

LabeledEdit2->SetFocus();

return;

}

roll->diam=StrToInt(LabeledEdit2->Text);

//созданный элемент добавляем в список

spisok.append_roll(roll);

}

MessageBox(NULL,"Элемент добавлен!","",0);

//если индикатор включен - список выводится в таблицу

if(CheckBox1->Checked)spisok.out_list();

//вывод информации о списке

Form1->StatusBar1->SimpleText="Количество подсписков - "+

IntToStr(spisok.count_dsp)+" "+"Количество элементов в списке - "+

IntToStr(spisok.count_elem_sp);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::A_exitExecute(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------

//вывод списка в таблицу

void __fastcall TForm1::OutExecute(TObject *Sender)

{

spisok.out_list();

}

//---------------------------------------------------------------------------

int r; //переменная для номера строки выделенной ячейки в таблице

bool flag=true; //флаг - нет выделенной ячейки в таблице

void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,

int ARow, bool &CanSelect)

{

r=ARow; //номер строки выделенной ячейки сохранен в переменной r

flag=false; //ячейка в таблице выделена

}

//---------------------------------------------------------------------------

//удаляем из списка элемент, соответствующий номеру

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

void __fastcall TForm1::DelExecute(TObject *Sender)

{

if(spisok.is_empty)//если список пуст

{

MessageBox(NULL,"Список пуст!","",0);

return;

}

if(flag) //если ячейка в таблице не выделена

{

MessageBox(NULL,"Выделите элемент в таблице!","Ошибка",0);

return;

}

//удаляем из списка элемент, соответствующий значению переменной r

spisok.del(r);

//если индикатор включен - список выводится в таблицу

if(CheckBox1->Checked)spisok.out_list();

flag=true;//можно снова выделять ячейку в таблице

}

//---------------------------------------------------------------------------

//удаляем из списка подсписок, соответствующий номеру

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

void __fastcall TForm1::Clear_downExecute(TObject *Sender)

{

if(spisok.is_empty) //если список пуст

{

MessageBox(NULL,"Список пуст!","",0);

return;

}

if(flag) //если ячейка в таблице не выделена

{

MessageBox(NULL,"Выделите элемент в таблице!","Ошибка",0);

return;

}

//удаляем из списка подсписок, соответствующий значению переменной r

spisok.clear_down(r);

//если индикатор включен - список выводится в таблицу

if(CheckBox1->Checked)spisok.out_list();

flag=true; //можно снова выделять ячейку в таблице

}

//---------------------------------------------------------------------------

//уничтожаем список

void __fastcall TForm1::ClearExecute(TObject *Sender)

{

if(spisok.is_empty) //если список пуст

{

MessageBox(NULL,"Список пуст!","",0);

return;

}

//для объекта - список вызывается функция уничтожения списка

spisok.clear();

//уничтожение списка контролируется выводом в таблицу

spisok.out_list();

}

//---------------------------------------------------------------------------

AnsiString fn=""; //строка для имени файла

//вспомогательная строка для вывода списка из таблицы в файл

char str[50];

int s;//вспомогательная переменная для вывода в файл

//количества элементов в списке

//---------------------------------------------------------------------------

//сохраняем список в файле

void __fastcall TForm1::FileSave1Execute(TObject *Sender)

{

if(fn!="") //если есть имя файла со списком

{

ofstream outfile(fn.c_str(),ios::out);//открываем файл для записи

//в переменную s заносим количество элементов в списке

s=spisok.count_elem_sp;

//выводим в файл число из переменной s побайтно

outfile.write((char*)&s,sizeof(s));

//из таблицы список выводим в файл

for(int i=1; i<=s; i++)

{

for(int j=0;j<8;j++)

{ //преобразовав элемент из таблицы к типу char*,

//копируем его в вспомогательную строку str

strcpy(str,Form1->StringGrid1->Cells[j][i].c_str());

//выводим побайтно содержимое str в файл

outfile.write((char*)&str,50);

}

}

outfile.close();//закрываем файл

}

else //если файл со списком отсутствует

//открывается диалог сохранения в файле и пользователь

//выбирает имя файла

if(SaveDialog1->Execute())

{ //выбранное имя файла сохраняется в строке fn

fn=SaveDialog1->FileName;

//создается и открывается для записи файл с выбранным именем

ofstream outfile(fn.c_str(),ios::out);

//в переменную s заносим количество элементов в списке

s=spisok.count_elem_sp;

//выводим в файл число из переменной s побайтно

outfile.write((char*)&s,sizeof(s));

//из таблицы список выводим в файл

for(int i=1; i<=s; i++)

{

for(int j=0;j<8;j++)

{ //преобразовав элемент таблицы к типу char*,

//копируем его во вспомогательную строку str

strcpy(str,Form1->StringGrid1->Cells[j][i].c_str());

//выводим побайтно содержимое str в файл

outfile.write((char*)&str,50);

}

}

outfile.close();//закрываем файл

}

}

//---------------------------------------------------------------------------

//выводим список из файла в таблицу

//по данным таблицы формируем список в оперативной памяти

void __fastcall TForm1::FileOpen1Execute(TObject *Sender)

{

spisok.clear();//уничтожаем список в оперативной памяти

//открываем файл на чтение с выбранным при сохранении именем

ifstream infile(fn.c_str(),ios::in);

if(!infile) //проверка, удалось ли открыть файл

{

MessageBox(NULL,"Файл не удается открыть!","Ошибка",0);

return;

}

//в переменную s читаем из файла количество элементов в списке

infile.read((char*)&s,sizeof(s));

//читаем файл в таблицу

for(int i=1; i<=s; i++)

{

Form1->StringGrid1->RowCount++;//добавляем строку в таблице

for(int j=0;j<8;j++)

{ //читаем в строку str из файла очередную запись в 50 байт

infile.read((char*)&str,50);

//из строки str переносим запись в элемент таблицы

Form1->StringGrid1->Cells[j][i]=(AnsiString)str;

}

}

infile.close();//закрываем файл, открытый на чтение

//из данных строк таблицы формируем элементы списка

//элементы списка добавляем в список

for(int i=1; i<=s; i++)

{

if(StringGrid1->Cells[1][i]=="Bike")

{ //формируем элемент списка - велосипед

TBike* bike=new TBike;

strcpy(bike->date,StringGrid1->Cells[3][i].c_str());

strcpy(bike->comp,StringGrid1->Cells[4][i].c_str());

bike->diam=StrToInt(StringGrid1->Cells[5][i]);

bike->weight=StrToFloat(StringGrid1->Cells[6][i]);

bike->speeds=StrToInt(StringGrid1->Cells[7][i]);

spisok.append_bike(bike);//добавляем в список

}

if(StringGrid1->Cells[1][i]=="Roll")

{ //формируем элемент списка - роликовые коньки

TRoll* roll=new TRoll;

strcpy(roll->date,StringGrid1->Cells[3][i].c_str());

strcpy(roll->comp,StringGrid1->Cells[4][i].c_str());

roll->diam=StrToInt(StringGrid1->Cells[5][i]);

spisok.append_roll(roll);//добавляем в список

}

}

spisok.out_list(); //выводим прочитанный список в таблицу

//вывод информации о прочитанном списке

StatusBar1->SimpleText="Количество подсписков - "+

IntToStr(spisok.count_dsp)+" "+

"Количество элементов в списке - "+

IntToStr(spisok.count_elem_sp);

}

//---------------------------------------------------------------------------

//сохраняем как...

void __fastcall TForm1::FileSaveAs1Execute(TObject *Sender)

{

//выбранное ранее имя файла заносится в свойство FileName

//компонента SaveDialog1 и предлагается пользователю по умолчанию

SaveDialog1->FileName=fn;

//если при открытии диалога пользователь выбрал новое имя

if(SaveDialog1->Execute())

{ //то новое имя файла сохраняется в строке fn

fn=SaveDialog1->FileName;

//создается и открывается для записи файл с новым именем

ofstream outfile(fn.c_str(),ios::out);

if(!outfile) //проверка, удалось ли создать и открыть файл

{

MessageBox(NULL,"Файл не удается создать!","Ошибка",0);

return;

}

//в переменную s заносим количество элементов в списке

s=spisok.count_elem_sp;

//выводим в файл число из переменной s побайтно

outfile.write((char*)&s,sizeof(s));

//из таблицы список выводим в файл

for(int i=1; i<=s; i++)

{

for(int j=0;j<8;j++)

{ //преобразовав элемент таблицы к типу char*,

//копируем его в вспомогательную строку str

strcpy(str,Form1->StringGrid1->Cells[j][i].c_str());

//выводим побайтно содержимое str в файл

outfile.write((char*)&str,50);

}

}

outfile.close(); //закрываем файл

}

}

//---------------------------------------------------------------------------

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]