/// <summary>
        /// 計算する
        /// </summary>
        /// <param name="first">左側の値</param>
        /// <param name="second">右側の値</param>
        /// <param name="ope">操作(演算子)</param>
        /// <returns></returns>
        private string Calclate(long first, long second, EnumOperate ope)
        {
            long result = 0;

            switch (ope)
            {
            case EnumOperate.Addition:
                result = first + second;
                break;

            case EnumOperate.Subtraction:
                result = first - second;
                break;

            case EnumOperate.Multiplication:
                result = first * second;
                break;

            case EnumOperate.Division:
                if (second == 0)
                {
                    DisplayFontSize = ERROR_DISP_FONT_SIZE;
                    mode            = EnumInputMode.Error;
                    ButtonEnabled   = false;
                    return("0では割り算できません");
                }
                result = first / second;
                break;
            }
            return(result.ToString());
        }
 private void Clear()
 {
     leftString      = string.Empty;
     rightString     = string.Empty;
     Display         = "0";
     operate         = EnumOperate.None;
     DisplayFontSize = NORMAL_DISP_FONT_SIZE;
     prevMode        = EnumInputMode.None;
     mode            = EnumInputMode.First;
     ButtonEnabled   = true;
 }
        public void ButtonClick(string param)
        {
            // Enable になっているボタンを押されたときは他ボタンも Enable にする。
            ButtonEnabled = true;

            // 負荷アップ
            if (bugMan.conf.InvalidCPUUse)
            {
                Burden();
            }

            // 押されたボタンの種類を調べる
            var kind = JudgeButtonKind(param);

            if (kind == EnumButtonKind.None)
            {
                return;
            }

            if (prevMode == EnumInputMode.Result)
            {
                if (kind == EnumButtonKind.Number)
                {
                    Display = string.Empty;
                }
            }

            // クリア処理
            if (operate == EnumOperate.Clear)
            {
                Clear();
                return;
            }

            // モードを判断
            if (kind == EnumButtonKind.Number)
            {
                if (prevMode == EnumInputMode.Symbol ||
                    prevMode == EnumInputMode.Second)
                {
                    mode = EnumInputMode.Second;
                }
                else
                {
                    mode = EnumInputMode.First;
                }

                if (Display.Equals("0"))
                {
                    // 「01」のような表示になることを防ぐ。
                    Display = string.Empty;
                }
            }
            else if (kind == EnumButtonKind.Mark)
            {
                if (prevMode == EnumInputMode.Second)
                {
                    mode = EnumInputMode.SymbolCalc;
                }
                else
                {
                    mode = EnumInputMode.Symbol;
                }
            }
            else if (kind == EnumButtonKind.Func)
            {
                if (operate == EnumOperate.Calclation)
                {
                    if (prevMode == EnumInputMode.First)
                    {
                        return;
                    }
                    mode = EnumInputMode.Calc;
                }
                else if (operate == EnumOperate.Clear)
                {
                    mode = EnumInputMode.First;
                }
            }

            // 2回続けて計算記号を押したとき
            if (prevMode == EnumInputMode.Symbol)
            {
                if (mode == EnumInputMode.Symbol)
                {
                    // 演算子のマークを変更して終了(計算はしない)
                    Display         = Display.Remove(Display.Length - 1);
                    Display        += param;
                    operationSymbol = operate;
                    return;
                }
            }

            if (mode == EnumInputMode.Symbol)
            {
                leftString      = Display;
                operationSymbol = operate;
            }

            // 実行するタイプでなければ表示文字の右側に追加
            if (mode != EnumInputMode.Calc && mode != EnumInputMode.SymbolCalc)
            {
                Display += param;
            }

            // 計算処理
            if (mode == EnumInputMode.Calc || mode == EnumInputMode.SymbolCalc)
            {
                if (prevMode != EnumInputMode.Result)
                {
                    // 結果表示時の場合、以前の値を使うので、このチェックは行なわない
                    if (leftString.Length == 0 || Display.Equals(leftString))
                    {
                        return;
                    }
                }
                if (prevMode == EnumInputMode.Symbol)
                {
                    // 1+=のパターン
                    rightString = leftString;
                }
                else if (prevMode == EnumInputMode.Result)
                {
                    // rightString は前回のままの値を使う
                }
                else
                {
                    rightString = Display.Remove(0, leftString.Length + 1);
                }
                if (rightString.Length == 0)
                {
                    return;
                }

                Display = Calclate(long.Parse(leftString), long.Parse(rightString), operationSymbol);
                if (mode == EnumInputMode.Error)
                {
                    return;
                }

                leftString = Display;
                //rightString = string.Empty;

                if (mode == EnumInputMode.SymbolCalc)
                {
                    Display        += GetSymbolStringFromOperationSymbol(operate);
                    mode            = EnumInputMode.Symbol;
                    operationSymbol = operate;
                }
                else
                {
                    mode    = EnumInputMode.Result;
                    operate = EnumOperate.None;
                }
                // TODO:エラー表示の Enable/Disable 切り替えは Converter を利用する方がスマート
            }

            prevMode = mode;

            // 桁オーバーエラー
            if (CheckDigitError() == false)
            {
                DigitError();
            }
        }