C#を使って何か作ろう~電卓その2~

これからしばらくは、前回作った電卓を使いやすく、またエラーも見つけ出して適切に処理できるように改造していこうと思う。
まず今回はキー入力をできるようにしてみる。意外と苦戦した(1.5時間くらい)

困ったこと
1.キー入力ってそもそもどうやってアクティブにするんだ?
 →デザイン画面からフォームのプロパティ(イベント情報)を参照し、KeyPressをダブルクリックしたら作れた

f:id:dkkng:20200213001857j:plain
右下に注目

2.起動すると、最初の時点でTextbox(計算結果を表示するところ)にフォーカスが合っているせいで、textboxに直接値が入ってしまう
 →最初は「起動時のフォーカスを違うコンポーネントに合わせておこう」ということで、フォーム立ち上げ時に『=』にフォーカスを合わせた。
 →でも後から「これ結局マウスでテキストボックス選択されたらそこに直接値を入れられるから根本的に解決になってないな」と思い直した
 →Textboxのプロパティを参照し、EnabledをTrueに設定することで解決した。これでテキストボックスへの値入力はできなくなり、keypressイベントが値を拾ってこれるようになった。

f:id:dkkng:20200213001952j:plain
右下に注目

この他、大学の先輩から「今の状態だと特定操作でエラーが起きるよ!」とヒントをいただいたので、この先の改造で見つけ出して解決したい。

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 Calculator
{
    public partial class Form1 : Form
    {
        double val1 = 0;
        double val2 = 0;
        int calcflug = 0;
        public Form1()
        {
            InitializeComponent();
            //this.ActiveControl = this.equal;
        }

        public void windowdel()
        {
            if(display.Text == "0")
            {
                display.Text = "";
            }
        }

        public void gettoval()
        {
            val2 = double.Parse(display.Text);
            calcnow(val2);
            display.Text = "0";
        }

        private void one_Click(object sender, EventArgs e)
        {
            windowdel();
            Console.WriteLine("1");
            display.Text += 1;
        }

        private void two_Click(object sender, EventArgs e)
        {
            windowdel();
            display.Text += 2;
        }

        private void three_Click(object sender, EventArgs e)
        {
            windowdel();
            display.Text += 3;
        }

        private void four_Click(object sender, EventArgs e)
        {
            windowdel();
            display.Text += 4;
        }

        private void five_Click(object sender, EventArgs e)
        {
            windowdel();
            display.Text += 5;
        }

        private void six_Click(object sender, EventArgs e)
        {
            windowdel();
            display.Text += 6;
        }

        private void seven_Click(object sender, EventArgs e)
        {
            windowdel();
            display.Text += 7;
        }

        private void eight_Click(object sender, EventArgs e)
        {
            windowdel();
            display.Text += 8;
        }

        private void nine_Click(object sender, EventArgs e)
        {
            windowdel();
            display.Text += 9;
        }

        private void zero_Click(object sender, EventArgs e)
        {
            windowdel();
            display.Text += 0;
        }

        private void plusminus_Click(object sender, EventArgs e)
        {
            int num = int.Parse(display.Text) * -1;
            display.Text = num.ToString();
        }

        private void dot_Click(object sender, EventArgs e)
        {
            display.Text += ".";
        }

        private void add_Click(object sender, EventArgs e)
        {
            gettoval();
            calcflug = 1;
        }

        private void substract_Click(object sender, EventArgs e)
        {
            if(calcflug != 0)
            {
                plusminus_Click(sender,e);
            }
            else
            {
                gettoval();
                calcflug = 2;
            }
        }

        private void multiply_Click(object sender, EventArgs e)
        {
            gettoval();
            calcflug = 3;
        }

        private void divide_Click(object sender, EventArgs e)
        {
            gettoval();
            calcflug = 4;
        }

        private void equal_Click(object sender, EventArgs e)
        {
            gettoval();
            display.Text = val1.ToString();
        }

        private void allclear_Click(object sender, EventArgs e)
        {
            display.Text = "0";
        }

        public void calcnow(double val2)
        {
            switch (calcflug)
            {
                case 0:
                    val1 = val2;
                    break;
                case 1:
                    val1 += val2;
                    break;
                case 2:
                    val1 -= val2;
                    break;
                case 3:
                    val1 *= val2;
                    break;
                case 4:
                    val1 /= val2;
                    break;
            }
            val2 = 0;
            calcflug = 0;
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.NumPad0:
                    zero_Click(sender, e);
                    break;
                case Keys.NumPad1:
                    one_Click(sender,e);
                    break;
                case Keys.NumPad2:
                    two_Click(sender, e);
                    break;
                case Keys.NumPad3:
                    three_Click(sender, e);
                    break;
                case Keys.NumPad4:
                    four_Click(sender, e);
                    break;
                case Keys.NumPad5:
                    five_Click(sender, e);
                    break;
                case Keys.NumPad6:
                    six_Click(sender, e);
                    break;
                case Keys.NumPad7:
                    seven_Click(sender, e);
                    break;
                case Keys.NumPad8:
                    eight_Click(sender, e);
                    break;
                case Keys.NumPad9:
                    nine_Click(sender, e);
                    break;
                case Keys.Add:
                    add_Click(sender, e);
                    break;
                case Keys.Subtract:
                    substract_Click(sender, e);
                    break;
                case Keys.Multiply:
                    multiply_Click(sender, e);
                    break;
                case Keys.Divide:
                    divide_Click(sender, e);
                    break;
                case Keys.Decimal:
                    dot_Click(sender, e);
                    break;
                case Keys.Enter:
                    equal_Click(sender, e);
                    break;
                case Keys.Delete:
                    allclear_Click(sender, e);
                    break;
            }
        }
    }

}