diff --git a/Lab/CarsGenericCollection.cs b/Lab/CarsGenericCollection.cs index e9a87a8..ab86536 100644 --- a/Lab/CarsGenericCollection.cs +++ b/Lab/CarsGenericCollection.cs @@ -18,6 +18,8 @@ namespace Lab.Generics private readonly int _placeSizeWidth = 110; private readonly int _placeSizeHeight = 80; private readonly SetGeneric _collection; + + public IEnumerable GetCars => _collection.GetCars(); public CarsGenericCollection(int picWidth, int picHeight) { int width = picWidth / _placeSizeWidth; diff --git a/Lab/CarsGenericStorage.cs b/Lab/CarsGenericStorage.cs index 4ae6a5b..ea2296b 100644 --- a/Lab/CarsGenericStorage.cs +++ b/Lab/CarsGenericStorage.cs @@ -15,6 +15,11 @@ namespace Lab.Generics public List Keys => _carStorages.Keys.ToList(); private readonly int _pictureWidth; private readonly int _pictureHeight; + + private static readonly char _separatorForKeyValue = '|'; + private readonly char _separatorRecords = ';'; + private static readonly char _separatorForObject = ':'; + public CarsGenericStorage(int pictureWidth, int pictureHeight) { _carStorages = new Dictionary>(); @@ -43,5 +48,85 @@ namespace Lab.Generics } } + public bool SaveData(string filename) + { + if (File.Exists(filename)) + { + File.Delete(filename); + } + StringBuilder data = new(); + foreach (KeyValuePair> record in _carStorages) + { + StringBuilder records = new(); + foreach (DrawTanker? elem in record.Value.GetCars) + { + records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); + } + data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}"); + } + if (data.Length == 0) + { + return false; + } + using FileStream fs = new(filename, FileMode.Create); + byte[] info = new + UTF8Encoding(true).GetBytes($"CarStorage{Environment.NewLine}{data}"); + fs.Write(info, 0, info.Length); + return true; + } + + public bool LoadData(string filename) + { + if (!File.Exists(filename)) + { + return false; + } + string bufferTextFromFile = ""; + using (FileStream fs = new(filename, FileMode.Open)) + { + byte[] b = new byte[fs.Length]; + UTF8Encoding temp = new(true); + while (fs.Read(b, 0, b.Length) > 0) + { + bufferTextFromFile += temp.GetString(b); + } + } + var strs = bufferTextFromFile.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); + if (strs == null || strs.Length == 0) + { + return false; + } + if (!strs[0].StartsWith("CarStorage")) + { + return false; + } + _carStorages.Clear(); + foreach (string data in strs) + { + string[] record = data.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); + if (record.Length != 2) + { + continue; + } + CarsGenericCollection collection = new(_pictureWidth, _pictureHeight); + string[] set = record[1].Split(_separatorRecords, StringSplitOptions.RemoveEmptyEntries); + foreach (string elem in set) + { + DrawTanker? car = + elem?.CreateDrawTanker(_separatorForObject, _pictureWidth, _pictureHeight); + if (car != null) + { + if (!(collection + car)) + { + return false; + } + } + } + _carStorages.Add(record[0], collection); + } + return true; + } + + } } diff --git a/Lab/CollectionsFrame.Designer.cs b/Lab/CollectionsFrame.Designer.cs index 5971286..7267d81 100644 --- a/Lab/CollectionsFrame.Designer.cs +++ b/Lab/CollectionsFrame.Designer.cs @@ -41,6 +41,10 @@ CarTextBox = new TextBox(); label1 = new Label(); DrawTank = new PictureBox(); + openFileDialog = new OpenFileDialog(); + saveFileDialog = new SaveFileDialog(); + SaveButton = new Button(); + LoadButton = new Button(); panel1.SuspendLayout(); panel2.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)DrawTank).BeginInit(); @@ -48,6 +52,8 @@ // // panel1 // + panel1.Controls.Add(LoadButton); + panel1.Controls.Add(SaveButton); panel1.Controls.Add(panel2); panel1.Controls.Add(UpdateButton); panel1.Controls.Add(DeleteButton); @@ -120,7 +126,7 @@ // // UpdateButton // - UpdateButton.Location = new Point(10, 401); + UpdateButton.Location = new Point(6, 383); UpdateButton.Name = "UpdateButton"; UpdateButton.Size = new Size(228, 37); UpdateButton.TabIndex = 4; @@ -130,7 +136,7 @@ // // DeleteButton // - DeleteButton.Location = new Point(10, 358); + DeleteButton.Location = new Point(6, 340); DeleteButton.Name = "DeleteButton"; DeleteButton.Size = new Size(228, 37); DeleteButton.TabIndex = 3; @@ -140,7 +146,7 @@ // // AddButton // - AddButton.Location = new Point(10, 282); + AddButton.Location = new Point(6, 264); AddButton.Name = "AddButton"; AddButton.Size = new Size(228, 37); AddButton.TabIndex = 2; @@ -150,7 +156,7 @@ // // CarTextBox // - CarTextBox.Location = new Point(10, 325); + CarTextBox.Location = new Point(6, 307); CarTextBox.Name = "CarTextBox"; CarTextBox.Size = new Size(228, 27); CarTextBox.TabIndex = 1; @@ -173,6 +179,30 @@ DrawTank.TabIndex = 1; DrawTank.TabStop = false; // + // openFileDialog + // + openFileDialog.FileName = "openFileDialog1"; + // + // SaveButton + // + SaveButton.Location = new Point(6, 426); + SaveButton.Name = "SaveButton"; + SaveButton.Size = new Size(109, 44); + SaveButton.TabIndex = 6; + SaveButton.Text = "Сохранить"; + SaveButton.UseVisualStyleBackColor = true; + SaveButton.Click += SaveToolStripMenuItem_Click; + // + // LoadButton + // + LoadButton.Location = new Point(121, 426); + LoadButton.Name = "LoadButton"; + LoadButton.Size = new Size(113, 44); + LoadButton.TabIndex = 7; + LoadButton.Text = "Загрузить"; + LoadButton.UseVisualStyleBackColor = true; + LoadButton.Click += LoadToolStripMenuItem_Click; + // // CollectionsFrame // AutoScaleDimensions = new SizeF(8F, 20F); @@ -205,5 +235,9 @@ private Button AddCollectButton; private TextBox SetTextBox; private Label label2; + private OpenFileDialog openFileDialog; + private SaveFileDialog saveFileDialog; + private Button LoadButton; + private Button SaveButton; } } \ No newline at end of file diff --git a/Lab/CollectionsFrame.cs b/Lab/CollectionsFrame.cs index 93f3118..4feb258 100644 --- a/Lab/CollectionsFrame.cs +++ b/Lab/CollectionsFrame.cs @@ -16,17 +16,11 @@ namespace Lab public partial class CollectionsFrame : Form { private readonly CarsGenericStorage _storage; - /// - /// Конструктор - /// public CollectionsFrame() { InitializeComponent(); _storage = new CarsGenericStorage(DrawTank.Width, DrawTank.Height); } - /// - /// Заполнение listBoxObjects - /// private void ReloadObjects() { int index = CollectionListBox.SelectedIndex; @@ -46,11 +40,6 @@ namespace Lab CollectionListBox.SelectedIndex = index; } } - /// - /// Добавление набора в коллекцию - /// - /// - /// private void ButtonAddObject_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(SetTextBox.Text)) @@ -62,22 +51,12 @@ namespace Lab _storage.AddSet(SetTextBox.Text); ReloadObjects(); } - /// - /// Выбор набора - /// - /// - /// private void ListBoxObjects_SelectedIndexChanged(object sender, EventArgs e) { DrawTank.Image = _storage[CollectionListBox.SelectedItem?.ToString() ?? string.Empty]?.ShowCars(); } - /// - /// Удаление набора - /// - /// - /// private void ButtonDelObject_Click(object sender, EventArgs e) { if (CollectionListBox.SelectedIndex == -1) @@ -92,15 +71,10 @@ namespace Lab ReloadObjects(); } } - /// - /// Добавление объекта в набор - /// - /// - /// - + private void AddTanker(DrawTanker tanker) { - + var obj = _storage[CollectionListBox.SelectedItem.ToString() ?? string.Empty]; if (obj == null) { @@ -126,11 +100,6 @@ namespace Lab form.Show(); form.AddEvent(AddTanker); } - /// - /// Удаление объекта из набора - /// - /// - /// private void ButtonRemoveCar_Click(object sender, EventArgs e) { if (CollectionListBox.SelectedIndex == -1) @@ -159,11 +128,6 @@ namespace Lab MessageBox.Show("Не удалось удалить объект"); } } - /// - /// Обновление рисунка по набору - /// - /// - /// private void ButtonRefreshCollection_Click(object sender, EventArgs e) { @@ -179,5 +143,35 @@ namespace Lab } DrawTank.Image = obj.ShowCars(); } + 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/Lab/CollectionsFrame.resx b/Lab/CollectionsFrame.resx index af32865..ceedf48 100644 --- a/Lab/CollectionsFrame.resx +++ b/Lab/CollectionsFrame.resx @@ -117,4 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 187, 17 + \ No newline at end of file diff --git a/Lab/ExtentionDrawingTanker.cs b/Lab/ExtentionDrawingTanker.cs new file mode 100644 index 0000000..05a42b5 --- /dev/null +++ b/Lab/ExtentionDrawingTanker.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Lab.Entities; +using Lab.DrawningObjects; + +namespace Lab +{ + public static class ExtentionDrawingTanker + { + public static DrawTanker? CreateDrawTanker(this string info, char separatorForObject, int width, int height) + { + string[] strs = info.Split(separatorForObject); + if (strs.Length == 3) + { + return new DrawTanker(Convert.ToInt32(strs[0]), + Convert.ToInt32(strs[1]), Color.FromName(strs[2]), width, height); + } + if (strs.Length == 7) + { + return new DrawGasolineTanker(Convert.ToInt32(strs[0]), + Convert.ToInt32(strs[1]), + Color.FromName(strs[2]), + Color.FromName(strs[3]), + Convert.ToBoolean(strs[4]), + Convert.ToBoolean(strs[5]), + Convert.ToBoolean(strs[6]), width, height); + } + return null; + } + + public static string GetDataForSave(this DrawTanker tanker, char separatorForObject) + { + var Tanker = tanker._gasolineTanker; + if (Tanker == null) + { + return string.Empty; + } + var str = $"{Tanker.Speed}{separatorForObject}{Tanker.Weight}{separatorForObject}{Tanker.BodyColor.Name}"; + if (Tanker is not GasolineTanker gasTanker) + { + return str; + } + return $"{str}{separatorForObject}{gasTanker.AdditionalColor.Name}{separatorForObject}{gasTanker.BodyKit}{separatorForObject}{gasTanker.Wing}{separatorForObject}{gasTanker.SportLine}"; + } + + } +}