Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Выбор, размещение и задание свойств компонентов.




 Коды классов, функций и обработчиков событий

 

    Сохраните модуль главной формы под именем 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, чтобы придать ей нужные размеры и расположить в нужном месте.

 










Последнее изменение этой страницы: 2018-05-29; просмотров: 183.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...