|
Приложение 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
![]() ![]() ЧТО И КАК ПИСАЛИ О МОДЕ В ЖУРНАЛАХ НАЧАЛА XX ВЕКА Первый номер журнала «Аполлон» за 1909 г. начинался, по сути, с программного заявления редакции журнала... ![]() ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры... ![]() Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам... ![]() Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|