From 0be2471e88df3386a3b1510a47f62a46eb722bfe Mon Sep 17 00:00:00 2001 From: sqdselo <147947144+sqdselo@users.noreply.github.com> Date: Sun, 31 Mar 2024 22:08:27 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20=E2=84=963?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 90 +++++++++ .../CarSharingService.cs | 59 ++++++ .../ICollectionGenericObjects.cs | 43 ++--- .../MassivGenericObjects.cs | 143 +++++++-------- .../FormCarCollection.Designer.cs | 173 ++++++++++++++++++ .../HoistingCrane/FormCarCollection.cs | 131 +++++++++++++ .../HoistingCrane/FormCarCollection.resx | 120 ++++++++++++ .../FormHoistingCrane.Designer.cs | 28 --- .../HoistingCrane/FormHoistingCrane.cs | 60 ++---- .../HoistingCrane/HoistingCrane.csproj | 4 + HoistingCrane/HoistingCrane/Program.cs | 3 +- Безымянный.png | Bin 0 -> 49159 bytes 12 files changed, 672 insertions(+), 182 deletions(-) create mode 100644 HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs create mode 100644 HoistingCrane/HoistingCrane/CollectionGenericObjects/CarSharingService.cs create mode 100644 HoistingCrane/HoistingCrane/FormCarCollection.Designer.cs create mode 100644 HoistingCrane/HoistingCrane/FormCarCollection.cs create mode 100644 HoistingCrane/HoistingCrane/FormCarCollection.resx create mode 100644 Безымянный.png diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs new file mode 100644 index 0000000..be9be73 --- /dev/null +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs @@ -0,0 +1,90 @@ +using HoistingCrane.Drawning; +using System; +namespace HoistingCrane.CollectionGenericObjects +{ + public abstract class AbstractCompany + { + /// + /// Ширина ячейки гаража + /// + protected readonly int _placeSizeWidth = 150; + /// + /// Высота ячейки гаража + /// + protected readonly int _placeSizeHeight = 90; + /// + /// Ширина окна + /// + protected readonly int pictureWidth; + /// + /// Высота окна + /// + protected readonly int pictureHeight; + /// + /// Коллекция автомобилей + /// + protected ICollectionGenericObjects? arr = null; + /// + /// Максимальное количество гаражей + /// + private int GetMaxCount + { + get + { + return (pictureWidth * pictureHeight) / (_placeSizeHeight * _placeSizeWidth); + } + } + public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects array) + { + pictureWidth = picWidth; + pictureHeight = picHeight; + arr = array; + arr.SetMaxCount = GetMaxCount; + } + + public static bool operator +(AbstractCompany company, DrawningTrackedVehicle car) + { + return company.arr?.Insert(car) ?? false; + } + public static bool operator -(AbstractCompany company, int position) + { + return company.arr?.Remove(position) ?? false; + } + + public DrawningTrackedVehicle? GetRandomObject() + { + Random rnd = new(); + return arr?.Get(rnd.Next(GetMaxCount)); + } + + /// + /// Вывод всей коллекции + /// + /// + public Bitmap? Show() + { + Bitmap bitmap = new(pictureWidth, pictureHeight); + Graphics graphics = Graphics.FromImage(bitmap); + DrawBackgound(graphics); + + SetObjectsPosition(); + for (int i = 0; i < (arr?.Count ?? 0); i++) + { + DrawningTrackedVehicle? obj = arr?.Get(i); + obj?.DrawTransport(graphics); + } + return bitmap; + } + + /// + /// Вывод заднего фона + /// + /// + protected abstract void DrawBackgound(Graphics g); + + /// + /// Расстановка объектов + /// + protected abstract void SetObjectsPosition(); + } +} diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/CarSharingService.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/CarSharingService.cs new file mode 100644 index 0000000..44f0e37 --- /dev/null +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/CarSharingService.cs @@ -0,0 +1,59 @@ +using HoistingCrane.Drawning; +using System; + +namespace HoistingCrane.CollectionGenericObjects +{ + public class CarSharingService : AbstractCompany + { + public CarSharingService(int picWidth, int picHeight, ICollectionGenericObjects array) : base(picWidth, picHeight, array) + { + } + + + protected override void DrawBackgound(Graphics g) + { + int width = pictureWidth / _placeSizeWidth; + int height = pictureHeight / _placeSizeHeight; + Pen pen = new(Color.Black, 3); + for (int i = 0; i < width; i++) + { + for (int j = 0; j < height + 1; ++j) + { + g.DrawLine(pen, i * _placeSizeWidth + 15, j * _placeSizeHeight, i * _placeSizeWidth + 15 + _placeSizeWidth - 55, j * _placeSizeHeight); + g.DrawLine(pen, i * _placeSizeWidth + 15, j * _placeSizeHeight, i * _placeSizeWidth + 15, j * _placeSizeHeight - _placeSizeHeight); + } + } + } + + protected override void SetObjectsPosition() + { + int countWidth = pictureWidth / _placeSizeWidth; + int countHeight = pictureHeight / _placeSizeHeight; + + int currentPosWidth = 0; + int currentPosHeight = 0; + + for (int i = 0; i < (arr?.Count ?? 0); i++) + { + if (arr?.Get(i) != null) + { + arr?.Get(i)?.SetPictureSize(pictureWidth, pictureHeight); + arr?.Get(i)?.SetPosition(_placeSizeWidth * currentPosWidth + 25, currentPosHeight * _placeSizeHeight + 15); + } + + if (currentPosWidth < countWidth-1) + currentPosWidth++; + else + { + currentPosWidth = 0; + currentPosHeight++; + } + if (currentPosHeight > countHeight - 1) + { + break; + } + + } + } + } +} diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs index 8930946..6187862 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -1,51 +1,36 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace HoistingCrane.CollectionGenericObjects { - internal interface ICollectionGenericObjects - where T : class + public interface ICollectionGenericObjects + where T: class { /// - /// Колличество объектов в коллекции + /// Кол-во объектов в коллекции /// int Count { get; } - /// - /// Максимальная вместимость коллекции("гаража") + /// Максимальное количество элементов /// int SetMaxCount { set; } - /// - /// Добавление элемента в коллекцию на свободную позицию + /// Добавление элемента в коллекцию /// - /// Добавляемый объект + /// /// bool Insert(T obj); - /// - /// Добавление элемента в коллекцию на конкретное место + /// Добавление элемента в коллекцию на определенную позицию /// - /// Добовляемый объект - /// Позиция объекта + /// + /// /// - bool Insert(T obj, int pos); - + bool Insert(T obj, int position); /// - /// Удаление конкретного элемента коллекции + /// Удаление элемента из коллекции по его позиции /// - /// Номер позиции + /// /// - bool Remove(int pos); - - /// - /// Получение элемента коллекции по индексу - /// - /// Индекс элемента - /// - T? Get(int pos); + bool Remove(int position); + T? Get(int position); } } diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs index 36373be..81b86a9 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs @@ -1,101 +1,94 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace HoistingCrane.CollectionGenericObjects { - internal class MassivGenericObjects : ICollectionGenericObjects - where T : class + public class MassivGenericObjects : ICollectionGenericObjects where T : class { - /// - /// Создание массива типа - /// - private T[] array; - - /// - /// Конструктор класса - /// + private T?[] arr; public MassivGenericObjects() { - array = Array.Empty(); + arr = Array.Empty(); } - - /// - /// Кол-во элементов массива - /// - public int Count => array.Length; - - public int SetMaxCount { set { if (value > 0) array = new T[value]; } } - - public T? Get(int pos) + public int Count { - return array[pos]; + get { return arr.Length; } + } + public int SetMaxCount + { + set + { + if (value > 0) + { + arr = new T?[value]; + } + } + } + public T? Get(int position) + { + if(position >= 0 && position < arr.Length) + { + return arr[position]; + } + return null; } - /// - /// Вставка элемента в свободную позицию(с начала) - /// - /// - /// public bool Insert(T obj) { for(int i = 0; i < Count; i++) { - if (array[i] == null) return true; - } - return false; - } - /// - /// Вставка элемента в конкретную позицию - /// - /// - /// - /// - /// - public bool Insert(T obj, int pos) - { - bool flag = false; - if (array[pos] == null) - { - array[pos] = obj; - return true; - } - if (array[pos] != null) - { - for(int i = pos; i < Count; i++) - { - if (array[i] == null) - { - flag = true; - array[i] = obj; - return true; - } - } - if(flag == false) - { - for(int i = pos; i > 0; i--) - { - if (array[i] == null) - { - array[i] = obj; - return true; - } - } + if (arr[i] == null) { + arr[i] = obj; + return true; } } return false; } - public bool Remove(int pos) + public bool Insert(T obj, int position) { - if (array[pos] != null) + // Проверка позиции + if (position < Count && position >= 0) { - return true; + if (arr[position] == null) + { + arr[position] = obj; + } + else + { + int flag = -1; + for (int i = position + 1; i < arr.Length; i++) + { + if (arr[i] == null) + { + flag = 1; + arr[i] = obj; + break; + } + } + if (flag == -1 && position != 0) + { + for (int i = position - 1; i >= 0; i--) + { + if (arr[i] == null) + { + arr[i] = obj; + break; + } + } + } + } } - return false; + return false; + } + + public bool Remove(int position) + { + if(position < 0 || position >= arr.Length || arr[position] == null) + { + return false; + } + arr[position] = null; + return true; } } } diff --git a/HoistingCrane/HoistingCrane/FormCarCollection.Designer.cs b/HoistingCrane/HoistingCrane/FormCarCollection.Designer.cs new file mode 100644 index 0000000..60eb2d0 --- /dev/null +++ b/HoistingCrane/HoistingCrane/FormCarCollection.Designer.cs @@ -0,0 +1,173 @@ +namespace HoistingCrane +{ + partial class FormCarCollection + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + groupBoxTools = new GroupBox(); + buttonGoToChek = new Button(); + buttonRefresh = new Button(); + buttonDeleteCar = new Button(); + maskedTextBox = new MaskedTextBox(); + comboBoxSelectorCompany = new ComboBox(); + buttonCreateTrackedVehicle = new Button(); + buttonCreateHoistingCrane = new Button(); + pictureBox = new PictureBox(); + groupBoxTools.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit(); + SuspendLayout(); + // + // groupBoxTools + // + groupBoxTools.Controls.Add(buttonGoToChek); + groupBoxTools.Controls.Add(buttonRefresh); + groupBoxTools.Controls.Add(buttonDeleteCar); + groupBoxTools.Controls.Add(maskedTextBox); + groupBoxTools.Controls.Add(comboBoxSelectorCompany); + groupBoxTools.Controls.Add(buttonCreateTrackedVehicle); + groupBoxTools.Controls.Add(buttonCreateHoistingCrane); + groupBoxTools.Dock = DockStyle.Right; + groupBoxTools.Location = new Point(716, 0); + groupBoxTools.Name = "groupBoxTools"; + groupBoxTools.Size = new Size(210, 450); + groupBoxTools.TabIndex = 0; + groupBoxTools.TabStop = false; + groupBoxTools.Text = "Инструменты"; + // + // buttonGoToChek + // + buttonGoToChek.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonGoToChek.Location = new Point(12, 298); + buttonGoToChek.Name = "buttonGoToChek"; + buttonGoToChek.Size = new Size(192, 34); + buttonGoToChek.TabIndex = 6; + buttonGoToChek.Text = "Передать на тесты"; + buttonGoToChek.UseVisualStyleBackColor = true; + buttonGoToChek.Click += buttonGoToChek_Click; + // + // buttonRefresh + // + buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonRefresh.Location = new Point(12, 375); + buttonRefresh.Name = "buttonRefresh"; + buttonRefresh.Size = new Size(192, 34); + buttonRefresh.TabIndex = 5; + buttonRefresh.Text = "Обновить"; + buttonRefresh.UseVisualStyleBackColor = true; + buttonRefresh.Click += buttonRefresh_Click; + // + // buttonDeleteCar + // + buttonDeleteCar.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonDeleteCar.Location = new Point(12, 233); + buttonDeleteCar.Name = "buttonDeleteCar"; + buttonDeleteCar.Size = new Size(192, 34); + buttonDeleteCar.TabIndex = 4; + buttonDeleteCar.Text = "Удалить автомобиль"; + buttonDeleteCar.UseVisualStyleBackColor = true; + buttonDeleteCar.Click += buttonDeleteCar_Click; + // + // maskedTextBox + // + maskedTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + maskedTextBox.Location = new Point(12, 204); + maskedTextBox.Mask = "00"; + maskedTextBox.Name = "maskedTextBox"; + maskedTextBox.Size = new Size(192, 23); + maskedTextBox.TabIndex = 3; + // + // comboBoxSelectorCompany + // + comboBoxSelectorCompany.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + comboBoxSelectorCompany.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxSelectorCompany.FormattingEnabled = true; + comboBoxSelectorCompany.Items.AddRange(new object[] { "Хранилище" }); + comboBoxSelectorCompany.Location = new Point(12, 28); + comboBoxSelectorCompany.Name = "comboBoxSelectorCompany"; + comboBoxSelectorCompany.Size = new Size(192, 23); + comboBoxSelectorCompany.TabIndex = 2; + comboBoxSelectorCompany.SelectedIndexChanged += comboBoxSelectorCompany_SelectedIndexChanged_1; + // + // buttonCreateTrackedVehicle + // + buttonCreateTrackedVehicle.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonCreateTrackedVehicle.Location = new Point(12, 129); + buttonCreateTrackedVehicle.Name = "buttonCreateTrackedVehicle"; + buttonCreateTrackedVehicle.Size = new Size(192, 34); + buttonCreateTrackedVehicle.TabIndex = 1; + buttonCreateTrackedVehicle.Text = "Добавить гусеничную машину"; + buttonCreateTrackedVehicle.UseVisualStyleBackColor = true; + buttonCreateTrackedVehicle.Click += buttonCreateTrackedVehicle_Click; + // + // buttonCreateHoistingCrane + // + buttonCreateHoistingCrane.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonCreateHoistingCrane.Location = new Point(12, 89); + buttonCreateHoistingCrane.Name = "buttonCreateHoistingCrane"; + buttonCreateHoistingCrane.Size = new Size(192, 34); + buttonCreateHoistingCrane.TabIndex = 0; + buttonCreateHoistingCrane.Text = "Добавить подъемный кран"; + buttonCreateHoistingCrane.UseVisualStyleBackColor = true; + buttonCreateHoistingCrane.Click += buttonCreateHoistingCrane_Click; + // + // pictureBox + // + pictureBox.Dock = DockStyle.Fill; + pictureBox.Location = new Point(0, 0); + pictureBox.Name = "pictureBox"; + pictureBox.Size = new Size(716, 450); + pictureBox.TabIndex = 1; + pictureBox.TabStop = false; + // + // FormCarCollection + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(926, 450); + Controls.Add(pictureBox); + Controls.Add(groupBoxTools); + Name = "FormCarCollection"; + Text = "FormCarCollections"; + groupBoxTools.ResumeLayout(false); + groupBoxTools.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); + ResumeLayout(false); + } + + #endregion + + private GroupBox groupBoxTools; + private Button buttonCreateHoistingCrane; + private Button buttonCreateTrackedVehicle; + private ComboBox comboBoxSelectorCompany; + private Button buttonRefresh; + private Button buttonDeleteCar; + private MaskedTextBox maskedTextBox; + private PictureBox pictureBox; + private Button buttonGoToChek; + } +} \ No newline at end of file diff --git a/HoistingCrane/HoistingCrane/FormCarCollection.cs b/HoistingCrane/HoistingCrane/FormCarCollection.cs new file mode 100644 index 0000000..5c6c1ad --- /dev/null +++ b/HoistingCrane/HoistingCrane/FormCarCollection.cs @@ -0,0 +1,131 @@ +using HoistingCrane.CollectionGenericObjects; +using HoistingCrane.Drawning; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace HoistingCrane +{ + public partial class FormCarCollection : Form + { + private AbstractCompany? _company; + public FormCarCollection() + { + InitializeComponent(); + } + + private void comboBoxSelectorCompany_SelectedIndexChanged_1(object sender, EventArgs e) + { + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new CarSharingService(pictureBox.Width, pictureBox.Height, new MassivGenericObjects()); + break; + } + } + + + private void CreateObject(string type) + { + DrawningTrackedVehicle drawning; + if (_company == null) return; + Random rand = new(); + switch (type) + { + + case nameof(DrawningHoistingCrane): + drawning = new DrawningHoistingCrane(rand.Next(100, 300), rand.Next(1000, 3000), GetColor(rand), GetColor(rand), true, true); + break; + + case nameof(DrawningTrackedVehicle): + drawning = new DrawningTrackedVehicle(rand.Next(100, 300), rand.Next(1000, 3000), GetColor(rand)); + break; + default: + return; + } + if (_company + drawning) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + } + else + { + MessageBox.Show("Не удалось добавить объект"); + } + } + + private static Color GetColor(Random random) + { + Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)); + ColorDialog dialog = new(); + if (dialog.ShowDialog() == DialogResult.OK) + { + color = dialog.Color; + } + return color; + } + + + + private void buttonCreateHoistingCrane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningHoistingCrane)); + + + private void buttonCreateTrackedVehicle_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningTrackedVehicle)); + + + private void buttonDeleteCar_Click(object sender, EventArgs e) + { + + if (string.IsNullOrEmpty(maskedTextBox.Text) || _company == null) + { + return; + } + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + int pos = Convert.ToInt32(maskedTextBox.Text); + if (_company - pos) + { + MessageBox.Show("Объект удален!"); + pictureBox.Image = _company.Show(); + } + else + { + MessageBox.Show("Не удалось удалить объект"); + } + } + + private void buttonRefresh_Click(object sender, EventArgs e) + { + if (_company == null) return; + pictureBox.Image = _company.Show(); + } + + private void buttonGoToChek_Click(object sender, EventArgs e) + { + if (_company == null) return; + DrawningTrackedVehicle? car = null; + int count = 100; + while (car == null) + { + car = _company.GetRandomObject(); + count--; + if (count <= 0) break; + } + if (car == null) return; + FormHoistingCrane form = new() + { + SetCar = car + }; + form.ShowDialog(); + + } + } +} diff --git a/HoistingCrane/HoistingCrane/FormCarCollection.resx b/HoistingCrane/HoistingCrane/FormCarCollection.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/HoistingCrane/HoistingCrane/FormCarCollection.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/HoistingCrane/HoistingCrane/FormHoistingCrane.Designer.cs b/HoistingCrane/HoistingCrane/FormHoistingCrane.Designer.cs index a809bd5..e62154f 100644 --- a/HoistingCrane/HoistingCrane/FormHoistingCrane.Designer.cs +++ b/HoistingCrane/HoistingCrane/FormHoistingCrane.Designer.cs @@ -21,12 +21,10 @@ namespace HoistingCrane private void InitializeComponent() { pictureBoxHoistingCrane = new PictureBox(); - buttonCreateHoistingCrane = new Button(); ButtonLeft = new Button(); ButtonRight = new Button(); ButtonUp = new Button(); ButtonDown = new Button(); - buttonCreateTrackedVehicle = new Button(); comboStrategy = new ComboBox(); buttonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxHoistingCrane).BeginInit(); @@ -41,17 +39,6 @@ namespace HoistingCrane pictureBoxHoistingCrane.TabIndex = 0; pictureBoxHoistingCrane.TabStop = false; // - // buttonCreateHoistingCrane - // - buttonCreateHoistingCrane.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreateHoistingCrane.Location = new Point(0, 492); - buttonCreateHoistingCrane.Name = "buttonCreateHoistingCrane"; - buttonCreateHoistingCrane.Size = new Size(188, 23); - buttonCreateHoistingCrane.TabIndex = 1; - buttonCreateHoistingCrane.Text = "Создать подъемный кран"; - buttonCreateHoistingCrane.UseVisualStyleBackColor = true; - buttonCreateHoistingCrane.Click += ButtonCreateHoistingCrane_Click; - // // ButtonLeft // ButtonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; @@ -100,17 +87,6 @@ namespace HoistingCrane ButtonDown.UseVisualStyleBackColor = true; ButtonDown.Click += ButtonMove_Click; // - // buttonCreateTrackedVehicle - // - buttonCreateTrackedVehicle.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreateTrackedVehicle.Location = new Point(203, 492); - buttonCreateTrackedVehicle.Name = "buttonCreateTrackedVehicle"; - buttonCreateTrackedVehicle.Size = new Size(194, 23); - buttonCreateTrackedVehicle.TabIndex = 6; - buttonCreateTrackedVehicle.Text = "Создать гусеничную машину"; - buttonCreateTrackedVehicle.UseVisualStyleBackColor = true; - buttonCreateTrackedVehicle.Click += buttonCreateTrackedVehicle_Click; - // // comboStrategy // comboStrategy.DropDownStyle = ComboBoxStyle.DropDownList; @@ -138,12 +114,10 @@ namespace HoistingCrane ClientSize = new Size(818, 515); Controls.Add(buttonStrategyStep); Controls.Add(comboStrategy); - Controls.Add(buttonCreateTrackedVehicle); Controls.Add(ButtonDown); Controls.Add(ButtonUp); Controls.Add(ButtonRight); Controls.Add(ButtonLeft); - Controls.Add(buttonCreateHoistingCrane); Controls.Add(pictureBoxHoistingCrane); Name = "FormHoistingCrane"; Text = "Подъемный кран"; @@ -154,12 +128,10 @@ namespace HoistingCrane // #endregion private PictureBox pictureBoxHoistingCrane; - private Button buttonCreateHoistingCrane; private Button ButtonLeft; private Button ButtonRight; private Button ButtonUp; private Button ButtonDown; - private Button buttonCreateTrackedVehicle; private ComboBox comboStrategy; private Button buttonStrategyStep; } diff --git a/HoistingCrane/HoistingCrane/FormHoistingCrane.cs b/HoistingCrane/HoistingCrane/FormHoistingCrane.cs index a0f03af..540a335 100644 --- a/HoistingCrane/HoistingCrane/FormHoistingCrane.cs +++ b/HoistingCrane/HoistingCrane/FormHoistingCrane.cs @@ -13,6 +13,17 @@ namespace HoistingCrane InitializeComponent(); _abstractStrategy = null; } + + public DrawningTrackedVehicle? SetCar + { + set + { + _drawning = value; + _drawning?.SetPictureSize(pictureBoxHoistingCrane.Width, pictureBoxHoistingCrane.Height); + comboStrategy.Enabled = true; + Draw(); + } + } private void Draw() { @@ -22,55 +33,6 @@ namespace HoistingCrane pictureBoxHoistingCrane.Image = bmp; } - - /// - /// Создать подъемный кран - /// - /// - /// - private void ButtonCreateHoistingCrane_Click(object sender, EventArgs e) - { - CreateObject(nameof(DrawningHoistingCrane)); - } - - - /// - /// Создать бронебойную машину - /// - /// - /// - private void buttonCreateTrackedVehicle_Click(object sender, EventArgs e) - { - CreateObject(nameof(DrawningTrackedVehicle)); - } - - - private void CreateObject(string type) - { - Random rand = new(); - switch (type) - { - - case nameof(DrawningHoistingCrane): - _drawning = new DrawningHoistingCrane(rand.Next(100, 300), rand.Next(1000, 3000), Color.FromArgb(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 256)), - Color.FromArgb(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 256)), true, true); - break; - - case nameof(DrawningTrackedVehicle): - _drawning = new DrawningTrackedVehicle(rand.Next(100, 300), rand.Next(1000, 3000), Color.FromArgb(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 256))); - break; - default: - return; - - } - _drawning.SetPictureSize(pictureBoxHoistingCrane.Width, pictureBoxHoistingCrane.Height); - _drawning.SetPosition(rand.Next(0, 100), rand.Next(0, 100)); - - comboStrategy.Enabled = true; - Draw(); - } - - private void ButtonMove_Click(object sender, EventArgs e) { if (_drawning == null) { return; } diff --git a/HoistingCrane/HoistingCrane/HoistingCrane.csproj b/HoistingCrane/HoistingCrane/HoistingCrane.csproj index 244387d..69ac652 100644 --- a/HoistingCrane/HoistingCrane/HoistingCrane.csproj +++ b/HoistingCrane/HoistingCrane/HoistingCrane.csproj @@ -8,6 +8,10 @@ enable + + + + True diff --git a/HoistingCrane/HoistingCrane/Program.cs b/HoistingCrane/HoistingCrane/Program.cs index fbb985e..79d96ff 100644 --- a/HoistingCrane/HoistingCrane/Program.cs +++ b/HoistingCrane/HoistingCrane/Program.cs @@ -11,7 +11,8 @@ namespace HoistingCrane // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormHoistingCrane()); + Application.Run(new FormCarCollection()); + } } } \ No newline at end of file diff --git a/Безымянный.png b/Безымянный.png new file mode 100644 index 0000000000000000000000000000000000000000..148b1a604d9f30a04fc36529654039d50dc70a43 GIT binary patch literal 49159 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 YXP#zVS-N8h_=XS$Pgg&ebxsLQ06YcjD*ylh literal 0 HcmV?d00001