From 64dac95ddd9df4c72e3ba75ead40946c8b115ebe Mon Sep 17 00:00:00 2001 From: sofiaivv Date: Tue, 12 Dec 2023 13:30:06 +0400 Subject: [PATCH] done lab6 --- MotorBoat/MotorBoat/BoatGenericCollection.cs | 11 +- MotorBoat/MotorBoat/BoatsGenericStorage.cs | 107 ++++++++++++++++++ MotorBoat/MotorBoat/ExtentionDrawningBoat.cs | 66 +++++++++++ .../MotorBoat/FormBoatCollection.Designer.cs | 69 ++++++++++- MotorBoat/MotorBoat/FormBoatCollection.cs | 47 ++++++++ MotorBoat/MotorBoat/FormBoatCollection.resx | 12 ++ .../MotorBoat/FormBoatConfig.Designer.cs | 8 +- MotorBoat/MotorBoat/SetGeneric.cs | 4 +- 8 files changed, 309 insertions(+), 15 deletions(-) create mode 100644 MotorBoat/MotorBoat/ExtentionDrawningBoat.cs diff --git a/MotorBoat/MotorBoat/BoatGenericCollection.cs b/MotorBoat/MotorBoat/BoatGenericCollection.cs index 953b1d3..c849648 100644 --- a/MotorBoat/MotorBoat/BoatGenericCollection.cs +++ b/MotorBoat/MotorBoat/BoatGenericCollection.cs @@ -69,7 +69,7 @@ namespace MotorBoat.Generics { return false; } - return (bool)collect?._collection.Insert(obj); + return collect?._collection.Insert(obj) ?? false; } /// @@ -78,14 +78,14 @@ namespace MotorBoat.Generics /// /// /// - public static bool operator -(BoatsGenericCollection? collect, int pos) + public static T? operator -(BoatsGenericCollection? collect, int pos) { T? obj = collect._collection[pos]; if (obj != null) { collect._collection.Remove(pos); } - return false; + return obj; } /// @@ -148,5 +148,10 @@ namespace MotorBoat.Generics i++; } } + + /// + /// Получение объектов коллекции + /// + public IEnumerable GetBoats => _collection.GetBoats(); } } \ No newline at end of file diff --git a/MotorBoat/MotorBoat/BoatsGenericStorage.cs b/MotorBoat/MotorBoat/BoatsGenericStorage.cs index fd681f2..20128b7 100644 --- a/MotorBoat/MotorBoat/BoatsGenericStorage.cs +++ b/MotorBoat/MotorBoat/BoatsGenericStorage.cs @@ -23,6 +23,21 @@ namespace MotorBoat.Generics /// public List Keys => _boatStorages.Keys.ToList(); + /// + /// Разделитель для записи ключа и значения элемента словаря + /// + private static readonly char _separatorForKeyValue = '|'; + + /// + /// Разделитель для записей коллекции данных в файл + /// + private readonly char _separatorRecords = ';'; + + /// + /// Разделитель для записи информации по объекту в файл + /// + private static readonly char _separatorForObject = ':'; + /// /// Ширина окна отрисовки /// @@ -82,5 +97,97 @@ namespace MotorBoat.Generics return null; } } + + /// + /// Сохранение информации по лодкам в хранилище в файл + /// + /// Путь и имя файла + /// true - сохранение прошло успешно, false - ошибка при сохранении данных + public bool SaveData(string filename) + { + if (File.Exists(filename)) + { + File.Delete(filename); + } + StringBuilder data = new(); + foreach (KeyValuePair> record in _boatStorages) + { + StringBuilder records = new(); + foreach (DrawningBoat? elem in record.Value.GetBoats) + { + 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($"BoatStorage{Environment.NewLine}{data}"); + } + return true; + */ + } + + /// + /// Загрузка информации по автомобилям в хранилище из файла + /// + /// Путь и имя файла + /// true - загрузка прошла успешно, false - ошибка при загрузке данных + public bool LoadData(string filename) + { + if (!File.Exists(filename)) + { + return false; + } + + using (StreamReader fs = File.OpenText(filename)) + { + string str = fs.ReadLine(); + if (str == null || str.Length == 0) + { + return false; + } + if (!str.StartsWith("BoatStorage")) + { + return false; + } + + _boatStorages.Clear(); + string strs = ""; + + while ((strs = fs.ReadLine()) != null) + { + if (strs == null) + { + return false; + } + + string[] record = strs.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); + if (record.Length != 2) + { + continue; + } + BoatsGenericCollection collection = new(_pictureWidth, _pictureHeight); + string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries); + foreach (string elem in set) + { + DrawningBoat? boat = elem?.CreateDrawningBoat(_separatorForObject, _pictureWidth, _pictureHeight); + if (boat != null) + { + if (!(collection + boat)) + { + return false; + } + } + } + _boatStorages.Add(record[0], collection); + } + return true; + } + } } } diff --git a/MotorBoat/MotorBoat/ExtentionDrawningBoat.cs b/MotorBoat/MotorBoat/ExtentionDrawningBoat.cs new file mode 100644 index 0000000..ecd5f11 --- /dev/null +++ b/MotorBoat/MotorBoat/ExtentionDrawningBoat.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MotorBoat.Entities; + +namespace MotorBoat.DrawningObjects +{ + /// + /// Расширение для класса EntityBoat + /// + public static class ExtentionDrawningBoat + { + /// + /// Создание объекта из строки + /// + /// Строка с данными для создания объекта + /// Разделитель даннных + /// Ширина + /// Высота + /// Объект + public static DrawningBoat? CreateDrawningBoat(this string info, char separatorForObject, int width, int height) + { + string[] strs = info.Split(separatorForObject); + if (strs.Length == 3) + { + return new DrawningBoat(Convert.ToInt32(strs[0]), + Convert.ToInt32(strs[1]), Color.FromName(strs[2]), width, height); + } + if (strs.Length == 7) + { + return new DrawningMotorBoat(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 DrawningBoat drawningBoat, + char separatorForObject) + { + var boat = drawningBoat.EntityBoat; + if (boat == null) + { + return string.Empty; + } + var str = $"{boat.Speed}{separatorForObject}{boat.Weight}{separatorForObject}{boat.BodyColor.Name}"; + + if (boat is not EntityMotorBoat motorBoat) + { + return str; + } + return $"{str}{separatorForObject}{motorBoat.AdditionalColor.Name}" + + $"{separatorForObject}{motorBoat.Glass}{separatorForObject}{motorBoat.Engine}{separatorForObject}"; + } + } +} diff --git a/MotorBoat/MotorBoat/FormBoatCollection.Designer.cs b/MotorBoat/MotorBoat/FormBoatCollection.Designer.cs index 118add4..ce7cbb5 100644 --- a/MotorBoat/MotorBoat/FormBoatCollection.Designer.cs +++ b/MotorBoat/MotorBoat/FormBoatCollection.Designer.cs @@ -39,17 +39,24 @@ listBoxStorages = new ListBox(); ButtonAddObject = new Button(); textBoxStorageName = new MaskedTextBox(); + menuStrip1 = new MenuStrip(); + FileToolStripMenuItem = new ToolStripMenuItem(); + SaveToolStripMenuItem = new ToolStripMenuItem(); + LoadToolStripMenuItem = new ToolStripMenuItem(); + openFileDialog = new OpenFileDialog(); + saveFileDialog = new SaveFileDialog(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit(); groupBoxTools.SuspendLayout(); groupBoxCollections.SuspendLayout(); + menuStrip1.SuspendLayout(); SuspendLayout(); // // pictureBoxCollection // pictureBoxCollection.Dock = DockStyle.Left; - pictureBoxCollection.Location = new Point(0, 0); + pictureBoxCollection.Location = new Point(0, 24); pictureBoxCollection.Name = "pictureBoxCollection"; - pictureBoxCollection.Size = new Size(578, 500); + pictureBoxCollection.Size = new Size(578, 504); pictureBoxCollection.TabIndex = 1; pictureBoxCollection.TabStop = false; // @@ -98,9 +105,9 @@ groupBoxTools.Controls.Add(ButtonAddBoat); groupBoxTools.Controls.Add(maskedTextBoxNumber); groupBoxTools.Dock = DockStyle.Right; - groupBoxTools.Location = new Point(584, 0); + groupBoxTools.Location = new Point(584, 24); groupBoxTools.Name = "groupBoxTools"; - groupBoxTools.Size = new Size(200, 500); + groupBoxTools.Size = new Size(200, 504); groupBoxTools.TabIndex = 0; groupBoxTools.TabStop = false; groupBoxTools.Text = "Инструменты"; @@ -136,7 +143,7 @@ listBoxStorages.Name = "listBoxStorages"; listBoxStorages.Size = new Size(176, 109); listBoxStorages.TabIndex = 2; - listBoxStorages.SelectedIndexChanged += ListBoxObjects_SelectedIndexChanged; + listBoxStorages.SelectedIndexChanged += ButtonRefreshCollection_Click; // // ButtonAddObject // @@ -155,13 +162,54 @@ textBoxStorageName.Size = new Size(176, 23); textBoxStorageName.TabIndex = 0; // + // menuStrip1 + // + menuStrip1.Items.AddRange(new ToolStripItem[] { FileToolStripMenuItem }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Size = new Size(784, 24); + menuStrip1.TabIndex = 2; + menuStrip1.Text = "menuStrip1"; + // + // FileToolStripMenuItem + // + FileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { SaveToolStripMenuItem, LoadToolStripMenuItem }); + FileToolStripMenuItem.Name = "FileToolStripMenuItem"; + FileToolStripMenuItem.Size = new Size(48, 20); + FileToolStripMenuItem.Text = "Файл"; + // + // SaveToolStripMenuItem + // + SaveToolStripMenuItem.Name = "SaveToolStripMenuItem"; + SaveToolStripMenuItem.Size = new Size(180, 22); + SaveToolStripMenuItem.Text = "Сохранение"; + SaveToolStripMenuItem.Click += SaveToolStripMenuItem_Click; + // + // LoadToolStripMenuItem + // + LoadToolStripMenuItem.Name = "LoadToolStripMenuItem"; + LoadToolStripMenuItem.Size = new Size(180, 22); + LoadToolStripMenuItem.Text = "Загрузка"; + LoadToolStripMenuItem.Click += LoadToolStripMenuItem_Click; + // + // openFileDialog + // + openFileDialog.FileName = "openFileDialog1"; + openFileDialog.Filter = "txt file | *.txt"; + // + // saveFileDialog + // + saveFileDialog.Filter = "txt file | *.txt"; + // // FormBoatCollection // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(784, 500); + ClientSize = new Size(784, 528); Controls.Add(groupBoxTools); Controls.Add(pictureBoxCollection); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; Name = "FormBoatCollection"; Text = "Набор лодок"; ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit(); @@ -169,7 +217,10 @@ groupBoxTools.PerformLayout(); groupBoxCollections.ResumeLayout(false); groupBoxCollections.PerformLayout(); + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); ResumeLayout(false); + PerformLayout(); } #endregion @@ -185,5 +236,11 @@ private ListBox listBoxStorages; private Button ButtonAddObject; private MaskedTextBox textBoxStorageName; + private MenuStrip menuStrip1; + private ToolStripMenuItem FileToolStripMenuItem; + private ToolStripMenuItem SaveToolStripMenuItem; + private ToolStripMenuItem LoadToolStripMenuItem; + private OpenFileDialog openFileDialog; + private SaveFileDialog saveFileDialog; } } \ No newline at end of file diff --git a/MotorBoat/MotorBoat/FormBoatCollection.cs b/MotorBoat/MotorBoat/FormBoatCollection.cs index 3171186..df19cfa 100644 --- a/MotorBoat/MotorBoat/FormBoatCollection.cs +++ b/MotorBoat/MotorBoat/FormBoatCollection.cs @@ -129,6 +129,7 @@ namespace MotorBoat if (obj == null) return; + if (obj + drawningBoat) { MessageBox.Show("Объект добавлен"); @@ -189,5 +190,51 @@ namespace MotorBoat pictureBoxCollection.Image = obj.ShowBoats(); } + + /// + /// Обработка нажатия "Сохранение" + /// + /// + /// + private void SaveToolStripMenuItem_Click(object sender, EventArgs e) + { + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + if (_storage.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 (_storage.LoadData(openFileDialog.FileName)) + { + MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + foreach (var collection in _storage.Keys) + { + listBoxStorages.Items.Add(collection); + } + } + else + { + MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } } } \ No newline at end of file diff --git a/MotorBoat/MotorBoat/FormBoatCollection.resx b/MotorBoat/MotorBoat/FormBoatCollection.resx index f298a7b..ea56a88 100644 --- a/MotorBoat/MotorBoat/FormBoatCollection.resx +++ b/MotorBoat/MotorBoat/FormBoatCollection.resx @@ -57,4 +57,16 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 132, 17 + + + 272, 17 + + + 39 + \ No newline at end of file diff --git a/MotorBoat/MotorBoat/FormBoatConfig.Designer.cs b/MotorBoat/MotorBoat/FormBoatConfig.Designer.cs index c60327c..051f373 100644 --- a/MotorBoat/MotorBoat/FormBoatConfig.Designer.cs +++ b/MotorBoat/MotorBoat/FormBoatConfig.Designer.cs @@ -218,9 +218,9 @@ checkBoxEngine.AutoSize = true; checkBoxEngine.Location = new Point(11, 126); checkBoxEngine.Name = "checkBoxEngine"; - checkBoxEngine.Size = new Size(225, 19); + checkBoxEngine.Size = new Size(180, 19); checkBoxEngine.TabIndex = 7; - checkBoxEngine.Text = "Признак наличия защитного стекла"; + checkBoxEngine.Text = "Признак наличия двигателя"; checkBoxEngine.UseVisualStyleBackColor = true; // // checkBoxGlass @@ -228,9 +228,9 @@ checkBoxGlass.AutoSize = true; checkBoxGlass.Location = new Point(11, 99); checkBoxGlass.Name = "checkBoxGlass"; - checkBoxGlass.Size = new Size(180, 19); + checkBoxGlass.Size = new Size(225, 19); checkBoxGlass.TabIndex = 6; - checkBoxGlass.Text = "Признак наличия двигателя"; + checkBoxGlass.Text = "Признак наличия защитного стекла"; checkBoxGlass.UseVisualStyleBackColor = true; // // label2 diff --git a/MotorBoat/MotorBoat/SetGeneric.cs b/MotorBoat/MotorBoat/SetGeneric.cs index 5b122e2..43c788b 100644 --- a/MotorBoat/MotorBoat/SetGeneric.cs +++ b/MotorBoat/MotorBoat/SetGeneric.cs @@ -60,7 +60,7 @@ namespace MotorBoat.Generics /// public bool Insert(T boat, int position) { - if(!(position >= 0 && position <= Count && _places.Count < _maxCount)) + if (!(position >= 0 && position <= Count && _places.Count < _maxCount)) { return false; } @@ -108,7 +108,7 @@ namespace MotorBoat.Generics /// /// /// - public IEnumerable GetBoats(int? maxBoats = null) + public IEnumerable GetBoats(int? maxBoats = null) { for (int i = 0; i < _places.Count; ++i) {