Загрузка данных


Это итоговое комплексное задание, объединяющее множество компонентов Windows Forms. Чтобы реализовать всё аккуратно и логично, лучше разбить проект на две формы:
 1. **LoginForm** — форма входа (логин, пароль и полоса загрузки).
 2. **MainForm** — главная форма, которая открывается после успешного входа и содержит меню, вкладки, запуск файлов и поздравления.
Ниже представлена пошаговая инструкция с дизайном интерфейса и кодом для каждого ключевого пункта задания.
### Шаг 1. Создание формы входа (LoginForm)
Создайте новую форму или переименуйте базовую в LoginForm.
**Элементы на форме:**
 * TextBox с именем txtLogin (для логина).
 * TextBox с именем txtPassword. В свойствах установите UseSystemPasswordChar = True (чтобы скрывать символы пароля).
 * Button с именем btnLogin и текстом «Войти».
 * ProgressBar с именем progressBar1.
 * Timer с именем loginTimer. В свойствах установите Interval = 50 (скорость заполнения полосы загрузки).
**Код для LoginForm.cs:**
```csharp
using System;
using System.Windows.Forms;

namespace FinalProject
{
    public partial class LoginForm : Form
    {
        public LoginForm()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            // Простая проверка логина и пароля
            if (txtLogin.Text == "admin" && txtPassword.Text == "1234")
            {
                // Если верно, запускаем таймер имитации загрузки
                loginTimer.Start();
            }
            else
            {
                MessageBox.Show("Неверный логин или пароль!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void loginTimer_Tick(object sender, EventArgs e)
        {
            if (progressBar1.Value < 100)
            {
                progressBar1.Value += 5; // Заполняем полосу загрузки
            }
            else
            {
                loginTimer.Stop();
                this.Hide(); // Прячем форму входа
                
                MainForm mainForm = new MainForm();
                mainForm.ShowDialog(); // Открываем главную форму
                
                this.Close(); // Закрываем приложение после закрытия главной формы
            }
        }
    }
}

```
### Шаг 2. Создание главной формы (MainForm)
Создайте вторую форму и назовите её MainForm.
**Размещение основных элементов:**
 1. **MenuStrip** (menuStrip1): Перетащите на форму. Создайте структуру меню:
   * *Файл* -> *Открыть отчет Word*
   * *Лабораторные* -> *Лабораторная 1*, *Лабораторная 2*, *Кредитный калькулятор*
   * *О программе* (для вывода данных о разработчике)
 2. **StatusStrip** (statusStrip1): Добавьте элемент. Внутри него добавьте StatusLabel с именем lblTime (для часов) и еще один для «другой информации».
 3. **Timer** (statusTimer): Для обновления времени в строке состояния. Enabled = True, Interval = 1000.
 4. **TabControl** (tabControl1): Добавьте на форму.
   * На первую вкладку (TabPage1) мы поместим интерфейс «Поздравления».
 5. **ContextMenuStrip** (contextMenuStrip1): Перетащите на форму. Добавьте туда пункты (например, «Очистить всё» или «Запустить калькулятор»). Привяжите его к самой форме в свойстве формы ContextMenuStrip.
### Шаг 3. Реализация логики работы с файлами (.exe и .doc) и интерфейса
Для открытия сторонних программ и документов C# использует пространство имен System.Diagnostics.
Положите ваши .exe файлы прошлых лабораторных работ и файл отчета report.docx в папку проекта bin/Debug/ (или укажите к ним полные пути).
**Код для MainForm.cs:**
```csharp
using System;
using System.Diagnostics; // Важно для запуска процессов
using System.IO;
using System.Windows.Forms;

namespace FinalProject
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            
            // Инициализация данных разработчика
            lblDeveloperInfo.Text = "Разработчик: Иванов И.И.\nГруппа: ЭВМ-22";
        }

        // 5) Строка состояния с текущим временем
        private void statusTimer_Tick(object sender, EventArgs e)
        {
            lblTime.Text = "Текущее время: " + DateTime.Now.ToLongTimeString();
        }

        // 1) Данные о разработчике (через пункт меню)
        private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Программа объединения лабораторных работ.\nРазработчик: Студент Иванов И.И.", "О разработчике");
        }

        // 6) ОТЧЕТ - Загрузка документа Word
        private void открытьОтчетWordToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string docPath = Path.Combine(Application.StartupPath, "report.docx");

            if (File.Exists(docPath))
            {
                // Открывает документ в MS Word по умолчанию в системе
                Process.Start(new ProcessStartInfo(docPath) { UseShellExecute = true });
            }
            else
            {
                MessageBox.Show("Файл отчета 'report.docx' не найден в папке приложения!", "Ошибка");
            }
        }

        // 4, 7) Меню со вкладками / Меню MenuStrip - запуск .exe файлов
        private void лабораторная1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string exePath = Path.Combine(Application.StartupPath, "Lab1.exe");
            LaunchExe(exePath);
        }

        private void лабораторная2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string exePath = Path.Combine(Application.StartupPath, "Lab2.exe");
            LaunchExe(exePath);
        }

        // Вспомогательный метод запуска
        private void LaunchExe(string path)
        {
            if (File.Exists(path))
            {
                Process.Start(path);
            }
            else
            {
                MessageBox.Show($"Файл по пути {path} не найден!", "Ошибка запуска");
            }
        }

        // 8) Переход на другую форму (если требуется вызвать еще одно окно)
        private void btnOpenSubForm_Click(object sender, EventArgs e)
        {
            Form subForm = new Form();
            subForm.Text = "Дополнительное окно";
            subForm.Show();
        }

        // 10) Выполнение операции через правую кнопку мыши (Контекстное меню)
        private void очиститьФормуToolStripMenuItem_Click(object sender, EventArgs e)
        {
            txtName.Text = "";
            cmbHolidays.SelectedIndex = -1;
            lblCongratulationResult.Text = "Результат поздравления...";
        }

        // 11) Поздравления с выбором имени, праздника и подарка
        private void btnGenerateCongratulation_Click(object sender, EventArgs e)
        {
            string name = txtName.Text;
            string holiday = cmbHolidays.SelectedItem?.ToString() ?? "праздником";
            string present = txtPresent.Text;

            if (string.IsNullOrEmpty(name))
            {
                MessageBox.Show("Введите имя для поздравления!");
                return;
            }

            lblCongratulationResult.Text = $"Дорогой(ая) {name}!\nПоздравляю тебя с {holiday}!\nЖелаю счастья, здоровья и дарю тебе {present}!";
        }
    }
}

```
### Шаг 4. Добавление изображений возле названий (Пункт 9)
Чтобы добавить иконки и картинки возле пунктов меню или кнопок:
 1. Выберите элемент (например, пункт меню лабораторная1ToolStripMenuItem).
 2. В панели свойств найдите поле **Image** и нажмите кнопку с троеточием ....
 3. Выберите «Локальный ресурс» -> «Импорт» и выберите небольшую картинку/иконку формата .png или .ico с вашего компьютера.
### Как заставить проект работать корректно:
 1. Убедитесь, что в файле Program.cs главной точкой входа назначена первая форма: Application.Run(new LoginForm());.
 2. Перенесите готовые скомпилированные .exe файлы от ваших старых лабораторных работ (переименовав их в Lab1.exe, Lab2.exe и т.д.) и ваш вордовский документ report.docx прямо в папку, где лежит исполняемый файл текущего проекта (обычно это ВашПроект/bin/Debug/ или bin/Release/). Тогда относительные пути Path.Combine(Application.StartupPath, ...) сработают безошибочно.