From 6cfe8083f87108da8936756acd56e22f0dec887b Mon Sep 17 00:00:00 2001 From: Salikh Date: Tue, 28 Nov 2023 19:59:56 +0400 Subject: [PATCH 1/5] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AirBomber/BomberGenericCollection.cs | 5 ++ AirBomber/BomberGenericStorage.cs | 98 ++++++++++++++++++++++ AirBomber/ExtentionDrawningBomber.cs | 62 ++++++++++++++ AirBomber/FormBomberCollection.Designer.cs | 4 +- AirBomber/FormBomberCollection.cs | 1 + 5 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 AirBomber/ExtentionDrawningBomber.cs diff --git a/AirBomber/BomberGenericCollection.cs b/AirBomber/BomberGenericCollection.cs index 6ecc020..e0cf2fb 100644 --- a/AirBomber/BomberGenericCollection.cs +++ b/AirBomber/BomberGenericCollection.cs @@ -14,6 +14,11 @@ namespace AirBomber.Generics where T : DrawningBomber where U : IMoveableObject { + /// + /// Получение объектов коллекции + /// + public IEnumerable GetPlane => _collection.GetPlane(); + private readonly int _pictureWidth; private readonly int _pictureHeight; private readonly int _placeSizeWidth = 155; diff --git a/AirBomber/BomberGenericStorage.cs b/AirBomber/BomberGenericStorage.cs index 32d8e31..06804ac 100644 --- a/AirBomber/BomberGenericStorage.cs +++ b/AirBomber/BomberGenericStorage.cs @@ -25,6 +25,18 @@ namespace AirBomber.Generics /// private readonly int _pictureHeight; /// + /// Разделитель для записи ключа и значения элемента словаря + /// + private static readonly char _separatorForKeyValue = '|'; + /// + /// Разделитель для записей коллекции данных в файл + /// + private readonly char _separatorRecords = ';'; + /// + /// Разделитель для записи информации по объекту в файл + /// + private static readonly char _separatorForObject = ':'; + /// /// Конструктор /// /// @@ -65,5 +77,91 @@ namespace AirBomber.Generics return null; } } + public bool SaveData(string filename) + { + if (File.Exists(filename)) + { + File.Delete(filename); + } + StringBuilder data = new(); + foreach (KeyValuePair> record in _bomberStorage) + { + StringBuilder records = new(); + foreach (DrawningBomber? elem in record.Value.GetPlane) + { + records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); + } + data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}"); + } + if (data.Length == 0) + { + return false; + } + + using (StreamWriter writer = new StreamWriter(filename)) + { + writer.Write($"UstaStorage{Environment.NewLine}{data}"); + } + + return true; + } + + /// + /// Загрузка информации по установкам в хранилище из файла + /// + /// Путь и имя файла + /// true - загрузка прошла успешно, false - ошибка при загрузке данных + public bool LoadData(string filename) + { + if (!File.Exists(filename)) + { + return false; + } + + using (StreamReader reader = new StreamReader(filename)) + { + string cheker = reader.ReadLine(); + if (cheker == null) + { + return false; + } + if (!cheker.StartsWith("UstaStorage")) + { + return false; + } + _bomberStorage.Clear(); + string strs; + bool firstinit = true; + while ((strs = reader.ReadLine()) != null) + { + if (strs == null && firstinit) + { + return false; + } + if (strs == null) + { + return false; + } + firstinit = false; + string name = strs.Split(_separatorForKeyValue)[0]; + BomberGenericCollection collection = new(_pictureWidth, _pictureHeight); + foreach (string data in strs.Split(_separatorForKeyValue)[1].Split(_separatorRecords)) + { + DrawningBomber? usta = + data?.CreateDrawningBomber(_separatorForObject, _pictureWidth, _pictureHeight); + if (usta != null) + { + int? result = collection + usta; + if (result == null || result.Value == -1) + { + return false; + } + } + } + _bomberStorage.Add(name, collection); + } + return true; + } + } } } diff --git a/AirBomber/ExtentionDrawningBomber.cs b/AirBomber/ExtentionDrawningBomber.cs new file mode 100644 index 0000000..c2f7dea --- /dev/null +++ b/AirBomber/ExtentionDrawningBomber.cs @@ -0,0 +1,62 @@ +using AirBomber.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber.DrawningObjects +{ + public static class ExtentionDrawningBomber + { + /// + /// Создание объекта из строки + /// + /// Строка с данными для создания объекта + /// Разделитель даннных + /// Ширина + /// Высота + /// Объект + public static DrawningBomber? CreateDrawningBomber(this string info, char separatorForObject, int width, int height) + { + string[] strs = info.Split(separatorForObject); + if (strs.Length == 3) + { + return new DrawningBomber(Convert.ToInt32(strs[0]), + Convert.ToInt32(strs[1]), Color.FromName(strs[2]), width, height); + } + else if (strs.Length == 6) + { + return new DrawningAirBomber(Convert.ToInt32(strs[0]), + Convert.ToInt32(strs[1]), + Color.FromName(strs[2]), + Color.FromName(strs[3]), + Convert.ToBoolean(strs[4]), + Convert.ToBoolean(strs[5]), width, height); + } + return null; + } + /// + /// Получение данных для сохранения в файл + /// + /// Сохраняемый объект + /// Разделитель даннных + /// Строка с данными по объекту + public static string GetDataForSave(this DrawningBomber drawningBomber, + char separatorForAir) + { + var air = drawningBomber.EntityBomber; + if (air == null) + { + return string.Empty; + } + var str = + $"{air.Speed}{separatorForAir}{air.Weight}{separatorForAir}{air.BodyColor.Name}"; + if (air is not EntityAirBomber airBomber) + { + return str; + } + return $"{str}{separatorForAir}{airBomber.DopColor.Name}{separatorForAir}{airBomber.Toplivo}{separatorForAir}{airBomber.Rocket}"; + } + } +} diff --git a/AirBomber/FormBomberCollection.Designer.cs b/AirBomber/FormBomberCollection.Designer.cs index 1766309..7de4be3 100644 --- a/AirBomber/FormBomberCollection.Designer.cs +++ b/AirBomber/FormBomberCollection.Designer.cs @@ -110,7 +110,7 @@ // // ButtonRefreshCollection // - ButtonRefreshCollection.Location = new Point(28, 481); + ButtonRefreshCollection.Location = new Point(28, 448); ButtonRefreshCollection.Name = "ButtonRefreshCollection"; ButtonRefreshCollection.Size = new Size(193, 37); ButtonRefreshCollection.TabIndex = 3; @@ -120,7 +120,7 @@ // // ButtonRemoveBomber // - ButtonRemoveBomber.Location = new Point(28, 416); + ButtonRemoveBomber.Location = new Point(28, 401); ButtonRemoveBomber.Name = "ButtonRemoveBomber"; ButtonRemoveBomber.Size = new Size(193, 41); ButtonRemoveBomber.TabIndex = 2; diff --git a/AirBomber/FormBomberCollection.cs b/AirBomber/FormBomberCollection.cs index 9fce61b..aa9a170 100644 --- a/AirBomber/FormBomberCollection.cs +++ b/AirBomber/FormBomberCollection.cs @@ -147,5 +147,6 @@ namespace AirBomber PicBoxBomberCollection.Image = _bomber[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowBomber(); } + } } -- 2.25.1 From 05134ead4f827ef4f73265190778409608d90207 Mon Sep 17 00:00:00 2001 From: Salikh Date: Tue, 28 Nov 2023 20:33:50 +0400 Subject: [PATCH 2/5] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AirBomber/BomberGenericStorage.cs | 4 +- AirBomber/FormBomberCollection.Designer.cs | 63 +++++++++++++++++++++- AirBomber/FormBomberCollection.cs | 32 +++++++++++ AirBomber/FormBomberCollection.resx | 12 +++++ 4 files changed, 107 insertions(+), 4 deletions(-) diff --git a/AirBomber/BomberGenericStorage.cs b/AirBomber/BomberGenericStorage.cs index 06804ac..59c3184 100644 --- a/AirBomber/BomberGenericStorage.cs +++ b/AirBomber/BomberGenericStorage.cs @@ -100,7 +100,7 @@ namespace AirBomber.Generics using (StreamWriter writer = new StreamWriter(filename)) { - writer.Write($"UstaStorage{Environment.NewLine}{data}"); + writer.Write($"BomberStorage{Environment.NewLine}{data}"); } return true; @@ -125,7 +125,7 @@ namespace AirBomber.Generics { return false; } - if (!cheker.StartsWith("UstaStorage")) + if (!cheker.StartsWith("BomberStorage")) { return false; } diff --git a/AirBomber/FormBomberCollection.Designer.cs b/AirBomber/FormBomberCollection.Designer.cs index 7de4be3..b63974a 100644 --- a/AirBomber/FormBomberCollection.Designer.cs +++ b/AirBomber/FormBomberCollection.Designer.cs @@ -39,9 +39,16 @@ ButtonAddBomber = new Button(); MessageBoxBomber = new TextBox(); PicBoxBomberCollection = new PictureBox(); + menuStrip = new MenuStrip(); + fileToolStripMenuItem = new ToolStripMenuItem(); + SaveToolStripMenuItem = new ToolStripMenuItem(); + LoadToolStripMenuItem = new ToolStripMenuItem(); + openFileDialog = new OpenFileDialog(); + saveFileDialog = new OpenFileDialog(); Tools.SuspendLayout(); Kit.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)PicBoxBomberCollection).BeginInit(); + menuStrip.SuspendLayout(); SuspendLayout(); // // Tools @@ -147,19 +154,62 @@ // // PicBoxBomberCollection // - PicBoxBomberCollection.Location = new Point(1, -2); + PicBoxBomberCollection.Location = new Point(0, 38); PicBoxBomberCollection.Name = "PicBoxBomberCollection"; PicBoxBomberCollection.Size = new Size(473, 563); PicBoxBomberCollection.TabIndex = 1; PicBoxBomberCollection.TabStop = false; // + // menuStrip + // + menuStrip.ImageScalingSize = new Size(20, 20); + menuStrip.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Size = new Size(800, 28); + menuStrip.TabIndex = 2; + menuStrip.Text = "Файл"; + // + // fileToolStripMenuItem + // + fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { SaveToolStripMenuItem, LoadToolStripMenuItem }); + fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + fileToolStripMenuItem.Size = new Size(59, 24); + fileToolStripMenuItem.Text = "Файл"; + // + // SaveToolStripMenuItem + // + SaveToolStripMenuItem.Name = "SaveToolStripMenuItem"; + SaveToolStripMenuItem.Size = new Size(224, 26); + SaveToolStripMenuItem.Text = "Сохранение"; + SaveToolStripMenuItem.Click += SaveToolStripMenuItem_Click; + // + // LoadToolStripMenuItem + // + LoadToolStripMenuItem.Name = "LoadToolStripMenuItem"; + LoadToolStripMenuItem.Size = new Size(224, 26); + LoadToolStripMenuItem.Text = "Загрузка"; + LoadToolStripMenuItem.Click += LoadToolStripMenuItem_Click; + // + // openFileDialog + // + openFileDialog.FileName = "openFileDialog"; + openFileDialog.Filter = "txt file | *.txt"; + // + // saveFileDialog + // + saveFileDialog.FileName = "saveFileDialog"; + saveFileDialog.Filter = "txt file | *.txt"; + // // FormBomberCollection // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(800, 581); + ClientSize = new Size(800, 619); Controls.Add(PicBoxBomberCollection); Controls.Add(Tools); + Controls.Add(menuStrip); + MainMenuStrip = menuStrip; Name = "FormBomberCollection"; Text = "FormBomberCollection"; Tools.ResumeLayout(false); @@ -167,7 +217,10 @@ Kit.ResumeLayout(false); Kit.PerformLayout(); ((System.ComponentModel.ISupportInitialize)PicBoxBomberCollection).EndInit(); + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); ResumeLayout(false); + PerformLayout(); } #endregion @@ -183,5 +236,11 @@ private Button RemoveKit; private Button AddKit; private TextBox KitTextbox; + private MenuStrip menuStrip; + private ToolStripMenuItem fileToolStripMenuItem; + private ToolStripMenuItem SaveToolStripMenuItem; + private ToolStripMenuItem LoadToolStripMenuItem; + private OpenFileDialog openFileDialog; + private OpenFileDialog saveFileDialog; } } \ No newline at end of file diff --git a/AirBomber/FormBomberCollection.cs b/AirBomber/FormBomberCollection.cs index aa9a170..aafb173 100644 --- a/AirBomber/FormBomberCollection.cs +++ b/AirBomber/FormBomberCollection.cs @@ -148,5 +148,37 @@ namespace AirBomber _bomber[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowBomber(); } + private void SaveToolStripMenuItem_Click(object sender, EventArgs e) + { + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + if (_bomber.SaveData(saveFileDialog.FileName)) + { + MessageBox.Show("Сохранение прошло успешно", + "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Не сохранилось", "Результат", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void LoadToolStripMenuItem_Click(object sender, EventArgs e) + { + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + if (_bomber.LoadData(openFileDialog.FileName)) + { + MessageBox.Show("Данные успешно загружены.", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); + ReloadObjects(); + } + else + { + MessageBox.Show("Ошибка при загрузке данных.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } } } diff --git a/AirBomber/FormBomberCollection.resx b/AirBomber/FormBomberCollection.resx index af32865..4bfa349 100644 --- a/AirBomber/FormBomberCollection.resx +++ b/AirBomber/FormBomberCollection.resx @@ -117,4 +117,16 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 145, 1 + + + 315, 1 + + + 25 + \ No newline at end of file -- 2.25.1 From 6a441f2fe749091b9e267fe71934f4bfd6ffb371 Mon Sep 17 00:00:00 2001 From: Salikh Date: Wed, 29 Nov 2023 19:49:59 +0400 Subject: [PATCH 3/5] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AirBomber/SetGeneric.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/AirBomber/SetGeneric.cs b/AirBomber/SetGeneric.cs index 1a592a7..57ee127 100644 --- a/AirBomber/SetGeneric.cs +++ b/AirBomber/SetGeneric.cs @@ -69,10 +69,8 @@ namespace ProjectBomber.Generics public bool Remove(int position) { /// Проверка позиции - if (position < 0 || position >= _places.Count) - return false; - /// Удаление объекта из массива, присвоив элементу массива значение null - _places[position] = null; + if ((position < 0) || (position > _maxCount)) return false; + _places.RemoveAt(position); return true; } /// -- 2.25.1 From 1136a176ea968b8a71767634cb18cc47dcf5664e Mon Sep 17 00:00:00 2001 From: Salikh Date: Wed, 29 Nov 2023 20:28:55 +0400 Subject: [PATCH 4/5] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AirBomber/BomberGenericCollection.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/AirBomber/BomberGenericCollection.cs b/AirBomber/BomberGenericCollection.cs index e0cf2fb..1e6f9e9 100644 --- a/AirBomber/BomberGenericCollection.cs +++ b/AirBomber/BomberGenericCollection.cs @@ -43,15 +43,14 @@ namespace AirBomber.Generics return collect._collection.Insert(obj); } - public static bool operator -(BomberGenericCollection collect, int - pos) + public static T? operator -(BomberGenericCollection collect, int pos) { T? obj = collect._collection[pos]; - if (obj == null) + if (obj != null) { - return false; + collect._collection.Remove(pos); } - return collect._collection.Remove(pos); + return obj; } public U? GetU(int pos) -- 2.25.1 From 92c6f9dc76d858423046d59dddcd2d24654316d8 Mon Sep 17 00:00:00 2001 From: Salikh Date: Sat, 16 Dec 2023 01:35:13 +0400 Subject: [PATCH 5/5] =?UTF-8?q?=D0=B8=D0=B7=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AirBomber/BomberGenericStorage.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AirBomber/BomberGenericStorage.cs b/AirBomber/BomberGenericStorage.cs index 59c3184..37e9c90 100644 --- a/AirBomber/BomberGenericStorage.cs +++ b/AirBomber/BomberGenericStorage.cs @@ -147,11 +147,11 @@ namespace AirBomber.Generics BomberGenericCollection collection = new(_pictureWidth, _pictureHeight); foreach (string data in strs.Split(_separatorForKeyValue)[1].Split(_separatorRecords)) { - DrawningBomber? usta = + DrawningBomber? air = data?.CreateDrawningBomber(_separatorForObject, _pictureWidth, _pictureHeight); - if (usta != null) + if (air != null) { - int? result = collection + usta; + int? result = collection + air; if (result == null || result.Value == -1) { return false; -- 2.25.1