← Повернутись назад

C# Додаток з вкладками та меню

Повний посібник з розробки Windows Forms додатку

Огляд проекту

Цей посібник демонструє створення повноцінного Windows Forms додатку на C# з системою вкладок та меню. Додаток призначений для аналізу тексту та містить всі необхідні елементи сучасного інтерфейсу.

📋 Вимоги до системи

  • .NET 6.0 або вище
  • Visual Studio 2022
  • Windows 10/11
  • Windows Forms App

🎯 Основні цілі

  • Створення інтуїтивного інтерфейсу
  • Реалізація системи меню
  • Робота з вкладками
  • Обробка текстових даних

✨ Основні функції додатка:

  • Меню "Дії" з двома підпунктами для різних операцій з текстом
  • Меню "Reset" для очищення всіх полів введення та результатів
  • Меню "Exit" для безпечного виходу з додатка
  • Система вкладок для організації інтерфейсу
  • Статус бар з інформацією про поточний стан
  • Підрахунок символів і слів у реальному часі
  • Швидкі клавіші для всіх основних функцій

💡 Важливо!

Цей проект демонструє найкращі практики розробки Windows Forms додатків, включаючи обробку помилок, валідацію даних та створення професійного інтерфейсу.

Структура проекту

Проект складається з декількох основних файлів, кожен з яких відповідає за певну частину функціоналу:

Структура файлів проекту PROJECT

TabMenuApp/
├── Form1.cs          // Основна логіка додатка
├── Form1.Designer.cs  // Дизайн форми (автогенерований)
├── Program.cs         // Точка входу в додаток
└── TabMenuApp.csproj   // Файл проекту
     

Опис файлів:

Form1.cs

Містить основну бізнес-логіку додатка, обробники подій та методи для роботи з текстом.

Form1.Designer.cs

Автоматично генерується Visual Studio. Містить код для створення та налаштування візуальних елементів форми.

Program.cs

Точка входу в додаток. Відповідає за запуск головної форми.

TabMenuApp.csproj

Файл проекту, що містить налаштування збірки, залежності та метадані проекту.

Form1.cs - Основна логіка

Цей файл містить всю бізнес-логіку додатка, обробники подій меню та методи для роботи з текстом.

Form1.cs C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TabMenuApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeApplication();
        }

        private void InitializeApplication()
        {
            // Встановлення початкових значень
            tabControl1.SelectedIndex = 0;
            UpdateStatusBar("Додаток готовий до роботи");
        }

        private void UpdateStatusBar(string message)
        {
            toolStripStatusLabel1.Text = message;
            statusStrip1.Refresh();
        }

        // ====== ОБРОБНИКИ ПУНКТІВ МЕНЮ ======

        private void дія1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PerformAction1();
        }

        private void дія2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PerformAction2();
        }

        private void resetToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ResetApplication();
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ExitApplication();
        }

        // ====== ОСНОВНІ ФУНКЦІЇ ======

        private void PerformAction1()
        {
            try
            {
                string inputText = txtInput.Text.Trim();
                
                if (String.IsNullOrEmpty(inputText))
                {
                    MessageBox.Show("Будь ласка, введіть текст для аналізу!", "Попередження", 
                                      MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                // Підрахунок слів та символів
                string[] words = inputText.Split(new[] { ' ', '\t', '\n', '\r' }, 
                                               StringSplitOptions.RemoveEmptyEntries);
                int wordCount = words.Length;
                int charCount = inputText.Length;
                int charNoSpacesCount = inputText.Replace(" ", "").Length;

                // Відображення результату
                txtResult1.Text = $"СТАТИСТИКА ТЕКСТУ:\r\n" +
                                $"===================\r\n" +
                                $"Кількість слів: {wordCount}\r\n" +
                                $"Кількість символів (з пробілами): {charCount}\r\n" +
                                $"Кількість символів (без пробілів): {charNoSpacesCount}\r\n" +
                                $"Середня довжина слова: {(wordCount > 0 ? (charNoSpacesCount / (double)wordCount).ToString("F2") : "0")}";

                // Перехід на вкладку результатів
                tabControl1.SelectedTab = tabPageResult1;
                UpdateStatusBar($"Дія 1 виконана. Знайдено {wordCount} слів");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Помилка при виконанні Дії 1: {ex.Message}", "Помилка", 
                              MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void PerformAction2()
        {
            try
            {
                string inputText = txtInput.Text.Trim();
                
                if (String.IsNullOrEmpty(inputText))
                {
                    MessageBox.Show("Будь ласка, введіть текст для аналізу!", "Попередження", 
                                      MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                // Пошук унікальних слів
                string[] words = inputText.Split(new[] { ' ', '\t', '\n', '\r', '.', ',', '!', '?', ';', ':' }, 
                                               StringSplitOptions.RemoveEmptyEntries);
                
                var uniqueWords = words
                    .Select(word => word.ToLower())
                    .GroupBy(word => word)
                    .Where(g => g.Count() == 1)
                    .Select(g => g.Key)
                    .ToList();

                // Відображення результату
                if (uniqueWords.Count > 0)
                {
                    txtResult2.Text = $"УНІКАЛЬНІ СЛОВА (з'являються 1 раз):\r\n" +
                                    $"===================================\r\n" +
                                    $"{string.Join("\r\n", uniqueWords)}\r\n" +
                                    $"\r\nВсього знайдено: {uniqueWords.Count} слів";
                }
                else
                {
                    txtResult2.Text = "Унікальних слів не знайдено. Всі слова повторюються.";
                }

                // Перехід на вкладку результатів
                tabControl1.SelectedTab = tabPageResult2;
                UpdateStatusBar($"Дія 2 виконана. Знайдено {uniqueWords.Count} унікальних слів");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Помилка при виконанні Дії 2: {ex.Message}", "Помилка", 
                              MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void ResetApplication()
        {
            DialogResult result = MessageBox.Show("Ви впевнені, що хочете очистити всі дані?", 
                                                "Підтвердження скидання", 
                                                MessageBoxButtons.YesNo, 
                                                MessageBoxIcon.Question);
            
            if (result == DialogResult.Yes)
            {
                // Очищення полів
                txtInput.Clear();
                txtResult1.Clear();
                txtResult2.Clear();

                // Повернення на головну вкладку
                tabControl1.SelectedTab = tabPageInput;
                
                // Оновлення статусу
                UpdateStatusBar("Всі дані скинуті");
                
                MessageBox.Show("Додаток очищено!", "Інформація", 
                              MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void ExitApplication()
        {
            DialogResult result = MessageBox.Show("Ви впевнені, що хочете вийти з додатка?", 
                                                "Підтвердження виходу", 
                                                MessageBoxButtons.YesNo, 
                                                MessageBoxIcon.Question);
            
            if (result == DialogResult.Yes)
            {
                UpdateStatusBar("Завершення роботи додатка...");
                Application.Exit();
            }
        }
    }
}

🔍 Ключові моменти коду:

  • Обробка помилок - всі методи використовують try-catch блоки
  • Валідація даних - перевірка наявності тексту перед обробкою
  • LINQ запити - для ефективної роботи з колекціями даних
  • Діалогові вікна - для інформації та підтвердження дій
  • Оновлення статусу - інформаційна панель показує поточний стан

Form1.Designer.cs - Візуальний дизайн

Цей файл автоматично генерується Visual Studio Designer і містить код для створення всіх візуальних елементів форми.

Form1.Designer.cs (фрагмент) C#

namespace TabMenuApp
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.ComponentModel.ComponentResourceManager resources = 
                new System.ComponentModel.ComponentResourceManager(typeof(Form1));
            
            // Створення MenuStrip
            this.menuStrip1 = new System.Windows.Forms.MenuStrip();
            this.діїToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.дія1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.дія2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.resetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            
            // Створення TabControl
            this.tabControl1 = new System.Windows.Forms.TabControl();
            this.tabPageInput = new System.Windows.Forms.TabPage();
            this.tabPageResult1 = new System.Windows.Forms.TabPage();
            this.tabPageResult2 = new System.Windows.Forms.TabPage();
            
            // Налаштування MenuStrip
            this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.діїToolStripMenuItem});
            
            this.діїToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.дія1ToolStripMenuItem,
            this.дія2ToolStripMenuItem,
            this.resetToolStripMenuItem,
            this.exitToolStripMenuItem});
            
            this.дія1ToolStripMenuItem.Text = "Дія &1";
            this.дія1ToolStripMenuItem.ShortcutKeys = (System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D1));
            this.дія1ToolStripMenuItem.Click += new System.EventHandler(this.дія1ToolStripMenuItem_Click);
            
            // Аналогічно налаштовуються інші елементи...
            
            // Налаштування форми
            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(684, 433);
            this.Controls.Add(this.tabControl1);
            this.Controls.Add(this.menuStrip1);
            this.MainMenuStrip = this.menuStrip1;
            this.Name = "Form1";
            this.Text = "Аналізатор тексту - Додаток з вкладками та меню";
            this.menuStrip1.ResumeLayout(false);
            this.menuStrip1.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();
        }

        private System.Windows.Forms.MenuStrip menuStrip1;
        private System.Windows.Forms.ToolStripMenuItem діїToolStripMenuItem;
        private System.Windows.Forms.ToolStripMenuItem дія1ToolStripMenuItem;
        private System.Windows.Forms.ToolStripMenuItem дія2ToolStripMenuItem;
        private System.Windows.Forms.ToolStripMenuItem resetToolStripMenuItem;
        private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
        private System.Windows.Forms.TabControl tabControl1;
        // ... інші поля
    }
}
    

⚠️ Увага!

Файл Form1.Designer.cs автоматично генерується Visual Studio. Не редагуйте його вручну, оскільки це може призвести до проблем у роботі дизайнера форм. Всі зміни в інтерфейсі потрібно робити через візуальний редактор.

Program.cs - Точка входу

Цей файл містить точку входу в додаток - метод Main(), який запускає головну форму.

Program.cs C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TabMenuApp
{
    internal static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Пояснення коду:

Application.EnableVisualStyles()

Вмикає візуальні стилі для елементів управління, що робить інтерфейс більш сучасним та привабливим.

Application.SetCompatibleTextRenderingDefault(false)

Встановлює GDI+ як за замовчуванням для відображення тексту, що забезпечує кращу якість відображення.

Application.Run(new Form1())

Запускає цикл повідомлень Windows Forms і відображає головну форму додатка.

[STAThread]

Атрибут, що вказує на те, що потокова модель COM для додатка є Single-Threaded Apartment. Це обов'язкова вимога для Windows Forms додатків.

Функціонал додатка

Додаток реалізує всі необхідні функції згідно з технічним завданням та додаткові можливості для покращення користувацького досвіду.

Основні функції

🎯 Меню "Дії"

  • Дія 1 - Статистика тексту: підрахунок слів, символів (з пробілами та без), середня довжина слова
  • Дія 2 - Пошук унікальних слів: знаходження слів, що зустрічаються лише один раз у тексті
  • Швидкі клавіші - Ctrl+1 для Дії 1, Ctrl+2 для Дії 2

🔄 Меню "Reset"

  • Очищення всіх полів введення
  • Очищення всіх результатів
  • Повернення на головну вкладку
  • Підтвердження дії через діалогове вікно
  • Швидка клавіша: Ctrl+R

🚪 Меню "Exit"

  • Безпечний вихід з додатка
  • Підтвердження виходу через діалогове вікно
  • Оновлення статусу перед закриттям
  • Швидка клавіша: Ctrl+Q

Додаткові функції

📊 Система вкладок

  • Введення тексту - основна вкладка для введення даних
  • Результат Дії 1 - відображення статистики тексту
  • Результат Дії 2 - відображення унікальних слів
  • Автоматичне перемикання на відповідну вкладку після виконання дії

ℹ️ Інформаційні елементи

  • Статус бар - відображення поточного стану додатка
  • Лічильники - реальний час підрахунку символів та слів
  • ToolTips - підказки для елементів інтерфейсу
  • Діалогові вікна - інформаційні повідомлення та підтвердження

🛡️ Обробка помилок

  • Перевірка наявності тексту перед обробкою
  • Try-catch блоки в усіх основних методах
  • Інформативні повідомлення про помилки
  • Запобігання аварійному завершенню додатка

Технічні особливості

📐 Архітектура додатка

Додаток використовує стандартну архітектуру Windows Forms з розділенням відповідальностей між файлами Form1.cs (логіка) та Form1.Designer.cs (інтерфейс).

🔧 Використані технології

  • Windows Forms - для створення графічного інтерфейсу
  • LINQ - для ефективної роботи з колекціями даних
  • String manipulation - для обробки текстової інформації
  • Event handling - для обробки дій користувача