- •Введение к заданиям Основные термины, используемые в дисциплинах
- •Объекты, классы и язык uml
- •Цели задачи заданий
- •Требования к выполнению заданий
- •Оформление результатов
- •4. Содержание разделов пояснительной записки
- •5. Оформление результатов
- •Список литературы
- •Приложение 1. Пример оформления результатов
- •Содержание
- •5.1. Первый этап. Разработка компонента Warehouse
- •5.2. Второй этап. Разработка компонентов ContrlRegion и Lorry
- •5.3. Третий этап. Разработка приложения csLorryAndWarehouse
- •1. Задание
- •Уточнение задания
- •3. Описание разрабатываемой программы с точки зрения пользователя
- •4. Описание разрабатываемой программы с точки зрения программиста
- •4.1. Объектное представление программы
- •4.2. События, потоки и ресурсы
- •5. Поэтапная разработка программы
- •5.1. Первый этап. Разработка компонента Warehouse
- •5.2. Второй этап. Разработка компонентов ContrlRegion и Lorry
- •5.3. Третий этап. Разработка приложения csLorryAndWarehouse
- •6. Описание проблем, возникших при разработке программной системы.
- •7. Список используемой литературы
- •10. Разработка многокомпонентной программы с удалённым объектом
- •10.1. Удалённый компонент RemObj
- •10.2. Сервер csLorryAndWarhousesServer
- •10.3. Клиент csLorryAndWarhousesClient
5.3. Третий этап. Разработка приложения csLorryAndWarehouse
Прикладное окно должно включать требуемые управляющие элементы, а программа – объект контейнера, позволяющий включить произвольное количество объектов компонента Lorry и выполнить над этими объектами необходимые операции.
Диаграмма классов приложения csLorryAndWarehouse изображена на следующем рисунке
Рис. Диаграмма классов приложения csLorryAndWarehouse
Приложение csLorryAndWarehouse.
///////////////
// C#
// Приложение с компонентами Lorry, Warehouse и с управляющими
// элементами
//
using System;
using System.ComponentModel;
using System.Collections;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using csLorryDll;
using csWarehouseDll;
using csContrlRegionDll;
namespace csLorryAndWarehouse
{
// Интерфейс контейнера грузовиков
interface ILorryContainer
{
void AddLorry ( );
void RemoveLorry (int carrNumber);
void RemoveAllLorriers ( );
ArrayList GetNumLorriers ( );
void RunLorriers ( );
void StopLorriers ( );
}
// Контейнер грузовиков
class LorryContainer: Container, ILorryContainer
{
Warehouse leftWH; // Ссылки на объект левого склада
Warehouse rightWH; // Ссылки на объект правого склада
Lorry lorry; // Ссылки на объект грузовика
ContrlRegion region; // Ссылка на объект зоны контроля
bool leftRight; // Признак направления перемещения грузовиков
int numLorry= 0; // Номер грузовика
int Y; // Координата Y пути грузовика
Random rand; // Ссылка на случайное число
// Конструктор
public LorryContainer (Warehouse leftWH, Warehouse rightWH,
ContrlRegion region)
{
this.leftWH= leftWH; this.rightWH= rightWH;
this.region= region;
Y= 20; rand= new Random ( );
leftRight= true;
leftWH.evFromWarehouse += new DelEvFromWarehouse
(this.EvFromWarehouseHandler);
rightWH.evFromWarehouse += new DelEvFromWarehouse
(this.EvFromWarehouseHandler);
}
// Добавить грузовик
public void AddLorry ( )
{
numLorry++;
Y += 20;
int dX = rand.Next (5, 10);
if (leftRight) dX= dX;
else dX= -dX;
lorry= new Lorry (numLorry, Y, dX, leftWH, rightWH,
region);
this.Add (lorry);
lorry.Start ( );
}
// Удалить грузовик
public void RemoveLorry (int lorryNumber)
{
IEnumerator inum= this.Components.GetEnumerator ( );
while (inum.MoveNext ( ))
{ Lorry comp= (Lorry) inum.Current;
if (comp.Number == lorryNumber)
{ comp.Finish ( );
this.Remove (comp);
return;
}
}
}
// Получить список номеров грузовиков
public ArrayList GetNumLorriers ( )
{
ArrayList arList= new ArrayList ( );
IEnumerator inum= this.Components.GetEnumerator ( );
while (inum.MoveNext ( ))
{
Lorry comp= (Lorry) inum.Current;
arList.Add (comp.Number);
}
return arList;
}
// Возобновить движение грузовиков
public void RunLorriers ( )
{
IEnumerator inum= this.Components.GetEnumerator ( );
while (inum.MoveNext ( ))
{ Lorry comp= (Lorry) inum.Current;
comp.Run ( );
}
}
// Приостановить движение грузовиков
public void StopLorriers ( )
{
IEnumerator inum= this.Components.GetEnumerator ( );
while (inum.MoveNext ( ))
{ Lorry comp= (Lorry) inum.Current;
comp.Stop ( );
}
}
// Удалить все грузовики
public void RemoveAllLorriers ( )
{
IEnumerator inum= this.Components.GetEnumerator ( );
while (inum.MoveNext ( ))
{
Lorry comp= (Lorry) inum.Current;
comp.Finish ( );
this.Remove (comp);
}
}
// Выдать номера грузовиков на консоль
public void ShowComponents ( )
{
IEnumerator inum= this.Components.GetEnumerator ( );
while (inum.MoveNext ( ))
{
Lorry comp= (Lorry) inum.Current;
Console.WriteLine ("компонент номер " +
comp.Number.ToString ( ));
}
}
// обработать событие склада
public void EvFromWarehouseHandler (object sender,
WarehouseEventArgs args)
{
// Выявить направление перемещения грузовиков
if( (args.Left && args.Full)||
(!args.Left && !args.Full))
leftRight= true; // Левый склад полный
// или правый склад -пустой
if ((args.Left && !args.Full)||
(!args.Left && args.Full))
leftRight= false; // Правый склад полный
// или левый склад –пустой
// Изменить направление движения грузовиков
IEnumerator inum= this.Components.GetEnumerator ( );
while (inum.MoveNext ( ))
{
Lorry comp= (Lorry) inum.Current;
comp.LeftRight= leftRight;
}
}
}
//-------------------------
class LorryAndWarhouses: Form
{
Warehouse leftWH; // Ссылки на объект левого склада
Warehouse rightWH; // Ссылки на объект правого склада
ContrlRegion region; // Ссылка на объект зоны контроля
Thread thread; // Ссылка но объект потока перерисовки
bool life; // Признак жизни потока перерисовки
Button butRun, butStop; // Ссылки на интерфейсные кнопки
Button butAdd, butDel; // Ссылки на интерфейсные кнопки
ListBox listBox; // Список номеров грузовиков
LorryContainer lorryCont;// Ссылка на контейнер грузовиков
// Конструктор
LorryAndWarhouses ( )
{
this.Text= "Test";
this.ClientSize= new Size (350, 130);
// Создать кнопки
butRun= new Button ( ); // Создать кнопку пуска
butRun.Location= new Point (240,5);
butRun.Size= new Size (45, 20);
butRun.Text= "Run";
butRun.BackColor= Color.LightGray;
butRun.Click += new EventHandler (But_Run);
this.Controls.Add (butRun);
//-----
butStop= new Button ( ); // Создать кнопку останова
butStop.Location= new Point (290,5);
butStop.Size= new Size (45, 20);
butStop.Text= "Stop";
butStop.BackColor= Color.LightGray;
butStop.Click += new EventHandler (But_Stop);
this.Controls.Add (butStop);
//-----
butAdd= new Button ( ); // Создать кнопку добавления butAdd.Location= new Point (240,30);
butAdd.Size= new Size (65, 20);
butAdd.Text= "Добавить";
butAdd.BackColor= Color.LightGray;
butAdd.Click += new EventHandler (But_Add);
this.Controls.Add (butAdd);
butDel= new Button ( ); // Создать кнопку удаления butDel.Location= new Point (240,60);
butDel.Size= new Size (65, 20);
butDel.Text= "Удалить";
butDel.BackColor= Color.LightGray;
butDel.Click += new EventHandler (But_Del);
this.Controls.Add (butDel);
listBox= new ListBox ( ); // Создать элемент списка
listBox.Location= new Point (240, 90);
listBox.Size= new System.Drawing.Size (60, 20);
this.Controls.Add (listBox);
// Создать склады
// Создать объект левого склада
leftWH= new Warehouse (true, true);
leftWH.Location= new Point (10, 10);
leftWH.Size= new Size (30, 100);
leftWH.BackColor= Color.White;
this.Controls.Add (leftWH);
leftWH.Show ( );
// Создать объект правого склада
rightWH= new Warehouse (false, false);
rightWH.Location= new Point (200, 10);
rightWH.Size= new Size (30, 100);
rightWH.BackColor= Color.White;
this.Controls.Add (rightWH);
rightWH.Show ( );
// Создать область контроля
region= new ContrlRegion ( );
region.Location= new Point (100, 0);
region.Size= new Size (40, ClientSize.Height);
region.BackColor= Color.LightSkyBlue;
this.Controls.Add (region);
region.Show ( );
// Создать объект контейнера компонентов
lorryCont= new LorryContainer (leftWH, rightWH, region); // Создать поток перерисовки и запустить его
life= true;
thread= new Thread (new ThreadStart (ThrPaint));
thread.Start();
}
// Обработать нажатие кнопки пуска
private void But_Run (object o, EventArgs e)
{lorryCont.RunLorriers ( );}
// Обработать нажатие кнопки останова
private void But_Stop (object o, EventArgs e )
{lorryCont.StopLorriers ( );}
// Обработать нажатие кнопки добавления грузовика
private void But_Add (object o, EventArgs e)
{
lorryCont.AddLorry ( );
lorryCont.ShowComponents ( );
ArrayList aL= new ArrayList ( );
aL= lorryCont.GetNumLorriers( );
listBox.Items.Clear ( );
for (int i= 0; i < aL.Count; i++)
listBox.Items.Add (aL[i]);
}
// Обработать нажатие кнопки удаления грузовика
private void But_Del (object o, EventArgs e )
{
if (listBox.SelectedIndex == -1)
{
MessageBox.Show
("Выберете номер удаляемого грузовика в"
+ "\nэлементе списка перед нажатием кнопки");
}
else
{ int numSel= (int) listBox.SelectedItem;
listBox.Items.Remove (numSel);
lorryCont.RemoveLorry (numSel);
ArrayList aL= new ArrayList ( );
aL= lorryCont.GetNumLorriers ( );
listBox.Items.Clear ( );
for (int i= 0; i < aL.Count; i++)
listBox.Items.Add (aL[i]);
lorryCont.ShowComponents ( );
}
}
// Потоковая функция перерисовки
private void ThrPaint ( )
{
while (life)
{ Invalidate ( );
Thread.Sleep (150);
}
}
// Завершить поток перерисовки
public void Finish ( )
{
life= false; thread.Join ( );
}
// Обработать кнопку закрытия окна
protected override void OnClosed (EventArgs e)
{
base.OnClosed (e);
lorryCont.RemoveAllLorriers ( );
Finish ( );
}
// Перерисовать область клиента прикладного окна
protected override void OnPaint (PaintEventArgs e)
{
base.OnPaint (e);
IEnumerator inum= lorryCont.Components.GetEnumerator ( );
while (inum.MoveNext ( ))
{ Lorry comp= (Lorry) inum.Current;
e.Graphics.DrawEllipse (new Pen(Color.Blue, 2),
comp.Point.X - 10, comp.Point.Y - 10, 20, 20);
e.Graphics.DrawString (comp.Number.ToString ( ), Font,
new SolidBrush (Color.Blue), comp.Point.X + 10,
comp.Point.Y + 10); }
}
// Основная функция
static void Main ( )
{Application.Run (new LorryAndWarhouses ( ));}
}
}
Рис. Прикладное и консольное окна программы csLorryAndWarehouse
