Выбор, размещение и задание свойств компонентов.
Коды классов, функций и обработчиков событий
Сохраните модуль главной формы под именем 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&¤t->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&¤t->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&¤t->prev)
{
last=current->prev;//переносим конец списка на предыдущий элемент
last->next=0;
delete current; //удаление единственного элемента в подсписке
count_dsp--; //количество подсписков в списке уменьшаем на один
count_elem_sp--; //количество элементов в списке уменьшаем на один
MessageBox(NULL,"Элемент удален!","",0);
return;
}
//удаляемый элемент - в одноэлементном подсписке
//внутри основной части списка
if(f1&&!current->down&¤t->next&¤t->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&¤t==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&¤t->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 – добавлять и удалять с выводом в таблицу, Checked – false), две радиокнопки – RadioButton1(Caption - Велосипед,Checked – true, Enabled - true) и RadioButton2 (Caption - Ролик. коньки,Checked – false,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, чтобы придать ей нужные размеры и расположить в нужном месте.
Дата добавления: 2018-05-13; просмотров: 345; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!