2016-05-19 4 views
0

私はちょうどボタンとテキストボックス(tbxSum)からなる基本的な小さな電卓を作ってきました。以前にtryブロックで割り当てられたcatchブロック内の変数を使用する方法はありますか?

無効な合計が入力された場合、私のキャッチブロックがそれを拾い上げて、テキストボックスの内容を電卓の最新の結果と置き換えてほしいという問題があります。 't)。

だから私が言うと言う:

3 + 3 = 6

は私の電卓は今、次の和のためにテキストボックスに6を入れます。

それでは、私がやったと言う:

6 // 3

それは電卓がピックアップされ、無効なのですが、私はテキストボックスの値が前の合計から6に戻りたいです。

これは私が試したものです:

var myButton = (Button)sender; 

     if (myButton.Content.ToString() == "=") 
     { 

      DataTable dt = new DataTable(); 
      string s = tbxSum.Text; 
      string result = ""; 

      if (s.Contains("(")) 
      { 
       s = s.Replace("(", "*("); 
      } 

      try 
      { 
       var v = dt.Compute(s, ""); 
       tbkSum.Text = s + "=" + v.ToString(); 

       tbxSum.Text = v.ToString(); 
      } 

      catch 
      { 
       MessageBox.Show("Invalid Sum"); 
       tbxSum.Text = result; 
      } 
     } 

私もそう、私は多分私は、等号の右側にそこにすべてのものを取ることができる前の合計を示してテキストブロック(tbkSum)を考えているが、私はそれをどうやって行うのか分かりません。

+0

問題は、あなたが最後の良好な計算の変数を格納する必要があるということです。したがって、計算が行われるクラスの大域変数を、良い計算の時点で作成し、その変数を回答と同じに設定します。不正な計算の場合は、テキストボックスを前の値に戻します(存在する場合) ) – Draken

答えて

3
class Calculate(){ 
    private boolean lastGoodValueSet = false; 
    private int lastGoodValue = 0; 

    void buttonFunction(){ 
     if (myButton.Content.ToString() == "=") 
     { 
      //Your code 
      try 
      { 
       var v = dt.Compute(s, ""); 
       tbkSum.Text = s + "=" + v.ToString(); 
       lastGoodValue = v; 
       lastGoodValueSet = true; 
      } 

      catch 
      { 
       MessageBox.Show("Invalid Sum"); 
       tbxSum.Text = result; 
       if (lastGoodValueSet) 
        tbxSum.Text = lastGoodValue; 
      } 
     } 
    } 

} 

これは、あなたが使用することができ、コードのセットの例であります良い計算が行われたかどうかを判断するために保存しなければならない単純な値です。エラーが発生した場合は、計算に戻ります。希望が助けてくれる!あなたは何らかのメッセージをユーザに伝えたいので、彼らはエラーがあったと知っています。

ユーザーが同等ボタンを押した時点で値が既にtbkSumの範囲内で変更されているため、ユーザーが値を変更する前に値を変更する必要があります。計算が正常に完了したときにtbkSumテキスト値を更新する時点

これは、計算を行うたびにCalculateクラスの新しいインスタンスを作成しないことを前提としています。そうしないと、この問題を解決するために、他の方法ではなく、最初の場所での重複を防ぐためです、私はあなたに何が起こっ制御あなたの他のコメントから読み取るEDIT

どこかに番号を保存する必要があるだろうテキストボックスにアプリケーションのボタンを追加します。

private char[] buttonChars = {'/','*', '+'/*e.t.c*/} 
void buttonFunction(){ 
    string buttonPressedStr = myButton.Content.ToString(); 
    char buttonPressed = buttonPressedStr[0]; 
    int pos = Array.IndexOf(buttonChars , buttonPressed); 
    if (pos > -1) 
    { 
     if (tbxSum.Text.Length > 0){ 
      char last = tbxSum.Text[tbxSum.Text.Length - 1]; 
      pos = Array.IndexOf(buttonChars , last); 
     } 
     else 
      pos = 0; 
     if (pos > -1){ 
      tbkSum.Text += buttonPressedStr; 
     } 
} 

はこれを行うにはクリーンな方法がありますが、それはあなたが最初の場所であなたの問題を防ぐことができたかの例です:すべてのボタンがbuttonFunction()と同様の方法を経ると仮定すると、あなたが行うことができます。いくつかの説明: - ボタンが押された場合、それはチェックし、そう

  • まず上にあった

    1. buttonCharsは、ボックス内のテキストに追加されるだろう、あなたのさまざまなボタン型の配列で、例は、+ですもしそうなら
    2. 指定buttonCharsのあなたのコレクションには、我々はtbxSumに追加最後のものは、再びbuttonChars配列で発見された場合は最後のものは、tbxSum
    3. に追加内容を確認する必要があり、我々は、追加する必要はありません文字列
    4. tbxSumが空だったか最後に別の文字があった場合はそれ以外の場合、我々は文字
  • +0

    治療を受け、歓声を上げました。 – BoogaWooga

    +1

    あなたは明らかにこの電卓が何をするのかを理解しています+1: –

    +0

    @BoogaWooga私はいくつかのコードを追加しました。それは素晴らしいことではありませんが、最初に重複した演算子を持つ問題を防ぐのに役立ちます。ここで行うことができるコーディングの方がはるかに優れていますが、アプリケーションを別の方法で記述することになります。これは、幸運から学ぶための興味深い基礎です! – Draken

    2

    あなたはtryブロック外の変数declard に古い値を保存して、もう一度あなたのcatchブロックでこの変数を使用することができます。

    string oldSumValue = tbxSum.Text; 
    
    try 
    { 
        // your code   
    } 
    catch 
    { 
        tbxSum.Text = oldSumValue ; 
        MessageBox.Show("Invalid Sum");  
    } 
    
    +0

    申し訳ありませんが、コードを少し追加しましたが、今修正しました。等号ボタンをクリックするとすべて実行されます。レベルを上げようとしましたが、どちらも動作しませんでした。 – BoogaWooga

    +0

    @ BoogaWooga解決策は同じです。単純にtryブロックの外側の変数に値を格納します。私の答えを更新しました。 –

    +0

    これは私が意味することですが、無効な合計を新しいテキストボックスの値であるテキストボックスにパンチすると、等しいボタンがクリックされたときにこの変数がテキストボックスに表示され、無効な合計が変数に保存されます。それが不可能なテキストブロックや何かを使ってそれを行うことができると思うのですか?もしそうならば、それは悪い習慣ですか? – BoogaWooga

    1

    が代わりに私があることがないようにするには、このを作ってみた付加することができます。 'の

    A)の重複*」または 『/』

    B)合計で始まる 『*』または 『/』

    public MainWindow() 
        { 
         InitializeComponent(); 
    
         if (tbxSum.Text == "") 
         { 
          btnDiv.IsEnabled = false; 
          btnMult.IsEnabled = false; 
         } 
        } 
    
        protected void btnSumClick(object sender, EventArgs e) 
        { 
    
         btnDiv.IsEnabled = true; 
         btnMult.IsEnabled = true; 
    
         var myButton = (Button)sender; 
         int pos = tbxSum.Text.Length; 
    
         if (pos > 0) 
         { 
    
          if ((tbxSum.Text[pos - 1] == '/' || tbxSum.Text[pos - 1] == '*') && 
           (myButton.Content.ToString() == "/" || myButton.Content.ToString() == "*")) 
          { 
           int location = tbxSum.Text.Length - 1; 
           tbxSum.Text = tbxSum.Text.Remove(location, 1); 
          } 
    
         } 
        } 
    
    関連する問題