December 15, 2018

Курс по WinForms. Урок 3.2.

Как вы помните, на прошлом уроке мы начали делать первую программу - калькулятор. В этот раз мы сделаем выполнение операции и ввод второго операнда. Там, конечно, не будет СУПЕР РОВНЫХ кнопок как на калькуляторе Windows 10, но это всего лишь калькулятор! (Этот урок будет довольно коротким, но с большим количеством кода, ведь предыдущий был очень длинным и с большим количеством работы с конструктором)


Ввод второго числа

Конечно, прикольно, когда ты можешь вводить число в калькулятор, но что делать с одним операндом? Нам нужен второй! Переходим к коду:

Сначала добавляем новые "проверочные переменные": (я их так называю, они для проверки)

string MathOper; //здесь будут вписаны наши операторы
bool IsThereFirstNumber = false; //для проверки на "пустоту". Если чисел нет, то ставим 0 (это для дробных)
bool secondNumStart = false;
bool Start = false; //нужно, чтобы мы знали, ушло ли значение "введите данные" с дисплея
bool Next = false; //нужно, чтобы мы знали, ввел ли пользователь второе значение

Далее создаем новый метод SecondOperand, которое будет вставлять первый операнд с label в label2 (оно показывает второй операнд):

        void SecondOperand(string lastOperand) //этот параметр будет значением
        { 
            if (Start)
            {
                label.Text = "Введите второе\nзначение..."; //"\n" - новая строка
                label2.Text = lastOperand;
                Next = false;
                Start = false;
                IsThereFirstNumber = false;
                secondNumStart = true;
            }
            else
                label.Text = "Сначала введите\nпервое значение..."; //"\n" - новая строка
        }

Теперь добавляем вызов метода SecondOperand в методы Summ и Sub с параметрами label.Text:

private void Summ(object sender, EventArgs e)
{
    MathOper = "+"; //говорим, что теперь активная операция - это сумма
    label1.Text = Convert.ToString(MathOper); //присваиваем label1 (активной операции) значение +
    if (!Next) SecondOperand(label.Text); //это против бага с бесконечным кол-вом операндов
}

private void Sub(object sender, EventArgs e)
{
    MathOper = "-"; //тут код единтичен предыдущему, и комментарии не требуются
    label1.Text = Convert.ToString(MathOper);
    if (!Next) SecondOperand(label.Text);
}

Также делаем "апгрейд" методу NumberChange, т.е. добавляем проверку на "второе число", чтобы оно изменяло значение Start или Next в зависимости от ситуации:

        private void NumberChange(object sender, EventArgs e)
        {
            var button = sender as Button; //берем Tag как носитель числа
            var num = button.Tag;
            if(secondNumStart)
            {
                if (Next)
                {
                    Next = true; //показываем, что мы начали
                    IsThereFirstNumber = true; //показываем, что теперь первое число есть
                    label.Text += num; //добавляем число
                }
                else
                {
                    label.Text = Convert.ToString(num); //меняем "введите второе значение" на число
                    Next = true;
                    IsThereFirstNumber = true;
                }
            }
            else
            {
                if (Start)
                {
                    Start = true; //показываем, что мы начали
                    IsThereFirstNumber = true; //показываем, что теперь первое число есть
                    label.Text += num; //добавляем число
                }
                else
                {
                    label.Text = Convert.ToString(num); //меняем "введите значение" на число
                    Start = true; //показываем, что мы начали
                    IsThereFirstNumber = true;
                }
            }
        }

Выполнение операции (или равно)

Теперь наша программа умеет записывать второй операнд, но нам также нужна главная функция калькулятора - вычисление операции. Для этого мы присвоим событию Click кнопки "=" метод Result и открываем его код:

        private void Result(object sender, EventArgs e)
        {
            if(secondNumStart)
            {
                FirstNum = Convert.ToInt32(label2.Text); //записываем первый операнд
                SecondNum = Convert.ToInt32(label.Text); //записываем второй операнд
                label.Text = MathOper == "+" ? quot;Результат:\n{FirstNum + SecondNum}": quot;Результат:\n{FirstNum - SecondNum}"; //проводим операцию с соответствующим оператором
            }
        }

У нас только два оператора, так что мы используем тернарный оператор, но если у нас их будет четыре (+, -, *, /) мы будем использовать оператор case.

Конец урока

На этом всё! Надеюсь, вам понравилось. В следующем уроке будем менять шрифт текста с помощью панели меню! (или строки меню) До новых встреч!