Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

4IorryAndWa rho uses()

-But_Run()

-But_Stop()

-But Add()

-BufDel()

-ThrPaint()

#OnPeint()

+EvFromWarehouseHandlerfl)

4Main()

+Finish()

#OnClos8d()

^ o Form

•^ *Warehnu8e1

« use »

^l +ContrlReqion 1

^ *Button I

*j *LlstBox~|

$\ +ArravList~^~

^l +Random I

>UAnnlicatlon I

~^i +Lorrv^

Рнс. 11.4.3.1. Диаграмма классов приложения csLorryAndWarehousc

Класс LorryAndWarehouse прикладного окна кроме объектов leftWH и

rightWH складов, объекта region зоны контроля, объекта thread потока, при-

сутствующих в классе TestLorry прикладного окна приложения csTestLorry

предыдущего раздела 11.4.2, содержит объекты butRun, butStop, butAdd, but-

Del кнопок, объект listBox списка номеров грузовиков и объект aL списка

объектов грузовиков.

При нажатии на кнопку butAdd создаётся очередной объект типа Lorry,

он включается в список aL типа ArrayList, а его номер включается в список

listBox типа ListBox. Затем запускается поток созданного объекта, обеспечи-

вающий его перемещение.

Если выбрать в списке listBox, представленном в прикладном окне, но-

мер грузовика и нажать на кнопку butDel, то этот объект будет удалён из aL. и

listBox и уничтожен.

Нажатие на кнопки butStop и butRun вызывает соответственно приоста-

новку движения всех грузовиков или возобновление их движения.

В классе LorryAndWarehouse прикладного окна описан обработчик

EvFromWarehouseHandler() события склада. Реагируя на переполнение или

опустошение складов, обработчик меняет направление перевозки rpys

пользовавшись переменной leftRight и свойством LeftRight объектов

Lorry.

Программа приложения csLorryAndWarehouse представлена в ре 11.4.3.1.

Пример 11.4.3.1. ПриложениесяЬоггуА^УУагеЬонзе.

///////////////

/7 C # File csLorryAndWarehouse к л а с с LorryAndWarhouses

using System;;

using System.Col!ections;

using System.Drawing;

using System.Threading;

using System.Windows.Forms;

using csLorryDff;

using csWarehouseDH;

using csContrlRegionDll;

namespace csLorryAndWarehouse

{

class LorryAndWarhouses: Form

{

Lorry lorry; // Ссылки на объект грузовика

Warehouse leftWH; // Ссылки на объектлевого склада

Warehouse rightWH; // Ссылки на объект правого склада

ContrlRegion region; // Ссылка на объектзоны контроля

Thread thread; // Ссылка на объект потока перерисовки

bool life; // Признак жизни потока перерисовки

Button butRun, butStop; // Ссылки на интерфейсные кнопки

Button butAdd, butDel; // Ссылки на интерфейсные кнопки

ListBox iistBox; // Список номеров грузовиков

int numLorry= 0; // Номер грузовика

Int y; // Координата y пути грузовика

Random rand; // Ссылка на случайное число

ArrayUst aL; // Ссылка на список объектов грузовиков

bool leftRight; Ц Признак направления перемещения грузовиков

П Конструктор

LorryAndWarhouses ( )

{

this.Text= "Test";

this.ClientSize= new Size (350, 130);

aL= new ArrayList ( );

rand= new Random ( );

leftRlght= true;

// Создать кнопки

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.Locatlon= new Polnt (290,5);

butStop.Size= new Size (45, 20);

butStop.Text= "Stop";

butStop. BackColor= Color. Llg htGray;

butStop.Click += new EventHandler (But_Stop);

this.Controls.Add (butStop);

/ / - —

butAdd= new Button ( ); // Создать кнопку добавления

butAdd.Location= new Point (240,30);

butAdd.Slze= 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. Lig htGray;

butDel.Cllck += 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 (llstBox);

// Создать склады

// Создать объект левого склада

leftWH= new Warehouse (true, true);

leftWH,Location= new Point (10, 10);

leftWH.Size= new Size (30, 100);

leftWH,BackColor= Color.White;

leftWH.evFromWarehouse+= new DelEvFromWarehouse

(EvFromWarehouseHandler);

this.Controls.Add (leftWH);

leftWH.Show ( );

// Создать объект правого склада

rlghtWH= 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.evFromWarehouse+= new DelEvFromWarehouse

(EvFromWarehouseHandler);

rlghtWH.Show ();

// Создать область контроля

reglon= new ContrlRegion ();

region.Location= new Point (100, 0);

reglon.Size= new Slze (40, CllentSize.Height);

region.BackColor= Color.green;

this.Controls.Add (region);

region.Show ();

// Создать поток перерисовки и запустить его

life= true;

thread= new Thread (new ThreadStart (ThrPaint));

thread.Start();

>

// Обработать нажатие кнопки пуска

private void But_Run (object о, EventArgs e)

{

IEnumerator inum= aL.GetEnumerator ( );

<wh ile (inum.MoveNext ( ) )

Lorry lorry= (Lorry) inum.Current;

lorry.Run ( );

>

>

// Обработать нажатие кнопки останова

private void But_Stop (object о, EventArgs e )

{

IEnumerator inum= aL.GetEnumerator ( );

while (inum.MoveNext ())

i

Lorry lorry= (Lorry) inum.Current;

lorry.Stop ( );

>

>

// Обработать нажатие кнопки добавления грузовика

private void But_Add (object о, EventArgs e)

{

numLorry++;

Y += 20;

int dX = rand.Next (5, 10);

if (leftRight) dX= dX;

else dX= -dX;

lorry= new Lorry (numLorry, Y, dX,

leftWH, rlghtWH, region);

aL.Add (lorry);

listBox.Items.Add (lorry.Number);

>

// Обработать нажатие кнопки удаления грузовика

private void But_Del (object о, EventArgs e )

<

if(listBox.SelectedIndex == - l )

{

MessageBox.Show

("Выберете номер удаляемого грузовика в"

+ "\пэлементе списка перед нажатием кнопки"); >

else

{

int numSel= (int) listBox.SelectedItem;

listBox.Items.Remove (numSel);

IEnumerator inum= aL.GetEnumerator ( );

while (inum.MoveNext ( ))

t

Lorry lorry= (Lorry) inum.Current;

if (lorry.Number == numSel)

{

lorry.Flnish();

aL.Remove (lorry);

listBox.Items.Remove (iorry.NumDer);

return;

>

>

>

>

// Потоковая функция перерисовки

private void ThrPaint ( )

{

while (llfe)

{