Огляд проекту
Цей посібник демонструє створення повноцінного Windows Forms додатку на C# з системою вкладок та меню. Додаток призначений для аналізу тексту та містить всі необхідні елементи сучасного інтерфейсу.
📋 Вимоги до системи
- .NET 6.0 або вище
- Visual Studio 2022
- Windows 10/11
- Windows Forms App
🎯 Основні цілі
- Створення інтуїтивного інтерфейсу
- Реалізація системи меню
- Робота з вкладками
- Обробка текстових даних
✨ Основні функції додатка:
- Меню "Дії" з двома підпунктами для різних операцій з текстом
- Меню "Reset" для очищення всіх полів введення та результатів
- Меню "Exit" для безпечного виходу з додатка
- Система вкладок для організації інтерфейсу
- Статус бар з інформацією про поточний стан
- Підрахунок символів і слів у реальному часі
- Швидкі клавіші для всіх основних функцій
💡 Важливо!
Цей проект демонструє найкращі практики розробки Windows Forms додатків, включаючи обробку помилок, валідацію даних та створення професійного інтерфейсу.
Структура проекту
Проект складається з декількох основних файлів, кожен з яких відповідає за певну частину функціоналу:
TabMenuApp/
├── Form1.cs // Основна логіка додатка
├── Form1.Designer.cs // Дизайн форми (автогенерований)
├── Program.cs // Точка входу в додаток
└── TabMenuApp.csproj // Файл проекту
Опис файлів:
Form1.cs
Містить основну бізнес-логіку додатка, обробники подій та методи для роботи з текстом.
Form1.Designer.cs
Автоматично генерується Visual Studio. Містить код для створення та налаштування візуальних елементів форми.
Program.cs
Точка входу в додаток. Відповідає за запуск головної форми.
TabMenuApp.csproj
Файл проекту, що містить налаштування збірки, залежності та метадані проекту.
Form1.cs - Основна логіка
Цей файл містить всю бізнес-логіку додатка, обробники подій меню та методи для роботи з текстом.
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 і містить код для створення всіх візуальних елементів форми.
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(), який запускає головну форму.
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 - для обробки дій користувача