Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Выбор, размещение и задание свойств компонентов.
Коды классов, функций и обработчиков событий
Сохраните модуль главной формы под именем 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 – дерево объектов
//--------------------------------------------------------------------------- #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-29; просмотров: 183. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |