窗體的調用也很簡單,並沒有設計漂亮的外觀和高級設置等。主要的代碼是“計算”按鈕的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