2017-12-01 8 views
0
Private Sub btnConvert_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles btnConvert.Click 
    Dim result As Decimal 
    result = Calc(txtGrams.Text) & Calcul(txtTroyOunces.Text) 
    MessageBox.Show(result) 

End Sub 

Private Function Calc(ByVal a As Decimal) As Decimal 
    ' declare variables and convert to decimal 
    Dim Grams As Decimal 
    a = txtGrams.Text 
    Grams = a * 31.1035 

    ' determine if text boxes txtGrams and txtTroyOunces is empty 
    If String.IsNullOrEmpty(a) Then 
     MessageBox.Show("Please enter a number") 
    Else 
     Return Calc(Grams) 

    End If 

#Disable Warning BC42353 ' Function doesn't return a value on all code paths 
End Function 
#Enable Warning BC42353 ' Function doesn't return a value on all code paths 

Private Function Calcul(ByVal b As Decimal) As Decimal 
    Dim Ounces As Decimal 
    b = txtTroyOunces.Text 
    Ounces = b * 0.911458 
    If String.IsNullOrEmpty(b) Then 
     MessageBox.Show("Please enter a number") 
    Else 
     Return (Ounces) 
    End If 
#Disable Warning BC42353 ' Function doesn't return a value on all code paths 
End Function 
#Enable Warning BC42353 ' Function doesn't return a value on all code paths 

を掛けているときに、2つのテキストボックスの答えを表示するボタンの機能を作成しようと、私はこのエラーを取得する:私は私の変換ボタンをクリックすると、ユーザー入力が

$exception {"Exception of type 'System.StackOverflowException' was thrown."} System.StackOverflowException

+1

'Calc(Grams)'は 'Calc()'の内部にあるので、再びCalc()を無限に呼び出します。おそらくあなたは 'Return Grams'をほしいと思うでしょうか?それらを使用した後の引数*の妥当性もチェックしています。これらの警告を抑止するのではなく、修正することをお勧めします。 –

+0

警告を無効にするのではなく、失敗したときに0を返さないのはなぜですか?もし何も返さなければ、とにかく返されるものです。しかし、あなた自身でそれをすることで、少なくともその警告はなくなります。 –

答えて

0

編集:ところで、トロイ・グラムをトロイ・オンスに変換しようとしている場合、換算係数は0.0321507でなく、0.911458でなければなりませんが、トロイのオンスであればすべていいです。

まず、strictというオプションを無効にしないでください。コーディングを少し難しくしますが、実際にコードを無効にする必要がなければ、そのままにしておいてください。より良いコードを書くように強制します。

第二に、あなたのライン上のあなたのエラー..

result = Calc(txtGrams.Text) & Calcul(txtTroyOunces.Text) 

それはOKのようなものが見えますが、あなたはresultがdecimal型として宣言されていることを問題を持っている、とあなたはおそらく文字列としてそれを宣言するためのものtype - 文字列型を使用する場合、&演算子は2つの文字列を一緒に結合します。十分ですが、Vbでは、Decimal型に値を代入しようとすると、&はまったく別のことを行います。ビット単位の値に対して論理AND演算を実行しようとします。このため、Option Strictをオンにすることが非常に重要です。このエラーは、IDEがコードを書く前に選択されていました。あなたは、単に文字列型にresultの宣言を変更しなかった場合

&オペレータは、

第三に、スペースなし、それ故に変更MessageBox.Showラインであなたの番号に参加ボタンでのTextBoxのあなたの検証を行いますclickイベントを使用して、入力された値が有効な小数であることを確認します。

Private Sub btnConvert_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles Btnconvert.Click 
    If IsNumeric(TxtGrams.Text) And IsNumeric(TxtTroyOunces.Text) Then 
     Dim grams As Decimal = CDec(Val(TxtGrams.Text)) 
     Dim troyOunces As Decimal = CDec(Val(TxtTroyOunces.Text)) 
     Dim convertedToTroy As Decimal = Calc(grams) 
     Dim convertedToGrams As Decimal = Calcul(troyOunces) 
     MessageBox.Show(convertedToGrams & "g " & convertedToTroy & "Troy oz") 
    Else 
     MessageBox.Show("Enter numbers > 0") 
    End If 
End Sub 

あなたは(Valを使用して)テキストボックスから数値を取得し、また、そこに私が小数に番号を変換するためにCDecを使用している余分なコードがあると見ることができるように...このように。現時点では長く見えていますが、あなたはそれに慣れます。

また、別のコードのヒント - サブシステムと機能の名前を選択するとき、その機能に関連する名前を選択します - 6か月後にコードに戻った場合、します。現在のコードではそれほど重要ではありませんが、サブなどは短く、彼らが何をしているのかは明らかですが、とにかく習慣に入ります。栽培するのは良いことだ。元の変換関数で

、あなたは次の行を持っている...

a = txtGrams.Text 

b = txtTroyOunces.Text 

あなたBtnConvert_clickハンドラから関数を呼び出すとき、値がすでにあるので、これらは冗長ですabに渡されました。TextBoxから再度取得する必要はありません。

ボタンのクリックでidationが行われると、2つの計算関数がはるかにきれいに見え、コンパイラの警告を無効にする必要はありません。下を見てください。上記の二つの機能で

Private Function ConvertToGrams(ByVal a As Decimal) As Decimal 
    Dim Grams As Decimal 
    Grams = a * 31.1035D 
    Return Grams 
End Function 

Private Function ConvertToTroy(ByVal b As Decimal) As Decimal 
    Dim Ounces As Decimal 
    Ounces = b * 0.911458D 
    Return (Ounces) 
End Function 

、あなたは、各変換係数の後の文字Dがあることに気づくでしょう。これは、コンパイラが数値をDecimal型として扱うことを単純にします。文字通りの数字を扱うときの別の良い習慣。

これが役に立ちます。

答えがあなたの問題を分類するならば、答えの隣にあるチェックマークをクリックすることを忘れないでください - それはユーザーが評判ポイントを得て、同じ問題を抱えている誰かがあなた質問には、彼らのために働くかもしれない受け入れられた答えがあります。 (そして質問に答えた人は評判ポイントを得る)

+0

あなたの助けのためのTYVM私はそれを素晴らしい今働いている。 – vgingin

関連する問題