Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Приложение 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

 

 









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.