Windows: Как создать программу

Cоздать программу самому? Это очень просто! Не верите? Давайте сделаем небольшую программу, которая станет вашей отправной точкой в мир программирования.

Многие из нас постоянно работают с программами, сложными и попроще, но многие не задумываются, а что-же на самом деле есть программа. Если описать коротко, то программа - это набор инструкций, которые отдаются компьютеру в соответствии с логикой, которую в программу заложил программист. 

Не буду рассуждать на тему зачем может потребоваться писать самостоятельно программу, у каждого свои причины. Оговорюсь сразу, что в данной статье будет использоваться язык программирования C# и среда разработки Microsoft Visual Studio, у которой имеется бесплатная редакция, возможностей которой хватит "за глаза" любому.

1 . Этапы создания программы

Писать программу ради написания программы является не совсем хорошей идеей. Целью написания программы должно быть решение определенной задачи, с которой написанная программа должна помочь вам справиться.

Из выше сказанного, написание программы можно разделить на следующие этапы:

  1. Определение цели, какую задачу ваша программа помочь вам решить
  2. Разработка алгоритма работы программы.
  3. Дизайн пользовательского интерфейса. 
  4. Написание логики программы. На этом этапе вдыхается жизнь в вашу програму. Это и есть наиболее важный этап создания программы, для успешной реализации которого понадобится много знаний и умений.
    Где взять знания и умения? Книги, профильные сайты, курсы. Сейчас в интернете можно найти бесчисленное множество обучающих материалов, посвященных данной теме.
    Отдельно хочется упомянуть ресурсы для освоения C#:

2 . Установка среды разработки

Так как большинство из нас не гениальные мальчики и девочки, родившиеся с клавиатурой в руках и не впитали языки программирования с молоком матери, нам понадобится текстовый редактор более функциональный и наглядный чем блокнот.

Да, в блокноте вполне реально создать программу, но на это у вас уйдет гораздо больше времени и такими "извращениями" могут заниматься реально крутые программисты. Для остальных-же Microsoft Visual Studio - это именно тот инструмент, который будет помогать создавать новые и управлять существующими проэктами.

Из ключевых возможностей Visual Studio хочется отметить:

  • Разработка для популярных платформ Windows, Linux, MacOS
  • Веб разработка: ASP.NET, Node.js, Python, JavaScript, and TypeScript
  • Популярные языки программирования: C#, C++, Visual Basic, Python, JavaScript
  • Визуальное редактирование пользовательского интерфейса
  • IntelliSense - интеректуальный помощник при написании кода
  • Управление версиями. Интеграция с GitHub
  • Совместная разработка
  • Расширение возможностей путем установки дополнений.

Поэтому Microsoft Visual Studio - это именно то, с чего стоит начать свою карьеру программиста. 

Примечание.
Ранее, когда Visual Studio не была бесплатной, как альтернативу можно было рассматривать SharpDevelop, бесплатную IDE с открытым исходным кодом, которая предоставляла функционал сходный с Visual Studio и в некоторых случаях его было достаточно для создания проэктов любой сложности. Но теперь, в виду стагнации процесса разработки SharpDevelop, и стремительного развития Visual Studio, альтернативы продукту от Microsoft просто нет.

Загрузите и установите последнюю версию, которая доступна для загрузки на сайте разработчика. С этим не должно возникнуть сложностей. После установки запустите среду разработки.

3 . Создание программы

Давайте создадим программу - калькулятор. Почему-бы и нет? Изобретать велосипед - это-же так весело! :) А если серъезно, то ничего зазорного в этом нет, ведь клепают-же хелловорлды во всех учебниках и не стесняются. Мы в этом плане даже чем-то лучше.

Как уже оговаривалось выше, язык программирования будет использован C#,

  1. Нажимаем кнопку Create a new project.
  2. Шаг Create new project:

    • Выбираем фильтр:

      • Язык программирования: C#
      • Платформа: Windows
      • Тип проекта: Desktop
    • Выбираем Windows Forms App (Net. Framework) - нажимаем Next
  3. Шаг Configure your project:
    Название проэкта: CalculatorApp
    Название решения: Calculator.
    Framework: Оставляем по умолчанию, на данном этапе не важно какая версия Net. Framework
  4. Нажимаем Create

Открылось главное окно Visual Studio,

Перетащите кнопку Button на форму главного окна, только что созданного проекта.

Эта кнопка не делает ничего связанного с вычислениями - при её нажатии будет закрываться программа. На примере этой кнопки вы увидите насколько просто наполнять окно программы необходимыми элементами пользовательского интерфейса.

Настройте только что добавленную кнопку в панели свойств:

  • Свойство Text, меняем значение на Close
  • Name меняем на bnClose
  • Anchor: Bottom,Right

Добавьте обработчик события нажатия кнопки: делаем двойное нажатие на кнопке, программа автоматически создаст необходимый метод bnClose_Click. Внутри метода пишем: this.Close();

private void bnClose_Click(object sender, EventArgs e)
{
	this.Close();
}

Запускаем программу:

При нажатии кнопки Close, окно программы закроется, в след за этим завершит работу и сама программа.

Примечание
За всеми проделанными выше действиями с созданием конпки и редактирования ее свойств, лежит создание кода программы средой разработки VisualStudio.

Откойте файл Form1.Designer.cs. Как видите, все те действия, что вы делали в настройках, отображены здесь в виде кода программы:

// 
// bnClose
// 
this.bnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bnClose.Location = new System.Drawing.Point(750, 350);
this.bnClose.Name = "bnClose";
this.bnClose.Size = new System.Drawing.Size(75, 23);
this.bnClose.TabIndex = 0;
this.bnClose.Text = "Close";
this.bnClose.UseVisualStyleBackColor = true;
this.bnClose.Click += new System.EventHandler(this.bnClose_Click);

То-есть для среды разработки, элементы управления окна выглядят в виде кода, но для удобства, настройки графического интерфейса создаваемой программы в VisualStudio можно делать в наглядном визуальном представлении.

Примечание
Если вы поставили Visual Studio и хотите изменить язык интерфейса на другой язык, то это можно сделать в настройках программы Tools - Options - Internetional Settings. Если языка, который вам нужен нет в списке, доустановите его через Microsoft Visual Studio Installer. После этого опять откройте Tools - Options - Internetional Settings, и измените язык интерфейса.

Сделаем что-нибудь посложнее, чем просто вывод текста на экран

В большинстве учебников для начинающих программистов первая программа выводит простое сообщение "Hello world!". Мне кажется это немного тупо, так как для того, чтоб заинтересовать начинающего программиста, нужно показать нечто большее и полезное, нежели просто окно с текстом.

Для того чтоб оценить возможности языка программирования C# и .Net Framework, давайте в нашей программе реализуем возможность выполнения простейших арифметических операций. Мне кажется это будет гораздо полезней.

Итак, давайте создадим следующие элементы интерфейса программы

  • Четыре кнопки:

    • Сложение

      • Text: "+"
      • Name: bnPlus
    • Вычитание

      • Text: "-"
      • Name: bnMinus
    • Умножение

      • Text: "*"
      • Name: bnMult
    • Деление

      • Text: "/"
      • Name: bnDiv
  • Три текстовых поля: два для выполнения арифметических операций и один для результата.

    • Оператор 1

      • Name: tbOperand1
    • Оператор 2

      • Name: tbOperand2
    • Результат

      • Name: tbResult
  • Надписи (Labels) для них имя не важно, так как к ним мы обращаться не будем, но лучше имя все-таки дать:

    • Name: lblOperand1
    • Name: lblOperand2
  • Кнопка закрытия окна осталась из примера, рассмотренного ранее

Примечание: Очень удобно использовать копирование элементов пользовательского интерфейса. Для того, чтоб это сделать, нужно выделить элементы, которые нужно скопировать и при нажатой кнопке Ctrl, потянуть мышью выделенные элементы в сторону.

Как видите, добавлять элементы интерфейса программы весьма просто - перетягиваем их из панели инструментов (или создаем копии уже существующих) в то место окна, где должен находиться элемент, изменяем размер, свойства и положение.

Попробуйте закончить настройку внешнего вида программы, чтоб она стала выглядеть так:

Высота текстового поля tbResult регулируется за счет изменения размера шрифта.

Обратите внимание, что имя элементов назначаются автоматически и, если не давать им осмысленные имена, и при достаточно большом их количестве, очень легко потеряться в хаосе, состоящем из элементов с названиями button1, button2, button3, textBox1, textBox2, textBox3 и так далее. Сразу после создания элементов, не ленитесь, давайте им осмысленые имена - дальше, при создании обработчиков событий, имена методов будут генерироваться автоматически на основании имени элемента управления. Думаю никто не сомневается в том, что имя метода ButtonAdd_Click() гораздо более осмысленно, чем Button1Click()

Назначим обработчики событий нажатия кнопок

Выбираем по очереди каждую кнопку.Даблкликом создаем обработчик нажатия кнопки(Click). Если нужно добавить обработчик другого события, или выбрать уже существующий метод - следует открыть вкладку События (значок в виде молнии)  и там уже выбрать необходимое событие.

Пишем код обработчика

private void bnAdd_Click(object sender, EventArgs e)
{
	tbResult.Text = (float.Parse(tbOperand1.Text) + float.Parse(tbOperand2.Text)).ToString();
}

private void bnSubstr_Click(object sender, EventArgs e)
{
	tbResult.Text = (float.Parse(tbOperand1.Text) - float.Parse(tbOperand2.Text)).ToString();
}

private void bnMultiply_Click(object sender, EventArgs e)
{
	tbResult.Text = (float.Parse(tbOperand1.Text) * float.Parse(tbOperand2.Text)).ToString();
}

private void bnDivide_Click(object sender, EventArgs e)
{
	tbResult.Text = (float.Parse(tbOperand1.Text) / float.Parse(tbOperand2.Text)).ToString();
}

Как видите, все методы-обработчики отличаются только одним символом. Это не есть красиво, но наведением порядка в коде мы займемся немножко позже. Сейчас для наглядности путь обработчики событий нажатия кнопки остаются как есть.

Давайте на примере операции сложения разберем как работает наша программа.

tbResult.Text = (float.Parse(tbOperand1.Text) + float.Parse(tbOperand2.Text)).ToString();

Из курса школьной программы математики мы знаем, что действия, заключенные в скобки выполняются в первую очередь. В программировании то-же самое:

  1. float.Parse(tbOperand1.Text) - Извлекается значение свойства Text переменной tbOperand1 и передается в качестве параметра статичскому методу Parse() типа System.Single результат записывается в промежуточную переменную A
  2. float.Parse(tbOperand2.Text) - то-же самое, результат записывается в промежуточную переменную B
  3. Производится сложение промежуточных переменных (A + B) в промежуточную переменную C
  4. C.ToString() - Преобразовуется переменная C в строку. Так как любая переменная в C# это объект, то путем обращения к методу ToString() этого объекта мы можем получить его строковое представление.

Более сложные типы, такие как DateTime, могут иметь несколько мeтодов ToString().

Проверяем работу программы

Нажмите кнопку Пуск на панели инструментов, или нажмите клавишу F5

Программа работает и делает то, что от нее требовалось:

Обратите внимание, что я пока не реализовал проверку вводимого значения в текстовое поле. Если ввести в него некорректное значение - программа выдаст сообщение об ошибке, в которой сообщается, что вы пытаетесь преобразовать в числовое значение неправильную строку:

Давайте теперь перепишем программу, чтоб она могла выводить предупреждение, в случае, если было введено некорректное значение одного из операторов. Скопируйте следующий метод к себе в файл Form1.cs, там где находятся остальные обработчики *_Click:

private void bnMathAction_Click(object sender, EventArgs e)
{
	// эти переменные нужны для out параметров float.TryParse(string s, out v)
	float A, B;
	// Эта строковая переменная хранит имя кнопки, 
	// будет использована для определения того, какая кнопка нажата
	string senderName = ((Button)sender).Name;

	// if(bool && bool)
	// оба метода должны вернуть истину
	if (float.TryParse(tbOperand1.Text, out A) && float.TryParse(tbOperand2.Text, out B))
	{
		// Проверяем по имени какая кнопка нажата и в соответствии с выбором
		// вызываем требуемую арифметическую операцию
		switch (senderName)
		{
			case "bnAdd":
				tbResult.Text = (A + B).ToString();
			break;
			case "bnSubstr":
				tbResult.Text = (A - B).ToString();
				break;
			case "bnMultiply":
				tbResult.Text = (A * B).ToString();
				break;
			case "bnDivide":
				tbResult.Text = (A / B).ToString();
				break;
		}
	}
	else
	{
		MessageBox.Show("Неправильно введено значение оператора!");
	}
}

Этот метод принимает параметр  object sender, который используется для определения того, какая кнопка была нажата. Здесь использован основополагающий принцип ООП - Полиморфизм. Объект типа Button можно абстрагировать до типа object, но при этом информация, специфичная для типа Button никуда не пропала - для того, чтоб к ней обратиться, нужно sender привести к типу Button. Например:

Button btn = new Button(); // Объект типа Button
object obj = new object(); // Объект типа object

// Объект типа Button является наследником типа object, поэтому возможно неявное преобразование типа
object obj2 = btn;
object obj3 = new Button() { Name = "bnTest", Text = "Test"};

//obj3.Text = "Test 1"; // Ошибка. Нельзя напрямую обратиться к полю Text
((Button)obj3).Text = "Test 1"; // А вот так обратиться к полю Text  вполне даже можно

// Тип object не может стать типом Button. Рожденный ползать летать не может
//Button btn2 = obj;         // Ошибка. 
//Button btn2 = (Button)obj; // Ошибка. 

Теперь перейдите в конструктор формы (Shift + F7) и для каждой кнопки, в качестве обработчика события Click выберите метод bnMathAction_Click.

Если перейти к коду, то можно увидеть, что ссылок на этот метод стало четыре, а на остальные методы обработчики теперь никто не ссылается - ссылок ноль. Их можно спокойно удалить.

В итоге вы должны получить файл 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 CalculatorApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void bnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void bnMathAction_Click(object sender, EventArgs e)
        {
            // эти переменные нужны для out параметров float.TryParse(string s, out v)
            float A, B;
            // Эта строковая переменная хранит имя кнопки, 
            // будет использована для определения того, какая кнопка нажата
            string senderName = ((Button)sender).Name;

            // if(bool && bool)
            // оба метода должны вернуть истину
            if (float.TryParse(tbOperand1.Text, out A) && float.TryParse(tbOperand2.Text, out B))
            {
                // Проверяем по имени какая кнопка нажата и в соответствии с выбором
                // вызываем требуемую арифметическую операцию
                switch (senderName)
                {
                    case "bnAdd":
                        tbResult.Text = (A + B).ToString();
                    break;
                    case "bnSubstr":
                        tbResult.Text = (A - B).ToString();
                        break;
                    case "bnMultiply":
                        tbResult.Text = (A * B).ToString();
                        break;
                    case "bnDivide":
                        tbResult.Text = (A / B).ToString();
                        break;
                }
            }
            else
            {
                MessageBox.Show("Неправильно введено значение оператора!");
            }
        }
    }
}

Код проекта доступен на GitHub.

There are 2 Comments

Поля

Не показали как создать текстовые поля.

Ввел код, запустил программу, выдает ошибку. Скопировал код, та же проблема.

ожидалась } (CS1513)

Спасибо за отзыв по статье,

Спасибо за отзыв по статье, буду дорабатывать

По ошибке - проверил, ошибок нет, я копировал только то что между фигурных скобок. Мой совет учиться писать код самостоятельно, тем более, что по нажатию клавиши Tab отображается список доступных классов, функций, переменных и так далее.

 

Делись своим опытом и знаниями, ибо в могиле они тебе вряд-ли пригодятся.

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешённые HTML-теги: <a> <s> <u> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <hr> <dd> <sub> <sup>
  • Строки и параграфы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Защита от СПАМ ботов. Подтвердите, пожалуйста, что вы человек.
2 + 7 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.