From dc01587054cbf262acab4191584e399af66b4d25 Mon Sep 17 00:00:00 2001 From: Danila Date: Mon, 1 Apr 2024 14:05:34 +0400 Subject: [PATCH 1/9] =?UTF-8?q?=D0=98=D1=82=D0=BE=D0=B3=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 9 ++++---- .../CollectionGenericObjects/Garage.cs | 3 --- .../ICollectionGenericObjects.cs | 7 +++--- .../MassivGenericObjects.cs | 22 +++++++++---------- .../HoistingCrane/FormCarCollection.cs | 14 ++---------- 5 files changed, 20 insertions(+), 35 deletions(-) diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs index be9be73..b7dbbee 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs @@ -1,5 +1,4 @@ using HoistingCrane.Drawning; -using System; namespace HoistingCrane.CollectionGenericObjects { public abstract class AbstractCompany @@ -42,13 +41,13 @@ namespace HoistingCrane.CollectionGenericObjects arr.SetMaxCount = GetMaxCount; } - public static bool operator +(AbstractCompany company, DrawningTrackedVehicle car) + public static int operator +(AbstractCompany company, DrawningTrackedVehicle car) { - return company.arr?.Insert(car) ?? false; + return company.arr?.Insert(car) ?? 0; } - public static bool operator -(AbstractCompany company, int position) + public static DrawningTrackedVehicle operator -(AbstractCompany company, int position) { - return company.arr?.Remove(position) ?? false; + return company.arr?.Remove(position); } public DrawningTrackedVehicle? GetRandomObject() diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs index e2da629..3aedcb2 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs @@ -1,7 +1,4 @@ using HoistingCrane.Drawning; -using System; -using System.Collections.Specialized; - namespace HoistingCrane.CollectionGenericObjects { public class Garage : AbstractCompany diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs index 6187862..5182f15 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -1,5 +1,4 @@ -using System; -namespace HoistingCrane.CollectionGenericObjects +namespace HoistingCrane.CollectionGenericObjects { public interface ICollectionGenericObjects where T: class @@ -17,7 +16,7 @@ namespace HoistingCrane.CollectionGenericObjects /// /// /// - bool Insert(T obj); + int Insert(T obj); /// /// Добавление элемента в коллекцию на определенную позицию /// @@ -30,7 +29,7 @@ namespace HoistingCrane.CollectionGenericObjects /// /// /// - bool Remove(int position); + T? Remove(int position); T? Get(int position); } } diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs index 81b86a9..ac0d22a 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs @@ -1,5 +1,4 @@ -using System; -namespace HoistingCrane.CollectionGenericObjects +namespace HoistingCrane.CollectionGenericObjects { public class MassivGenericObjects : ICollectionGenericObjects where T : class { @@ -31,16 +30,16 @@ namespace HoistingCrane.CollectionGenericObjects return null; } - public bool Insert(T obj) + public int Insert(T obj) { for(int i = 0; i < Count; i++) { if (arr[i] == null) { - arr[i] = obj; - return true; + Insert(obj,i); + return 1; } } - return false; + return 0; } public bool Insert(T obj, int position) @@ -81,14 +80,15 @@ namespace HoistingCrane.CollectionGenericObjects return false; } - public bool Remove(int position) + public T? Remove(int position) { - if(position < 0 || position >= arr.Length || arr[position] == null) + if(position >= 0 && position < Count) { - return false; + arr[position] = null; + return arr[position]; } - arr[position] = null; - return true; + return arr[position]; } + } } diff --git a/HoistingCrane/HoistingCrane/FormCarCollection.cs b/HoistingCrane/HoistingCrane/FormCarCollection.cs index 7175e29..6c6c042 100644 --- a/HoistingCrane/HoistingCrane/FormCarCollection.cs +++ b/HoistingCrane/HoistingCrane/FormCarCollection.cs @@ -1,15 +1,5 @@ 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 @@ -49,7 +39,7 @@ namespace HoistingCrane default: return; } - if (_company + drawning) + if ((_company + drawning) == 1) { MessageBox.Show("Объект добавлен"); pictureBox.Image = _company.Show(); @@ -91,7 +81,7 @@ namespace HoistingCrane return; } int pos = Convert.ToInt32(maskedTextBox.Text); - if (_company - pos) + if ((_company - pos) == null) { MessageBox.Show("Объект удален!"); pictureBox.Image = _company.Show(); From 681e60fbd6355a94acf216c2be031016117dff19 Mon Sep 17 00:00:00 2001 From: sqdselo <147947144+sqdselo@users.noreply.github.com> Date: Mon, 1 Apr 2024 18:26:17 +0400 Subject: [PATCH 2/9] =?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=BA=D0=B0=20#3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 6 +- .../ICollectionGenericObjects.cs | 4 +- .../MassivGenericObjects.cs | 69 ++++++++----------- .../HoistingCrane/FormCarCollection.cs | 7 +- .../MovementStrategy/AbstractStrategy.cs | 2 - .../MovementStrategy/MoveToBorder.cs | 5 +- 6 files changed, 39 insertions(+), 54 deletions(-) diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs index b7dbbee..45ca30e 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs @@ -41,13 +41,13 @@ namespace HoistingCrane.CollectionGenericObjects arr.SetMaxCount = GetMaxCount; } - public static int operator +(AbstractCompany company, DrawningTrackedVehicle car) + public static DrawningTrackedVehicle operator +(AbstractCompany company, DrawningTrackedVehicle car) { - return company.arr?.Insert(car) ?? 0; + return company.arr?.Insert(car) ?? null; } public static DrawningTrackedVehicle operator -(AbstractCompany company, int position) { - return company.arr?.Remove(position); + return company.arr?.Remove(position) ?? null; } public DrawningTrackedVehicle? GetRandomObject() diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs index 5182f15..ce4dbb0 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -16,14 +16,14 @@ /// /// /// - int Insert(T obj); + T? Insert(T obj); /// /// Добавление элемента в коллекцию на определенную позицию /// /// /// /// - bool Insert(T obj, int position); + T? Insert(T obj, int position); /// /// Удаление элемента из коллекции по его позиции /// diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs index ac0d22a..0fcf4a2 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs @@ -30,65 +30,54 @@ return null; } - public int Insert(T obj) + public T? Insert(T obj) { - for(int i = 0; i < Count; i++) + for (int i = 0; i < Count; i++) { - if (arr[i] == null) { - Insert(obj,i); - return 1; - } + if (arr[i] == null) + { + return Insert(obj, 0); + } } - return 0; + return null; } - public bool Insert(T obj, int position) + public T? Insert(T obj, int position) { - // Проверка позиции - if (position < Count && position >= 0) + //todo Проверка позиции + if (position < 0 || position > Count) { - if (arr[position] == null) + return null; + } + + if (arr[position] == null) + { + arr[position] = obj; + return arr[position]; + } + else + { + if (Insert(obj, position + 1) != null) { - arr[position] = obj; + return arr[position + 1]; } - else + if (Insert(obj, position - 1) != null) { - 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 arr[position - 1]; } } - - return false; - } + return null; + } public T? Remove(int position) { if(position >= 0 && position < Count) { + T? temp = arr[position]; arr[position] = null; - return arr[position]; + return temp; } - return arr[position]; + return null; } - } } diff --git a/HoistingCrane/HoistingCrane/FormCarCollection.cs b/HoistingCrane/HoistingCrane/FormCarCollection.cs index 6c6c042..fb77e28 100644 --- a/HoistingCrane/HoistingCrane/FormCarCollection.cs +++ b/HoistingCrane/HoistingCrane/FormCarCollection.cs @@ -20,7 +20,6 @@ namespace HoistingCrane } } - private void CreateObject(string type) { DrawningTrackedVehicle drawning; @@ -39,7 +38,7 @@ namespace HoistingCrane default: return; } - if ((_company + drawning) == 1) + if ((_company + drawning) != null) { MessageBox.Show("Объект добавлен"); pictureBox.Image = _company.Show(); @@ -61,8 +60,6 @@ namespace HoistingCrane return color; } - - private void buttonCreateHoistingCrane_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningHoistingCrane)); @@ -81,7 +78,7 @@ namespace HoistingCrane return; } int pos = Convert.ToInt32(maskedTextBox.Text); - if ((_company - pos) == null) + if ((_company - pos) != null) { MessageBox.Show("Объект удален!"); pictureBox.Image = _company.Show(); diff --git a/HoistingCrane/HoistingCrane/MovementStrategy/AbstractStrategy.cs b/HoistingCrane/HoistingCrane/MovementStrategy/AbstractStrategy.cs index 43e18e9..f8f3173 100644 --- a/HoistingCrane/HoistingCrane/MovementStrategy/AbstractStrategy.cs +++ b/HoistingCrane/HoistingCrane/MovementStrategy/AbstractStrategy.cs @@ -47,7 +47,6 @@ FieldWidth = width; FieldHeight = height; } - /// /// Шаг перемещения /// @@ -119,7 +118,6 @@ /// /// protected abstract bool IsTargetDestination(); - /// /// Попытка перемещения в требуемом направлении /// diff --git a/HoistingCrane/HoistingCrane/MovementStrategy/MoveToBorder.cs b/HoistingCrane/HoistingCrane/MovementStrategy/MoveToBorder.cs index 99cb56b..3d19b4d 100644 --- a/HoistingCrane/HoistingCrane/MovementStrategy/MoveToBorder.cs +++ b/HoistingCrane/HoistingCrane/MovementStrategy/MoveToBorder.cs @@ -1,4 +1,6 @@ -namespace HoistingCrane.MovementStrategy +using System.Configuration; + +namespace HoistingCrane.MovementStrategy { public class MoveToBorder : AbstractStrategy { @@ -12,7 +14,6 @@ return objParams.RightBorder + GetStep() >= FieldWidth && objParams.DownBorder + GetStep() >= FieldHeight; } - protected override void MoveToTarget() { ObjectParameters? objParams = GetObjectParameters; From 4eeaacde4b82528b669ad68014da836072d8b12c Mon Sep 17 00:00:00 2001 From: sqdselo Date: Mon, 1 Apr 2024 18:39:17 +0400 Subject: [PATCH 3/9] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82=D1=8C?= =?UTF-8?q?=20'=D0=91=D0=B5=D0=B7=D1=8B=D0=BC=D1=8F=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9.png'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Безымянный.png | Bin 49159 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Безымянный.png diff --git a/Безымянный.png b/Безымянный.png deleted file mode 100644 index 148b1a604d9f30a04fc36529654039d50dc70a43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49159 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 YXP#zVS-N8h_=XS$Pgg&ebxsLQ06YcjD*ylh From feea0da22be55bb54a0ca29fccbda546e62f703a Mon Sep 17 00:00:00 2001 From: sqdselo <147947144+sqdselo@users.noreply.github.com> Date: Thu, 4 Apr 2024 14:53:50 +0400 Subject: [PATCH 4/9] =?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?a=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CollectionGenericObjects/AbstractCompany.cs | 4 ++-- .../ICollectionGenericObjects.cs | 4 ++-- .../MassivGenericObjects.cs | 16 ++++++++-------- HoistingCrane/HoistingCrane/FormCarCollection.cs | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs index 45ca30e..5d05d6f 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs @@ -41,9 +41,9 @@ namespace HoistingCrane.CollectionGenericObjects arr.SetMaxCount = GetMaxCount; } - public static DrawningTrackedVehicle operator +(AbstractCompany company, DrawningTrackedVehicle car) + public static int operator +(AbstractCompany company, DrawningTrackedVehicle car) { - return company.arr?.Insert(car) ?? null; + return company.arr?.Insert(car) ?? -1; } public static DrawningTrackedVehicle operator -(AbstractCompany company, int position) { diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs index ce4dbb0..2ca324a 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -16,14 +16,14 @@ /// /// /// - T? Insert(T obj); + int Insert(T obj); /// /// Добавление элемента в коллекцию на определенную позицию /// /// /// /// - T? Insert(T obj, int position); + int Insert(T obj, int position); /// /// Удаление элемента из коллекции по его позиции /// diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs index 0fcf4a2..64e8e12 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs @@ -30,7 +30,7 @@ return null; } - public T? Insert(T obj) + public int Insert(T obj) { for (int i = 0; i < Count; i++) { @@ -39,34 +39,34 @@ return Insert(obj, 0); } } - return null; + return -1; } - public T? Insert(T obj, int position) + public int Insert(T obj, int position) { //todo Проверка позиции if (position < 0 || position > Count) { - return null; + return -1; } if (arr[position] == null) { arr[position] = obj; - return arr[position]; + return position; } else { if (Insert(obj, position + 1) != null) { - return arr[position + 1]; + return position; } if (Insert(obj, position - 1) != null) { - return arr[position - 1]; + return position; } } - return null; + return -1; } public T? Remove(int position) diff --git a/HoistingCrane/HoistingCrane/FormCarCollection.cs b/HoistingCrane/HoistingCrane/FormCarCollection.cs index fb77e28..8854ea1 100644 --- a/HoistingCrane/HoistingCrane/FormCarCollection.cs +++ b/HoistingCrane/HoistingCrane/FormCarCollection.cs @@ -38,7 +38,7 @@ namespace HoistingCrane default: return; } - if ((_company + drawning) != null) + if ((_company + drawning) != -1) { MessageBox.Show("Объект добавлен"); pictureBox.Image = _company.Show(); From 5f5f61f51bd279e9a88e3035627159dbb9b1559e Mon Sep 17 00:00:00 2001 From: Vladislav_396ntk Date: Mon, 15 Apr 2024 12:30:38 +0400 Subject: [PATCH 5/9] =?UTF-8?q?=D0=BB=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=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CollectionGenericObjects/MassivGenericObjects.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs index 64e8e12..2573492 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs @@ -29,7 +29,6 @@ } return null; } - public int Insert(T obj) { for (int i = 0; i < Count; i++) @@ -41,7 +40,6 @@ } return -1; } - public int Insert(T obj, int position) { //todo Проверка позиции @@ -68,7 +66,6 @@ } return -1; } - public T? Remove(int position) { if(position >= 0 && position < Count) From 4de1bca002ed2108e880cf319f2b8e9c4caafa6f Mon Sep 17 00:00:00 2001 From: sqdselo <147947144+sqdselo@users.noreply.github.com> Date: Mon, 22 Apr 2024 19:48:41 +0400 Subject: [PATCH 6/9] =?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=203=20=D1=84=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 2 +- .../CollectionGenericObjects/Garage.cs | 3 +- .../MassivGenericObjects.cs | 46 +++++++++---------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs index 5d05d6f..7b4bc7a 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs @@ -30,7 +30,7 @@ namespace HoistingCrane.CollectionGenericObjects { get { - return (pictureWidth * pictureHeight) / (_placeSizeHeight * _placeSizeWidth); + return (pictureWidth * pictureHeight) / (_placeSizeHeight * _placeSizeWidth)-3; } } public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects array) diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs index 3aedcb2..0839cb8 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs @@ -36,7 +36,7 @@ namespace HoistingCrane.CollectionGenericObjects arr?.Get(i)?.SetPictureSize(pictureWidth, pictureHeight); arr?.Get(i)?.SetPosition(_placeSizeWidth * currentPosWidth + 25, _placeSizeHeight * currentPosHeight + 15); } - + if (currentPosWidth > 0) currentPosWidth--; else @@ -51,5 +51,6 @@ namespace HoistingCrane.CollectionGenericObjects } } + } } diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs index 2573492..3e2d561 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs @@ -31,50 +31,50 @@ } public int Insert(T obj) { - for (int i = 0; i < Count; i++) - { - if (arr[i] == null) - { - return Insert(obj, 0); - } - } - return -1; + return Insert(obj, 0); } public int Insert(T obj, int position) { - //todo Проверка позиции + if (position < 0 || position > Count) { return -1; } - if (arr[position] == null) + int pos = position - 1; + + while (position < Count) { - arr[position] = obj; - return position; - } - else - { - if (Insert(obj, position + 1) != null) + if (arr[position] == null) { + arr[position] = obj; return position; } - if (Insert(obj, position - 1) != null) + position++; + } + while (pos > 0) + { + if (arr[position] == null) { + arr[position] = obj; return position; } + position--; } + return -1; - } + + } public T? Remove(int position) { - if(position >= 0 && position < Count) + if (position < 0 || position > Count) { - T? temp = arr[position]; - arr[position] = null; - return temp; + return null; } - return null; + + T? removed_object = arr[position]; + arr[position] = null; + return removed_object; } } } From 0a9f5bcbb674b129cba6c66fd0cab881913453e4 Mon Sep 17 00:00:00 2001 From: sqdselo <147947144+sqdselo@users.noreply.github.com> Date: Sun, 28 Apr 2024 00:31:52 +0400 Subject: [PATCH 7/9] =?UTF-8?q?=D0=93=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=D1=8F?= =?UTF-8?q?=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MassivGenericObjects.cs | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs index 3e2d561..39d6839 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs @@ -1,4 +1,5 @@ -namespace HoistingCrane.CollectionGenericObjects +using System; +namespace HoistingCrane.CollectionGenericObjects { public class MassivGenericObjects : ICollectionGenericObjects where T : class { @@ -7,74 +8,77 @@ { arr = Array.Empty(); } - public int Count + public int Count { - get { return arr.Length; } - } + get { return arr.Length; } + } public int SetMaxCount { set { if (value > 0) { - arr = new T?[value]; + if (arr.Length > 0) + { + Array.Resize(ref arr, value); + } + else + { + arr = new T?[value]; + } } } } public T? Get(int position) { - if(position >= 0 && position < arr.Length) + if (position >= 0 && position < arr.Length) { return arr[position]; } - return null; + return null; } + public int Insert(T obj) { return Insert(obj, 0); } + public int Insert(T obj, int position) { - + //todo Проверка позиции if (position < 0 || position > Count) { return -1; } - int pos = position - 1; - - while (position < Count) + if (arr[position] == null) { - if (arr[position] == null) + arr[position] = obj; + return position; + } + else + { + if (Insert(obj, position + 1) != -1) { - arr[position] = obj; return position; } - position++; - } - while (pos > 0) - { - if (arr[position] == null) + if (Insert(obj, position - 1) != -1) { - arr[position] = obj; return position; } - position--; } - return -1; - } + public T? Remove(int position) { - if (position < 0 || position > Count) + if (position >= 0 && position < Count) { - return null; + T? temp = arr[position]; + arr[position] = null; + return temp; } - - T? removed_object = arr[position]; - arr[position] = null; - return removed_object; + return null; } } } From ad565c92f3b893817de10207cc1631683d8717f6 Mon Sep 17 00:00:00 2001 From: sqdselo <147947144+sqdselo@users.noreply.github.com> Date: Sat, 4 May 2024 20:15:42 +0400 Subject: [PATCH 8/9] =?UTF-8?q?=D0=93=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=D1=8F?= =?UTF-8?q?=20=D0=BB=D0=B0=D0=B1=D0=B03?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HoistingCrane/CollectionGenericObjects/AbstractCompany.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs index 7b4bc7a..5ed6ee3 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs @@ -74,7 +74,6 @@ namespace HoistingCrane.CollectionGenericObjects } return bitmap; } - /// /// Вывод заднего фона /// From f51c2c348f6b1638fffa4832842f37561ed62891 Mon Sep 17 00:00:00 2001 From: sqdselo <147947144+sqdselo@users.noreply.github.com> Date: Sun, 5 May 2024 13:08:21 +0400 Subject: [PATCH 9/9] =?UTF-8?q?=D0=91=D0=BE=D1=80=D1=8E=D1=81=D1=8C=20?= =?UTF-8?q?=D1=81=20=D0=BA=D0=BE=D0=BD=D1=84=D0=BB=D0=B8=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 2 +- .../CollectionType.cs | 8 + .../CollectionGenericObjects/Garage.cs | 1 - .../ICollectionGenericObjects.cs | 5 + .../ListGenericObjects.cs | 74 ++++++ .../MassivGenericObjects.cs | 33 +-- .../StorageCollection.cs | 63 +++++ .../FormCarCollection.Designer.cs | 237 ++++++++++++++---- .../HoistingCrane/FormCarCollection.cs | 104 ++++++-- 9 files changed, 440 insertions(+), 87 deletions(-) create mode 100644 HoistingCrane/HoistingCrane/CollectionGenericObjects/CollectionType.cs create mode 100644 HoistingCrane/HoistingCrane/CollectionGenericObjects/ListGenericObjects.cs create mode 100644 HoistingCrane/HoistingCrane/CollectionGenericObjects/StorageCollection.cs diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs index 5ed6ee3..8bec219 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/AbstractCompany.cs @@ -47,7 +47,7 @@ namespace HoistingCrane.CollectionGenericObjects } public static DrawningTrackedVehicle operator -(AbstractCompany company, int position) { - return company.arr?.Remove(position) ?? null; + return company.arr?.Remove(position); } public DrawningTrackedVehicle? GetRandomObject() diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/CollectionType.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/CollectionType.cs new file mode 100644 index 0000000..22ffa84 --- /dev/null +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/CollectionType.cs @@ -0,0 +1,8 @@ +using System; +namespace HoistingCrane.CollectionGenericObjects +{ + public enum CollectionType + { + None = 0, Massive = 1, List = 2 + } +} diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs index 0839cb8..6ba0162 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/Garage.cs @@ -20,7 +20,6 @@ namespace HoistingCrane.CollectionGenericObjects } } } - protected override void SetObjectsPosition() { int countWidth = pictureWidth / _placeSizeWidth; diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs index 2ca324a..007db42 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ICollectionGenericObjects.cs @@ -30,6 +30,11 @@ /// /// T? Remove(int position); + /// + /// Получение объекта коллекции + /// + /// + /// T? Get(int position); } } diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/ListGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ListGenericObjects.cs new file mode 100644 index 0000000..1e19784 --- /dev/null +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/ListGenericObjects.cs @@ -0,0 +1,74 @@ +using System; +using System.CodeDom.Compiler; +using System.Windows.Forms.VisualStyles; + +namespace HoistingCrane.CollectionGenericObjects +{ + public class ListGenericObjects : ICollectionGenericObjects where T : class + { + /// + /// Список объектов, которые храним + /// + readonly List list; + /// + /// Конструктор + /// + public ListGenericObjects() + { + list = new List(); + } + /// + /// Максимально допустимое число объектов в списке + /// + private int _maxCount; + public int Count + { + get { return list.Count; } + } + public int SetMaxCount + { + set + { + if(value > 0) + { + _maxCount = value; + } + } + } + + public T? Get(int position) + { + if (position >= Count || position < 0) return null; + return list[position]; + } + public int Insert(T obj) + { + if (Count == _maxCount) + { + return -1; + } + list.Add(obj); + return Count; + } + + public int Insert(T obj, int position) + { + if (position < 0 || position >= Count || Count == _maxCount) + { + return -1; + } + list.Insert(position, obj); + return position; + } + public T? Remove(int position) + { + if(position >= 0 && position < list.Count) + { + T? temp = list[position]; + list.RemoveAt(position); + return temp; + } + return null; + } + } +} diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs index 39d6839..ed0e4fd 100644 --- a/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/MassivGenericObjects.cs @@ -10,7 +10,7 @@ namespace HoistingCrane.CollectionGenericObjects } public int Count { - get { return arr.Length; } + get { return arr.Length; } } public int SetMaxCount { @@ -45,28 +45,33 @@ namespace HoistingCrane.CollectionGenericObjects public int Insert(T obj, int position) { - //todo Проверка позиции - if (position < 0 || position > Count) + + if (position < 0 || position >= Count) { return -1; } - if (arr[position] == null) + int copyPos = position - 1; + + while (position < Count) { - arr[position] = obj; - return position; - } - else - { - if (Insert(obj, position + 1) != -1) - { - return position; - } - if (Insert(obj, position - 1) != -1) + if (arr[position] == null) { + arr[position] = obj; return position; } + position++; } + while (copyPos > 0) + { + if (arr[copyPos] == null) + { + arr[copyPos] = obj; + return copyPos; + } + copyPos--; + } + return -1; } diff --git a/HoistingCrane/HoistingCrane/CollectionGenericObjects/StorageCollection.cs b/HoistingCrane/HoistingCrane/CollectionGenericObjects/StorageCollection.cs new file mode 100644 index 0000000..1e2b74b --- /dev/null +++ b/HoistingCrane/HoistingCrane/CollectionGenericObjects/StorageCollection.cs @@ -0,0 +1,63 @@ +using System; +namespace HoistingCrane.CollectionGenericObjects +{ + public class StorageCollection where T : class + { + /// + /// Словарь (хранилище) с коллекциями + /// + readonly Dictionary> dict; + /// + /// Возвращение списка названий коллекций + /// + public List Keys => dict.Keys.ToList(); + /// + /// Конструктор + /// + public StorageCollection() + { + dict = new Dictionary>(); + } + /// + /// Добавление коллекции в хранилище + /// + /// Название коллекции + /// тип коллекции + public void AddCollection(string name, CollectionType collectionType) + { + if (dict.ContainsKey(name)) return; + if (collectionType == CollectionType.None) return; + else if (collectionType == CollectionType.Massive) + dict[name] = new MassivGenericObjects(); + else if (collectionType == CollectionType.List) + dict[name] = new ListGenericObjects(); + } + /// + /// Удаление коллекции + /// + /// Название коллекции + public void DelCollection(string name) + { + if(Keys.Contains(name)) + { + dict.Remove(name); + } + } + /// + /// Доступ к коллекции + /// + /// Название коллекции + /// + public ICollectionGenericObjects? this[string name] + { + get + { + if (dict.ContainsKey(name)) + return dict[name]; + return null; + } + } + + } + +} diff --git a/HoistingCrane/HoistingCrane/FormCarCollection.Designer.cs b/HoistingCrane/HoistingCrane/FormCarCollection.Designer.cs index 60eb2d0..e836b45 100644 --- a/HoistingCrane/HoistingCrane/FormCarCollection.Designer.cs +++ b/HoistingCrane/HoistingCrane/FormCarCollection.Designer.cs @@ -29,63 +29,119 @@ private void InitializeComponent() { groupBoxTools = new GroupBox(); - buttonGoToChek = new Button(); + buttonCreateCompany = new Button(); + panelCompanyTool = new Panel(); buttonRefresh = new Button(); + buttonGoToChek = new Button(); + buttonCreateHoistingCrane = new Button(); + buttonCreateTrackedVehicle = new Button(); buttonDeleteCar = new Button(); maskedTextBox = new MaskedTextBox(); + panelStorage = new Panel(); + buttonDeleteCollection = new Button(); + listBoxCollection = new ListBox(); + buttonCollectionAdd = new Button(); + radioButtonList = new RadioButton(); + radioButtonMassive = new RadioButton(); + textBoxCollectionName = new TextBox(); + labelCollectionName = new Label(); comboBoxSelectorCompany = new ComboBox(); - buttonCreateTrackedVehicle = new Button(); - buttonCreateHoistingCrane = new Button(); pictureBox = new PictureBox(); groupBoxTools.SuspendLayout(); + panelCompanyTool.SuspendLayout(); + panelStorage.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(buttonCreateCompany); + groupBoxTools.Controls.Add(panelCompanyTool); + groupBoxTools.Controls.Add(panelStorage); groupBoxTools.Controls.Add(comboBoxSelectorCompany); - groupBoxTools.Controls.Add(buttonCreateTrackedVehicle); - groupBoxTools.Controls.Add(buttonCreateHoistingCrane); groupBoxTools.Dock = DockStyle.Right; - groupBoxTools.Location = new Point(716, 0); + groupBoxTools.Location = new Point(759, 0); groupBoxTools.Name = "groupBoxTools"; - groupBoxTools.Size = new Size(210, 450); + groupBoxTools.Size = new Size(214, 509); groupBoxTools.TabIndex = 0; groupBoxTools.TabStop = false; groupBoxTools.Text = "Инструменты"; // - // buttonGoToChek + // buttonCreateCompany // - 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; + buttonCreateCompany.Location = new Point(12, 288); + buttonCreateCompany.Name = "buttonCreateCompany"; + buttonCreateCompany.Size = new Size(196, 23); + buttonCreateCompany.TabIndex = 7; + buttonCreateCompany.Text = "Создать компанию"; + buttonCreateCompany.UseVisualStyleBackColor = true; + buttonCreateCompany.Click += buttonCreateCompany_Click; + // + // panelCompanyTool + // + panelCompanyTool.Anchor = AnchorStyles.None; + panelCompanyTool.Controls.Add(buttonRefresh); + panelCompanyTool.Controls.Add(buttonGoToChek); + panelCompanyTool.Controls.Add(buttonCreateHoistingCrane); + panelCompanyTool.Controls.Add(buttonCreateTrackedVehicle); + panelCompanyTool.Controls.Add(buttonDeleteCar); + panelCompanyTool.Controls.Add(maskedTextBox); + panelCompanyTool.Enabled = false; + panelCompanyTool.Location = new Point(3, 317); + panelCompanyTool.Name = "panelCompanyTool"; + panelCompanyTool.Size = new Size(208, 238); + panelCompanyTool.TabIndex = 8; // // buttonRefresh // buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - buttonRefresh.Location = new Point(12, 375); + buttonRefresh.Location = new Point(9, 159); buttonRefresh.Name = "buttonRefresh"; - buttonRefresh.Size = new Size(192, 34); + buttonRefresh.Size = new Size(196, 27); buttonRefresh.TabIndex = 5; buttonRefresh.Text = "Обновить"; buttonRefresh.UseVisualStyleBackColor = true; buttonRefresh.Click += buttonRefresh_Click; // + // buttonGoToChek + // + buttonGoToChek.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonGoToChek.Location = new Point(9, 119); + buttonGoToChek.Name = "buttonGoToChek"; + buttonGoToChek.Size = new Size(196, 24); + buttonGoToChek.TabIndex = 6; + buttonGoToChek.Text = "Передать на тесты"; + buttonGoToChek.UseVisualStyleBackColor = true; + buttonGoToChek.Click += buttonGoToChek_Click; + // + // buttonCreateHoistingCrane + // + buttonCreateHoistingCrane.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonCreateHoistingCrane.Location = new Point(9, 3); + buttonCreateHoistingCrane.Name = "buttonCreateHoistingCrane"; + buttonCreateHoistingCrane.Size = new Size(196, 22); + buttonCreateHoistingCrane.TabIndex = 0; + buttonCreateHoistingCrane.Text = "Добавить подъемный кран"; + buttonCreateHoistingCrane.UseVisualStyleBackColor = true; + buttonCreateHoistingCrane.Click += buttonCreateHoistingCrane_Click; + // + // buttonCreateTrackedVehicle + // + buttonCreateTrackedVehicle.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + buttonCreateTrackedVehicle.Location = new Point(9, 31); + buttonCreateTrackedVehicle.Name = "buttonCreateTrackedVehicle"; + buttonCreateTrackedVehicle.Size = new Size(196, 24); + buttonCreateTrackedVehicle.TabIndex = 1; + buttonCreateTrackedVehicle.Text = "Добавить гусеничную машину"; + buttonCreateTrackedVehicle.UseVisualStyleBackColor = true; + buttonCreateTrackedVehicle.Click += buttonCreateTrackedVehicle_Click; + // // buttonDeleteCar // buttonDeleteCar.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - buttonDeleteCar.Location = new Point(12, 233); + buttonDeleteCar.Location = new Point(9, 90); buttonDeleteCar.Name = "buttonDeleteCar"; - buttonDeleteCar.Size = new Size(192, 34); + buttonDeleteCar.Size = new Size(196, 23); buttonDeleteCar.TabIndex = 4; buttonDeleteCar.Text = "Удалить автомобиль"; buttonDeleteCar.UseVisualStyleBackColor = true; @@ -94,52 +150,112 @@ // maskedTextBox // maskedTextBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - maskedTextBox.Location = new Point(12, 204); + maskedTextBox.Location = new Point(9, 61); maskedTextBox.Mask = "00"; maskedTextBox.Name = "maskedTextBox"; - maskedTextBox.Size = new Size(192, 23); + maskedTextBox.Size = new Size(196, 23); maskedTextBox.TabIndex = 3; // + // panelStorage + // + panelStorage.Controls.Add(buttonDeleteCollection); + panelStorage.Controls.Add(listBoxCollection); + panelStorage.Controls.Add(buttonCollectionAdd); + panelStorage.Controls.Add(radioButtonList); + panelStorage.Controls.Add(radioButtonMassive); + panelStorage.Controls.Add(textBoxCollectionName); + panelStorage.Controls.Add(labelCollectionName); + panelStorage.Dock = DockStyle.Top; + panelStorage.Location = new Point(3, 19); + panelStorage.Name = "panelStorage"; + panelStorage.Size = new Size(208, 229); + panelStorage.TabIndex = 7; + // + // buttonDeleteCollection + // + buttonDeleteCollection.Location = new Point(9, 199); + buttonDeleteCollection.Name = "buttonDeleteCollection"; + buttonDeleteCollection.Size = new Size(192, 27); + buttonDeleteCollection.TabIndex = 6; + buttonDeleteCollection.Text = "Удалить коллекцию"; + buttonDeleteCollection.UseVisualStyleBackColor = true; + buttonDeleteCollection.Click += buttonDeleteCollection_Click; + // + // listBoxCollection + // + listBoxCollection.FormattingEnabled = true; + listBoxCollection.ItemHeight = 15; + listBoxCollection.Location = new Point(9, 118); + listBoxCollection.Name = "listBoxCollection"; + listBoxCollection.Size = new Size(192, 79); + listBoxCollection.TabIndex = 5; + // + // buttonCollectionAdd + // + buttonCollectionAdd.Location = new Point(9, 81); + buttonCollectionAdd.Name = "buttonCollectionAdd"; + buttonCollectionAdd.Size = new Size(192, 23); + buttonCollectionAdd.TabIndex = 4; + buttonCollectionAdd.Text = "Добавить коллекцию"; + buttonCollectionAdd.UseVisualStyleBackColor = true; + buttonCollectionAdd.Click += buttonCollectionAdd_Click; + // + // radioButtonList + // + radioButtonList.AutoSize = true; + radioButtonList.Location = new Point(128, 56); + radioButtonList.Name = "radioButtonList"; + radioButtonList.Size = new Size(66, 19); + radioButtonList.TabIndex = 3; + radioButtonList.TabStop = true; + radioButtonList.Text = "Список"; + radioButtonList.UseVisualStyleBackColor = true; + // + // radioButtonMassive + // + radioButtonMassive.AutoSize = true; + radioButtonMassive.Location = new Point(18, 56); + radioButtonMassive.Name = "radioButtonMassive"; + radioButtonMassive.Size = new Size(67, 19); + radioButtonMassive.TabIndex = 2; + radioButtonMassive.TabStop = true; + radioButtonMassive.Text = "Массив"; + radioButtonMassive.UseVisualStyleBackColor = true; + // + // textBoxCollectionName + // + textBoxCollectionName.Location = new Point(9, 18); + textBoxCollectionName.Name = "textBoxCollectionName"; + textBoxCollectionName.Size = new Size(192, 23); + textBoxCollectionName.TabIndex = 1; + // + // labelCollectionName + // + labelCollectionName.AutoSize = true; + labelCollectionName.Location = new Point(35, 0); + labelCollectionName.Name = "labelCollectionName"; + labelCollectionName.Size = new Size(125, 15); + labelCollectionName.TabIndex = 0; + labelCollectionName.Text = "Название коллекции:"; + // // 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.Location = new Point(12, 259); comboBoxSelectorCompany.Name = "comboBoxSelectorCompany"; - comboBoxSelectorCompany.Size = new Size(192, 23); + comboBoxSelectorCompany.Size = new Size(196, 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; + comboBoxSelectorCompany.SelectedIndexChanged += comboBoxSelectorCompany_SelectedIndexChanged; // // pictureBox // pictureBox.Dock = DockStyle.Fill; pictureBox.Location = new Point(0, 0); pictureBox.Name = "pictureBox"; - pictureBox.Size = new Size(716, 450); + pictureBox.Size = new Size(759, 509); pictureBox.TabIndex = 1; pictureBox.TabStop = false; // @@ -147,13 +263,16 @@ // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(926, 450); + ClientSize = new Size(973, 509); Controls.Add(pictureBox); Controls.Add(groupBoxTools); Name = "FormCarCollection"; Text = "FormCarCollections"; groupBoxTools.ResumeLayout(false); - groupBoxTools.PerformLayout(); + panelCompanyTool.ResumeLayout(false); + panelCompanyTool.PerformLayout(); + panelStorage.ResumeLayout(false); + panelStorage.PerformLayout(); ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); ResumeLayout(false); } @@ -169,5 +288,15 @@ private MaskedTextBox maskedTextBox; private PictureBox pictureBox; private Button buttonGoToChek; + private Panel panelStorage; + private RadioButton radioButtonList; + private RadioButton radioButtonMassive; + private TextBox textBoxCollectionName; + private Label labelCollectionName; + private Button buttonCreateCompany; + private Button buttonDeleteCollection; + private ListBox listBoxCollection; + private Button buttonCollectionAdd; + private Panel panelCompanyTool; } } \ No newline at end of file diff --git a/HoistingCrane/HoistingCrane/FormCarCollection.cs b/HoistingCrane/HoistingCrane/FormCarCollection.cs index 8854ea1..8ca2035 100644 --- a/HoistingCrane/HoistingCrane/FormCarCollection.cs +++ b/HoistingCrane/HoistingCrane/FormCarCollection.cs @@ -4,20 +4,19 @@ namespace HoistingCrane { public partial class FormCarCollection : Form { - private AbstractCompany? _company; + private AbstractCompany? _company = null; + + private readonly StorageCollection _storageCollection; + public FormCarCollection() { InitializeComponent(); + _storageCollection = new(); } - private void comboBoxSelectorCompany_SelectedIndexChanged_1(object sender, EventArgs e) + private void comboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) { - switch (comboBoxSelectorCompany.Text) - { - case "Хранилище": - _company = new Garage(pictureBox.Width, pictureBox.Height, new MassivGenericObjects()); - break; - } + panelCompanyTool.Enabled = false; } private void CreateObject(string type) @@ -27,7 +26,6 @@ namespace HoistingCrane 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; @@ -48,7 +46,6 @@ namespace HoistingCrane MessageBox.Show("Не удалось добавить объект"); } } - private static Color GetColor(Random random) { Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)); @@ -59,12 +56,9 @@ namespace HoistingCrane } 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) { @@ -88,13 +82,11 @@ namespace HoistingCrane 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; @@ -107,12 +99,90 @@ namespace HoistingCrane if (count <= 0) break; } if (car == null) return; - FormHoistingCrane form = new() + FormHoistingCrane form = new() { SetCar = car }; form.ShowDialog(); - + } + + /// + /// Обновление списка в listBoxCollection + /// + private void RerfreshListBoxItems() + { + listBoxCollection.Items.Clear(); + for (int i = 0; i < _storageCollection.Keys?.Count; ++i) + { + string? colName = _storageCollection.Keys?[i]; + if (!string.IsNullOrEmpty(colName)) + { + listBoxCollection.Items.Add(colName); + } + } + } + private void buttonCollectionAdd_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) + { + MessageBox.Show("Не все данные заполнены", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + CollectionType collectionType = CollectionType.None; + if (radioButtonMassive.Checked) + { + collectionType = CollectionType.Massive; + } + else if (radioButtonList.Checked) + { + collectionType = CollectionType.List; + } + _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + RerfreshListBoxItems(); + } + private void buttonDeleteCollection_Click(object sender, EventArgs e) + { + // TODO прописать логику удаления элемента из коллекции + // нужно убедиться, что есть выбранная коллекция + // спросить у пользователя через MessageBox, что он подтверждает, что хочет удалить запись + // удалить и обновить ListBox + + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + { + MessageBox.Show("Коллекция не выбрана"); + return; + } + + if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); + RerfreshListBoxItems(); + } + private void buttonCreateCompany_Click(object sender, EventArgs e) + { + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + { + MessageBox.Show("Коллекция не выбрана"); + return; + } + ICollectionGenericObjects? collection = _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; + if (collection == null) + { + MessageBox.Show("Коллекция не проинициализирована"); + return; + } + switch (comboBoxSelectorCompany.Text) + { + case "Хранилище": + _company = new Garage(pictureBox.Width, pictureBox.Height, collection); + break; + } + panelCompanyTool.Enabled = true; + RerfreshListBoxItems(); } } + }