程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 仿查詢分析器的C#計算器——5.計算求值(2)

仿查詢分析器的C#計算器——5.計算求值(2)

編輯:關於C語言

窗體的調用也很簡單,並沒有設計漂亮的外觀和高級設置等。主要的代碼是“計算”按鈕的Click事件處理方法,代碼如下:

        /// <summary>
        /// 點擊“計算”按鈕
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExecute_Click(object sender, EventArgs e)
        {
            if (this.rtbInput.Text.Trim().Replace("\n", "").Length == 0)
            {
                this.rtbOutput.Text = "輸入的表達式不能為空,請重新輸入。";
            }
            else
            {
                string strSource;
                int intTotalIndex = 0;
                this.rtbOutput.Text = "";
                string[] strLines;
                this.trvSyntaxTree.Nodes.Clear();//清空語法樹

                if (this.rtbInput.SelectedText.Trim().Length == 0)//獲取選中的代碼,如果未選中,則執行全部
                {
                    strSource = this.rtbInput.Text;
                }
                else
                {
                    strSource = this.rtbInput.SelectedText;
                    intTotalIndex = this.rtbInput.SelectionStart;
                }

                if (this.chkAllowMultiLine.Checked)//判斷是按多行執行還是單行執行
                {
                    strLines = strSource.Split(new char[] { '\n' });//多行則用換行符分割成多行
                }
                else
                {
                    strLines = new string[] { strSource.Replace("\n", "") };//單行則移除換行符成一行
                }

                foreach (string Line in strLines)
                {
                    if (Line.Trim().Length != 0)//避免中間出現空行
                    {
                        try
                        {
                            TokenRecord TokenTop = myAnalyse.Analyse(Line);//計算表達式
                            this.rtbOutput.Text += TokenTop.GetValueString() + "\n";//顯示計算結 果
                            this.LoadSyntaxTree(TokenTop);//加載語法樹到TreeVIEw控件
                        }
                        catch (Exception ex)
                        {
                            this.rtbOutput.Text += "發生錯誤\n" + ex.Message + "\n";//顯示錯誤信 息
                            if (ex is SyntaxException)//如果是語法錯誤,則選中錯誤的代碼
                            {
                                SyntaxException myException = (SyntaxException)ex;
                                this.ActiveControl = this.rtbInput;//設置輸入框為激活控件
                                this.rtbInput.Select(myException.Index + intTotalIndex, myException.Length);//定位發生錯誤的字符串
                            }
                            return;
                        }//try
                    }//if
                    intTotalIndex += Line.Length + 1;
                }//foreach
            }//else
        }//btnExecute_Click

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved