diff --git a/AccordionBus/AccordionBus/BusCollectionForm.Designer.cs b/AccordionBus/AccordionBus/BusCollectionForm.Designer.cs
index 849a532..00731c4 100644
--- a/AccordionBus/AccordionBus/BusCollectionForm.Designer.cs
+++ b/AccordionBus/AccordionBus/BusCollectionForm.Designer.cs
@@ -39,8 +39,15 @@
buttonRemoveBus = new Button();
buttonAddBus = new Button();
labelTools = new Label();
+ menuStrip = new MenuStrip();
+ файлToolStripMenuItem = new ToolStripMenuItem();
+ saveToolStripMenuItem = new ToolStripMenuItem();
+ LoadToolStripMenuItem = new ToolStripMenuItem();
+ openFileDialog = new OpenFileDialog();
+ saveFileDialog = new SaveFileDialog();
((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit();
panelTools.SuspendLayout();
+ menuStrip.SuspendLayout();
SuspendLayout();
//
// pictureBoxCollection
@@ -150,19 +157,64 @@
labelTools.TabIndex = 0;
labelTools.Text = "Инструменты";
//
+ // menuStrip
+ //
+ menuStrip.Dock = DockStyle.None;
+ menuStrip.Items.AddRange(new ToolStripItem[] { файлToolStripMenuItem });
+ menuStrip.Location = new Point(0, 0);
+ menuStrip.Name = "menuStrip";
+ menuStrip.Size = new Size(176, 24);
+ menuStrip.TabIndex = 2;
+ menuStrip.Text = "menuStrip";
+ //
+ // файлToolStripMenuItem
+ //
+ файлToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { saveToolStripMenuItem, LoadToolStripMenuItem });
+ файлToolStripMenuItem.Name = "файлToolStripMenuItem";
+ файлToolStripMenuItem.Size = new Size(48, 20);
+ файлToolStripMenuItem.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 = "openFileDialog";
+ openFileDialog.Filter = "txt file | *.txt";
+ //
+ // saveFileDialog
+ //
+ saveFileDialog.Filter = "txt file | *.txt";
+ //
// BusCollectionForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(884, 461);
+ Controls.Add(menuStrip);
Controls.Add(panelTools);
Controls.Add(pictureBoxCollection);
+ MainMenuStrip = menuStrip;
Name = "BusCollectionForm";
Text = "BusCollectionForm";
((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit();
panelTools.ResumeLayout(false);
panelTools.PerformLayout();
+ menuStrip.ResumeLayout(false);
+ menuStrip.PerformLayout();
ResumeLayout(false);
+ PerformLayout();
}
#endregion
@@ -178,5 +230,11 @@
private Button buttonAddObject;
private Button buttonDeleteObject;
private ListBox listBoxStorages;
+ private MenuStrip menuStrip;
+ private ToolStripMenuItem файлToolStripMenuItem;
+ private ToolStripMenuItem saveToolStripMenuItem;
+ private ToolStripMenuItem LoadToolStripMenuItem;
+ private OpenFileDialog openFileDialog;
+ private SaveFileDialog saveFileDialog;
}
}
\ No newline at end of file
diff --git a/AccordionBus/AccordionBus/BusCollectionForm.cs b/AccordionBus/AccordionBus/BusCollectionForm.cs
index 5534fd4..91f1579 100644
--- a/AccordionBus/AccordionBus/BusCollectionForm.cs
+++ b/AccordionBus/AccordionBus/BusCollectionForm.cs
@@ -191,5 +191,46 @@ namespace AccordionBus
pictureBoxCollection.Image = obj.ShowBuses();
}
+
+ ///
+ /// Обработка нажатия "Сохранение"
+ ///
+ ///
+ ///
+ 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))
+ {
+ ReloadObjects();
+ MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ {
+ MessageBox.Show("Не удалось загрузить данные", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
}
}
diff --git a/AccordionBus/AccordionBus/BusCollectionForm.resx b/AccordionBus/AccordionBus/BusCollectionForm.resx
index a395bff..bebf4d9 100644
--- a/AccordionBus/AccordionBus/BusCollectionForm.resx
+++ b/AccordionBus/AccordionBus/BusCollectionForm.resx
@@ -117,4 +117,13 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
+
+ 132, 17
+
+
+ 265, 17
+
\ No newline at end of file
diff --git a/AccordionBus/AccordionBus/BusGenericCollection.cs b/AccordionBus/AccordionBus/BusGenericCollection.cs
index f01a9c9..be771bd 100644
--- a/AccordionBus/AccordionBus/BusGenericCollection.cs
+++ b/AccordionBus/AccordionBus/BusGenericCollection.cs
@@ -42,6 +42,11 @@ namespace AccordionBus.Generics
///
private readonly SetGeneric _collection;
+ ///
+ /// Получение объектов коллеции
+ ///
+ public IEnumerable GetBuses => _collection.GetBuses();
+
///
/// Конструктор
///
diff --git a/AccordionBus/AccordionBus/BusGenericStorage.cs b/AccordionBus/AccordionBus/BusGenericStorage.cs
index 63634a1..56ce81d 100644
--- a/AccordionBus/AccordionBus/BusGenericStorage.cs
+++ b/AccordionBus/AccordionBus/BusGenericStorage.cs
@@ -34,6 +34,21 @@ namespace AccordionBus
///
private readonly int _pictureHeight;
+ ///
+ /// Разделитель для записи ключа и значения элемента словаря
+ ///
+ private static readonly char _separatorForKeyValue = '|';
+
+ ///
+ /// Разделитель для записей коллекции данных в файл
+ ///
+ private readonly char _separatorRecords = ';';
+
+ ///
+ /// Разделитель для записи информации по объекту в файл
+ ///
+ private static readonly char _separatorForObject = ':';
+
///
/// Конструктор
///
@@ -88,5 +103,95 @@ namespace AccordionBus
return null;
}
}
+
+ ///
+ /// Сохранение информации по автобусам в хранилище в файл
+ ///
+ /// Путь и имя файла
+ /// true - сохранение прошло успешно, false - ошибка при сохранении данных
+ public bool SaveData(string filename)
+ {
+ if (File.Exists(filename))
+ {
+ File.Delete(filename);
+ }
+
+ StringBuilder data = new();
+ foreach (KeyValuePair> record in _busStorages)
+ {
+ StringBuilder records = new();
+ foreach (DrawingBus? elem in record.Value.GetBuses)
+ {
+ 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($"BusStorage{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 line = reader.ReadLine();
+ if (line == null || line.Length == 0 || !line.StartsWith("BusStorage"))
+ {
+ // Если строка пустая
+ // Или если нет записи "BusStorage", то это не те данные
+ return false;
+ }
+
+ _busStorages.Clear();
+
+ line = reader.ReadLine();
+ while (line != null && line.Length != 0)
+ {
+ string[] record = line.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries);
+ if (record.Length != 2)
+ {
+ continue;
+ }
+
+ BusGenericCollection collection = new(_pictureWidth, _pictureHeight);
+ string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries);
+ foreach (string elem in set)
+ {
+ DrawingBus? bus = elem?.CreateDrawingBus(_separatorForObject, _pictureWidth, _pictureHeight);
+ if (bus != null)
+ {
+ if (collection + bus == -1)
+ {
+ return false;
+ }
+ }
+ }
+ _busStorages.Add(record[0], collection);
+ line = reader.ReadLine();
+ }
+ }
+
+ return true;
+ }
}
}
diff --git a/AccordionBus/AccordionBus/ExtensionDrawingBus.cs b/AccordionBus/AccordionBus/ExtensionDrawingBus.cs
new file mode 100644
index 0000000..dcff4d6
--- /dev/null
+++ b/AccordionBus/AccordionBus/ExtensionDrawingBus.cs
@@ -0,0 +1,69 @@
+using AccordionBus.Entities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AccordionBus.Drawings
+{
+ ///
+ /// Расширение для класса EntityBus
+ ///
+ public static class ExtensionDrawingBus
+ {
+ ///
+ /// Создание объекта из строки
+ ///
+ /// Строка с данными для создания объекта
+ /// Разделитель данных
+ /// Ширина
+ /// Высота
+ /// Объект
+ public static DrawingBus? CreateDrawingBus(this string info, char separatorForObject, int width, int height)
+ {
+ string[] strs = info.Split(separatorForObject);
+ if (strs.Length == 3)
+ {
+ return new DrawingBus(Convert.ToInt32(strs[0]),
+ Convert.ToInt32(strs[1]),
+ Color.FromName(strs[2]),
+ width, height);
+ }
+ if (strs.Length == 6)
+ {
+ return new DrawingAccordionBus(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 DrawingBus drawingBus, char separatorForObject)
+ {
+ var bus = drawingBus.EntityBus;
+ if (bus == null)
+ {
+ return string.Empty;
+ }
+
+ var str = $"{bus.Speed}{separatorForObject}{bus.Weight}{separatorForObject}{bus.BodyColor.Name}";
+ if (bus is not EntityAccordionBus accordionBus)
+ {
+ return str;
+ }
+ return $"{str}{separatorForObject}{accordionBus.AdditionalColor.Name}{separatorForObject}{accordionBus.AdditionalBody}{separatorForObject}{accordionBus.AdditionalDoor}";
+ }
+ }
+}
diff --git a/AccordionBus/AccordionBus/SetGeneric.cs b/AccordionBus/AccordionBus/SetGeneric.cs
index f46d2cc..8c07418 100644
--- a/AccordionBus/AccordionBus/SetGeneric.cs
+++ b/AccordionBus/AccordionBus/SetGeneric.cs
@@ -119,7 +119,7 @@ namespace AccordionBus.Generics
///
public IEnumerable GetBuses(int? maxBuses = null)
{
- for (int i = 0; i < _maxCount; i++)
+ for (int i = 0; i < _places.Count; i++)
{
yield return _places[i];
if (maxBuses.HasValue && i == maxBuses.Value)
diff --git a/data.txt b/data.txt
new file mode 100644
index 0000000..535404e
--- /dev/null
+++ b/data.txt
@@ -0,0 +1,3 @@
+BusStorage
+0|100:100:Magenta:Blue:True:False;100:100:Yellow;
+1|100:100:Yellow:Magenta:True:True;100:100:Blue;