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

Проектирование приложения. Выбор, размещение и задание свойств компонентов. Коды классов, функций и обработчиков событий

Сохраните модуль главной формы под именем LR_7, а проект – под именемPR_LR_7.

Для размещения классов в проекте использован модуль, не связанный с формой. Чтобы создать такой модуль, нужно выполнить команду Файл/Новый/Другое…и открывшемся окнеНовые элементына страницеНовый щелкнуть на пиктограммеМодуль. Модулю дано имяf_7. В заголовочном файле этого модуляf_7.h находятся приведенные выше объявления типа-перечисление и классов, а в файле реализации модуляf_7.cpp– реализации классов (определения функций-элементов классов). Чтобы получить возможность отладки модуля, перенесем на форму со страницыДополнительнокомпонентStringGrid1и директивой #include"LR_7.h" подключим модуль формы к файлуf_7.cpp.

Заголовочный файл f_7.h модуля f_7 (без формы)

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

#ifndef f_7H

#define f_7H

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

//тип-перечисление для идентификации элементов списка

enum types{Roll, Bike};

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

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

class link

{

public:

link* prev; // указатель на предыдущий элемент основного списка

link* next; // указатель на следующий элемент основного списка

link* down; // указатель на следующий элемент подсписка

types type;

link(){prev=next=down=0;}//конструктор с умолчанием

};

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

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

class TRoll:public link

{

public:

char* date; //дата поступления

char* comp; //производитель

int diam; //диаметр колес (в мм)

int count; //количество (штук)

TRoll(); //конструктор

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

};

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

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

class TBike:public link

{

public:

char* date; //дата поступления

char* comp; //производитель

int diam; //диаметр колес (в мм)

int count; //количество (штук)

float weight;//вес (в кг)

int speeds; //количество скоростей

TBike(); //конструктор

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

};

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

//класс для списка

class list

{

public:

link* first; //указатель на начало списка

link* last; //указатель на конец списка

int count_dsp; //количество подсписков

int count_elem_sp; //количество элементов в списке

bool is_empty; //флаг "список пуст"

list(); //конструктор

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

void append_bike(TBike*);//добавление элемента-велосипеда в список

void append_roll(TRoll*);//добавление элемента-роликовые коньки в

//список

void del(int); //удаление элемента из списка

void out_list(); //вывод списка в таблицу

void clear_down(int); //удаление подсписка из списка

void clear(); //уничтожение списка

};

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

#endif

Файл реализации f_7.cpp модуля f_7 (без формы)

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

#pragma hdrstop

#include "f_7.h"

#include "LR_7.h"

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

#pragma package(smart_init)

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

//конструктор класса роликовые коньки

TRoll::TRoll()

{

type=Roll;

date=new char[50];

comp=new char[50];

diam=count=0;

}

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

//деструктор класса роликовые коньки

TRoll::~TRoll()

{

delete[]date;

delete[]comp;

}

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

//конструктор класса велосипед

TBike::TBike()

{

type=Bike;

date=new char[50];

comp=new char[50];

diam=count=weight=speeds=0;

}

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

//деструктор класса велосипед

TBike::~TBike()

{

delete[]date;

delete[]comp;

}

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

//конструктор класса список

list::list()

{

first=last=0;

count_dsp=count_elem_sp=0;

is_empty=true;

}

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

//деструктор класса список

list::~list()

{

clear();

}

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

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

void list::append_bike(TBike*bike)

{

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

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

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

first=bike;

last=bike;

bike->prev=0;

bike->next=0;

bike->down=0;

bike->count=1;

count_dsp=1;

count_elem_sp=1;

is_empty=false;

return;

}

//список не пуст

bool f=false; //подсписок для добавляемого элемента не определен

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

//ставим указатель на начало списка

link* current=first;

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

//в который нужно добавить элемент

while(current)

{

if(current->type==Bike&&

strcmp(((TBike*)current)->comp,bike->comp)==0)

{f=true;break;} //подсписок для добавления элемента найден

current=current->next;

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

if(!f)//добавляем элемент в конец списка, образуя новый подсписок

{

bike->prev=last;

last->next=bike;

last=bike;

bike->next=0;

bike->down=0;

bike->count=1;

count_dsp++;

count_elem_sp++;

}

else //добавляем элемент в конец найденного подсписка

{

link *curr=current;

while(curr->down)

curr=curr->down;

curr->down=bike;

bike->down=0;

((TBike*)current)->count++;

count_elem_sp++;

}

}

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

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

void list::append_roll(TRoll*roll)

{

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

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

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

last=roll;

last->next=0;

first=roll;

first->prev=0;

roll->down=0;

roll->count++;

count_dsp=1;

count_elem_sp=1;

is_empty=false;

return;

}

//список не пуст

bool f=false;//подсписок для добавляемого элемента не определен

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

//ставим указатель на конец списка

link* current=last;

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

//в который нужно добавить элемент

while(current)

{

if(current->type==Roll&&

strcmp(((TRoll*)current)->comp,roll->comp)==0)

{f=true; break;} //подсписок для добавления элемента найден

current=current->prev;

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

if(!f)//добавляем элемент в конец списка, образуя новый подсписок

{

roll->prev=last;

last->next=roll;

last=roll;

roll->next=0;

roll->down=0;

roll->count=1;

count_dsp++;

count_elem_sp++;

}

else //добавляем элемент в конец найденного подсписка

{ link *curr=current;

while(curr->down)

curr=curr->down;

curr->down=roll;

roll->down=0;

((TRoll*)current)->count++;

count_elem_sp++;

}

}

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

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

void list::out_list()

{

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

{

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

}

//число строк в таблице увеличиваем на количество

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

Form1->StringGrid1->RowCount=1+count_elem_sp;

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

//ставим указатель на начало списка

link *current=first;

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

//просматриваем основную часть списка,

//или первые элементы подсписков

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

{

if(current->type==Roll)//если в подсписке - ролик. коньки

{

//создаем текущий указатель подсписка и ставим его

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

TRoll* curr=(TRoll*)current;

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

while(curr)

{ //выводим элемент подсписка в строку таблицы

Form1->StringGrid1->Cells[0][j]=IntToStr(j);

Form1->StringGrid1->Cells[1][j]="Roll";

Form1->StringGrid1->Cells[2][j]=IntToStr(curr->count);

Form1->StringGrid1->Cells[3][j]=curr->date;

Form1->StringGrid1->Cells[4][j]=curr->comp;

Form1->StringGrid1->Cells[5][j]=IntToStr(curr->diam);

j++; //переходим на следующую строку таблицы

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

curr=(TRoll*)curr->down;

}

}

else if(current->type==Bike)//если в подсписке - велосипеды

{

//создаем текущий указатель подсписка и ставим его

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

TBike* curr=(TBike*)current;

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

while(curr)

{ //выводим элемент подсписка в строку таблицы

Form1->StringGrid1->Cells[0][j]=IntToStr(j);

Form1->StringGrid1->Cells[1][j]="Bike";

Form1->StringGrid1->Cells[2][j]=IntToStr(curr->count);

Form1->StringGrid1->Cells[3][j]=curr->date;

Form1->StringGrid1->Cells[4][j]=curr->comp;

Form1->StringGrid1->Cells[5][j]=IntToStr(curr->diam);

Form1->StringGrid1->Cells[6][j]=FloatToStr(curr->weight);

Form1->StringGrid1->Cells[7][j]=IntToStr(curr->speeds);

j++; //переходим на следующую строку таблицы

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

curr=(TBike*)curr->down;

}

}

current=current->next;//переходим на следующий подсписок

}

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

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

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

IntToStr(count_elem_sp);

}

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

//удаление из списка элемента, выделенного в строке r

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

void list::del(int r)

{

if(r==1&&count_elem_sp==1)//в списке только один элемент

{

link *current=first;

delete first;

first=last=0;

if(current->type==Roll) ((TRoll*)current)->count--;

else ((TBike*)current)->count--;

count_elem_sp--;//количество элементов в списке уменьшаем на один

count_dsp--;

is_empty=true;

MessageBox(NULL,"Список из одного элемента уничтожен!","",0);

return;

}

link *curr, *current=first;

int j;

if(current->type==Roll) j=((TRoll*)current)->count;

else j=((TBike*)current)->count;

bool f1=false,

f2=false;

while(current)//ищем подсписок с удаляемым элементом

{

if(j==r) {f1=true; break;}//удаляемый элемент - последний в подсписке

if(j>r) {f2=true; break;} //удаляемый элемент - внутри подсписка

current=current->next;//переход на следующий подсписок

if(current->type==Roll) j+=((TRoll*)current)->count;

else j+=((TBike*)current)->count;

}

//удаляемый элемент - последний в подсписке из нескольких элементов

if(f1&&current->down)

{

curr=current;

while(curr->down->down)//ищем предпоследний элемент в подсписке

curr=curr->down;

delete curr->down; //удаление последнего элемента в подсписке

curr->down=0;

//количество элементов в подсписке уменьшаем на один

if(current->type==Roll) ((TRoll*)current)->count--;

else ((TBike*)current)->count--;

count_elem_sp--;//количество элементов в списке уменьшаем на один

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

return;

}

//удаляемый элемент - в первом подсписке из одного элемента

if(f1&&!current->down&&current->next&&!current->prev)

{

first=current->next;//переносим начало списка на следующий элемент

first->prev=0;

delete current; //удаление единственного элемента в подсписке

count_dsp--; //количество подсписков в списке уменьшаем на один

count_elem_sp--; //количество элементов в списке уменьшаем на один

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

return;

}

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

if(f1&&!current->down&&!current->next&&current->prev)

{

last=current->prev;//переносим конец списка на предыдущий элемент

last->next=0;

delete current; //удаление единственного элемента в подсписке

count_dsp--; //количество подсписков в списке уменьшаем на один

count_elem_sp--; //количество элементов в списке уменьшаем на один

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

return;

}

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

//внутри основной части списка

if(f1&&!current->down&&current->next&&current->prev)

{

current->prev->next=current->next;//выключаем одноэлементный

// подсписок

current->next->prev=current->prev;//из списка

delete current; //удаление единственного элемента в подсписке

count_dsp--; //количество подсписков в списке уменьшаем на один

count_elem_sp--; //количество элементов в списке уменьшаем на один

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

return;

}

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

int k;

if(current->type==Roll) k =((TRoll*)current)->count;

else k =((TBike*)current)->count;

if(f2&&(j-k+1==r))

{

//на место первого ставим второй элемент подсписка

//удаляемый элемент - первый в единственном

//подсписке из нескольких элементов

if(current==first&&current==last)

{

first=current->down;

last=current->down;

}

//удаляемый элемент - первый в первом

//подсписке из нескольких элементов

if(current==first)

{

current->next->prev=current->down;

current->down->next=current->next;

}

//удаляемый элемент - первый в последнем

//подсписке из нескольких элементов

if(current==last)

{

current->prev->next=current->down;

current->down->prev=current->prev;

}

//удаляемый элемент - первый во внутреннем

//подсписке из нескольких элементов

if(current->prev&&current->next)

{

current->next->prev=current->down;

current->down->next=current->next;

current->prev->next=current->down;

current->down->prev=current->prev;

}

//количество элементов в подсписке уменьшаем на один

if(current->type==Roll) ((TRoll*)current->down)->count=k-1;

else ((TBike*)current->down)->count=k-1;

//если подсписок первый - переносим first на второй элемент подсписка

if(current==first) first=current->down;

// если подсписок последний - переносим last на второй элемент

// подсписка

if(current==last) last=current->down;

delete current;

count_elem_sp--;

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

return;

}

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

j=j-k;//количество элементов в списке до подсписка

//с удаляемым элементом

curr=current;

link *pr;//указатель на предыдущий по отношению к текущему (curr)

// элементу подсписка

while(j<r) //поиск элемента в подсписке

{

pr=curr;

curr=curr->down;

j++;

}

pr->down=curr->down;//выключение элемента из подсписка

delete curr; //удаление элемента

//количество элементов в подсписке уменьшаем на один

if(current->type==Roll) ((TRoll*)current)->count--;

else ((TBike*)current)->count--;

count_elem_sp--;//количество элементов в списке уменьшаем на один

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

return;

}

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

//удаление подсписка с выделенным в строке rd

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

void list::clear_down(int rd)

{

if(is_empty)

{

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

return;

}

link *current=first;//указатель на текущий элемент списка

if(!current->next) //список состоит из одного подсписка

{

link *pr;//указатель на предыдущий по отношению

//к текущему (current) элементу подсписка

while(current)

{

pr=current;

current=current->down;

delete pr;

}

first=last=0;

count_dsp=0;

count_elem_sp=0;

is_empty=true;

MessageBox(NULL,"Список из одного подсписка уничтожен!","",0);

return;

}

int j;//номер текущей строки в таблице вывода списка

if(current->type==Roll) j=((TRoll*)current)->count;

else j=((TBike*)current)->count;

while(j<rd) //поиск подсписка с выделенным в таблице элементом

{

current=current->next;//переход на следующий подсписок

if(current->type==Roll) j+=((TRoll*)current)->count;

else j+=((TBike*)current)->count;

}

//выключение подсписка из списка

//выключаемый подсписок - первый в списке

if(!current->prev)

{

current->next->prev=0;

//перенос начала списка па следующий подсписок

first=current->next;

}

//выключаемый подсписок - последний в списке

else if(!current->next)

{

current->prev->next=0;

//перенос конца списка на предыдущий подсписок

last=current->prev;

}

//выключаемый подсписок - внутри списка

else

{

current->prev->next=current->next;

current->next->prev=current->prev;

}

count_dsp--;//количество подсписков в списке уменьшаем на один

//количество элементов в списке уменьшаем на подсписок

if(current->type==Roll)

count_elem_sp-=((TRoll*)current)->count;

else count_elem_sp-=((TBike*)current)->count;

//освобождение памяти, занимаемой подсписком

link *pr;//указатель на предыдущий по отношению

//к текущему (current) элементу подсписка

while(current)

{

pr=current;

current=current->down;

delete pr;

}

MessageBox(NULL,"Подсписок удален!","",0);

return;

}

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

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

void list::clear()

{

if(is_empty)

{

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

return;

}

link *pr,*curr,*current=first;

int k;

while(current)

{

curr=current;

if(current->type==Roll) k=((TRoll*)current)->count;

else k=((TBike*)current)->count;

count_elem_sp-=k;

current=current->next;//переход на следующий подсписок

while(curr)

{

pr=curr;

curr=curr->down;

delete pr;

}

count_dsp--;

}

if(!count_dsp&&!count_elem_sp)

{

is_empty=true;

first=0;

last=0;

}

if(is_empty)

{

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

return;

}

}

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

Достаточно полную информацию для размещения остальных компонентов на форме и задания их свойств можно получить из представленных ниже рис.7.2, рис.7.3 и заголовочного файла модуля LR_7.

Рис.7.2 – форма по окончании проектирования

Рис.7.3 – дерево объектов

Заголовочный файл LR_7.h модуляLR_7

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

#ifndef LR_7H

#define LR_7H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Grids.hpp>

#include <ComCtrls.hpp>

#include <ExtCtrls.hpp>

#include "CSPIN.h"

#include <ActnList.hpp>

#include <ActnMan.hpp>

#include <ImgList.hpp>

#include <StdActns.hpp>

#include <ActnCtrls.hpp>

#include <ActnMenus.hpp>

#include <ToolWin.hpp>

#include <Dialogs.hpp>

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

class TForm1 : public TForm

{

__published: // IDE-managed Components

TStringGrid *StringGrid1;

TStatusBar *StatusBar1;

TGroupBox *GroupBox1;

TLabeledEdit *LabeledEdit1;

TLabeledEdit *LabeledEdit2;

TLabeledEdit *LabeledEdit3;

TRadioButton *RadioButton1;

TRadioButton *RadioButton2;

TCSpinEdit *CSpinEdit1;

TDateTimePicker *DateTimePicker1;

TButton *Button1;

TLabel *Label1;

TLabel *Label2;

TImageList *ImageList1;

TActionManager *ActionManager1;

TAction *FileSave1;

TAction *Add;

TAction *Del;

TAction *Clear_down;

TAction *Clear;

TAction *A_exit;

TActionMainMenuBar *ActionMainMenuBar1;

TAction *Out;

TSaveDialog *SaveDialog1;

TCheckBox *CheckBox1;

TAction *FileSaveAs1;

TAction *FileOpen1;

TActionToolBar *ActionToolBar2;

TActionToolBar *ActionToolBar1;

void __fastcall FormCreate(TObject *Sender);

void __fastcall RadioButton1Click(TObject *Sender);

void __fastcall RadioButton2Click(TObject *Sender);

void __fastcall AddExecute(TObject *Sender);

void __fastcall A_exitExecute(TObject *Sender);

void __fastcall OutExecute(TObject *Sender);

void __fastcall StringGrid1SelectCell(TObject *Sender, int ACol,

int ARow, bool &CanSelect);

void __fastcall DelExecute(TObject *Sender);

void __fastcall Clear_downExecute(TObject *Sender);

void __fastcall ClearExecute(TObject *Sender);

void __fastcall FileSave1Execute(TObject *Sender);

void __fastcall FileOpen1Execute(TObject *Sender);

void __fastcall FileSaveAs1Execute(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

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

extern PACKAGE TForm1 *Form1;

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

#endif

Перенесем на форму остальные компоненты и зададим их свойствам значения. Со страницы Стандарт- контрольный индикатор с флажкомCheckBox1(Captionдобавлять и удалять с выводом в таблицу,Checkedfalse), две радиокнопки –RadioButton1 (Caption-Велосипед, Checkedtrue,Enabled- true) иRadioButton2(Caption-Ролик. коньки, Checkedfalse, Enabled- true),GroupBox1 (CaptionВелосипед),Label1 (CaptionДата поступления),Label2 (CaptionКол-во скоростей),Button1(CaptionДобавить элемент), со страницыWin32– окно ввода дат и времениDateTimePicker1,StatusBar1,ImageList1, со страницыДополнительноLabeledEdit1(EditLabel->CaptionПроизводитель:),LabeledEdit2(EditLabel->CaptionКолеса (мм):), LabeledEdit3(EditLabel->CaptionВес (кг):), диспетчер действийActionManager1 и полосу главного менюActionMainMenuBar1,со страницыПримеры – CSpinEdit1, со страницыДиалогиSaveDialog1.

По умолчанию полоса главного меню расположится вверху, на всю ширину формы. Задайте её свойство Align = alNone, чтобы придать ей нужные размеры и расположить в нужном месте.

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