- ベストアンサー
VS2005の電卓がエラーだらけ。助けて!!
- VS2005で電卓を作る際に発生するエラーを解決する方法を教えてください。
- VS2005の電卓のエラーを修正する必要があります。どのように修正すればよいでしょうか?
- VS2005で電卓を作ろうとしていますが、エラーが発生しています。どうすれば問題を解決できますか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
myCalcで想定されるエラーは 除算の場合の0除算つまりworkが0の場合や Decimal.Parseの引数に 10進数以外の文字が入っている場合 といったころでしょうか Decimal.Parseは TryParseで代用すればエラー回避できます dim work as Decimal if Decimal.TryParse( ss, work ) then ' 関数本体 else Throw New System.Exception("myCalcの引数は10進数が必要です") end if といった具合です
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
一度に全部やろうとするので挫折してしまうのですよ 数字キーを押したら テキストボックスにその数字を追加していくのであれば Sub NumBtn_Click(sender as Object, e as EvenArgs) dim btn as Button = CType(sender, Button) myInput += btn.Text TextBox1.Text = myInput End Sub といったハンドラで可能でしょう 演算子の場合 Sub AddBtn_Click(sender as Object, e as EvenArgs) ' 保留中の演算があれば実行する if myCalc<>"" then myTotal = myCalc( myTotal, myInput, myCalc ) TextBox1.Text = myTotal.ToString end if ' 次回の呼び出しように演算子を記憶 myCalc = "+" ' 2項目の値のために変数を初期化 myInput = "" End Sub Function myCalc( vTotal as Decimal, ss as string, sCalc as String) as Decimal ' 文字列を数値に変換 dim work as decimal = Decimal.Parse( ss ) ' 四則演算 select case sCalc case "+" vTotal += work case "-" vTotal -= work case "*" vTotal *= work case "/" vTotal /= work end select ' 演算結果を戻す return vTotal End Function といった具合で ・・・ エラーや例外の処理は何もしていないので適宜追加してください
お礼
ありがとうございます。 自分が作った計算機とぜんぜん違うのでびっくりしました。 ハンドラってなんですか・・・ NumBtn_Clickは、プロパティをセットしているわけじゃないですよね? イベントハンドラですね! ボタンを_Click・・クリックしたら実行される・・・ イベントウィンドウ?イベントリスト?でより複雑な設定ができるんですね。 忘れてました。 このコードで、どのようなエラーや例外が発生するかどうやってわかるのですか??? エラー・例外処理を書くTry・catchの設定方法がさっぱりわかりません。
- redfox63
- ベストアンサー率71% (1325/1856)
VB2005対応の入門書などで 基礎的な文法などを習得しましょう Webに転がっている 他言語のソースをそのまま流用できるほどプログラミングは簡単ではありません 他言語のソースを流用したければ その参照しているソースで実行している内容を把握し、自分のプログラミングする言語で同等または代替の利く命令が存在するのか事前にチェックすることが肝要です > ボタンを押す > フォーム全体で使う変数(入力値・演算子・合計値)に値を代入 > この場合は、Subですか?Functionですか? これでも抽象的過ぎますね まぁ 現状のコードからすると Subになるでしょう 四則演算する部分をFunctionにするといった可能性はありますが もう少し勉強なさってからのほうがいいように思います どのボタンを押した場合なのかがあいまいです 数字ボタンが押されたのであれば 入力値の更新 +-*/などの場合 初回なら演算子の更新、2回目以降なら前回覚えた演算子で入力値と合計値の演算をして合計値を更新し、入力された演算子の更新 =ボタンなら演算子が保留されているなら入力値と演算を実行 といった機能を実装しなければいけないでしょう また一般の電卓にあるCLやCAなどの機能も必要でしょう CLは入力値のクリア CAは合計値と入力値のクリア といった具合に ・・・ また 除算(割り算)の場合除数(2番目の数値)が0の場合は特別な対処が必要ですよ 単にCall myValue()で関数を呼ぶだけではオブジェクト指向とは程遠いと思います
お礼
ありがとうございます。 ボタンを3つに絞りました。1・+・=の3つです。まずは基礎の基礎からやっています。 Subは2つにしました。Sub 数値・Sub 計算 1の数値ボタンを押すと、Sub 数値を呼びます。(フラグを数値にして、数値を足して、それをテキストエリアに表示) +・=の演算ボタンを押すと、Sub 計算を呼びます。 (フラグが数値なら、フラグを演算子にして、合計変数に合計+数値を入れて、テキストエリアに表示します。 確か、ボタンを押したら、そのボタン名をプロパティから取得できたはずです! これで、1~9ボタンのどれを押しても、Sub 数値をCall 数値(プロパティ名)で呼べるはず。 オブジェクト指向は、インスタンスを加工していくことですか? 変数に値を代入しているだけなので、オブジェクト指向ではないないのですね・・・
- redfox63
- ベストアンサー率71% (1325/1856)
その電卓機能で 何を覚えさせるのか明確にしましょう また、関数などの仕様を明確にしましょう 関数(またはプロシージャ)myValueはどのような仕様なんでしょう これは何か値を返すつもりならば Function(関数)として定義します 何も値を呼び出し元に返さないなら Sub(プロシージャ)として定義します コードから察するとプロシージャとして定義したほうがいいでしょう したがって ' 下記のコードは全角空白で字下げ(インデント)していますので ' 構文エラーなどが発生する場合は置換してください Sub myValue( ByVal setData As Decimal) myFlag = False myInput += setData TextBox1 = myInput End Sub といった具合になりそうです ただしこのままでは 変数 myInput,myFlagなどが未定義のままになります Form1全体で使う変数の場合 Form1_Loadなど プロシージャ内で定義するのではなく Public Sub Form1_Load(ByVal sender ... の行の前当たりに Dim myInput As String = "" '入力値 Dim myCalc As String = "+" '演算値 Dim myTotal As Decimal = 0 '合計 Dim myFlag As Boolean = True '入力フラグ(False:数値 True:演算子) を移動させます したがって Dim myInput As String = "" '入力値 Dim myCalc As String = "+" '演算値 Dim myTotal As Decimal = 0 '合計 Dim myFlag As Boolean = True '入力フラグ(False:数値 True:演算子) Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub といった具合になりそうです 他の myCalcurlte,myClear も同様に プロシージャに変更してみましょう VBの設定によりますが ソースを保存しないで終了してしまうと お礼に書かれたような現象は起きますよ
お礼
ありがとうございます。 返事が遅くなり、申し訳ありませんでした。 いろいろいじっていました。 関数などの仕様はjava scriptの既製品そのままをパクりました。 ボタンを押す ↓ フォーム全体で使う変数(入力値・演算子・合計値)に値を代入 この場合は、Subですか?Functionですか? Call myValue() で関数を呼び出してみましたが、この関数を呼び出すことをオブジェクト指向と言っていいですか? ご指摘のほど、よろしくお願いしますmm
- redfox63
- ベストアンサー率71% (1325/1856)
コーディングが滅茶苦茶ですよ 最初と最後はVB その他の3個はC#風(C#の構文にもなっていない) 本来クラス変数であるべき変数を メソッドのローカル変数にしている など まずは VBの構文に添った形でコーディングしてみましょう プロシージャ(メソッド)内で宣言した変数は 外部の関数やプロシージャからは参照できませんよ もう少し情報を整理してからコーディングしましょう
お礼
ありがとうございます。 VS2005がエラーを警告して、プロセスが応答しなくなって、昨日は打ち切りました。 そして今日開いたら、ソリューションエクスプローラーからプロジェクトがすべて消えました。 そんなひどいコードだったということですか。。 またGUIからやり直しです。 >プロシージャ(メソッド)内で宣言した変数は 外部の関数やプロシージャからは参照できませんよ フォーム1で変数を宣言してみました。 なぜならフォーム上のボタンを押したら、フォーム1のパブリック変数に入るのかと思いました。 publicにしたらどこからでも見れるのかと思ってました。 1つ関数をVBの構文にしてくれませんか!お願いします・・・助けてくださいmm myValue(ByVal setData As Decimal){ myFlag = False myInput += setData TextBox1 = myInput } ~~~~~~~~~~~~~~~~~~
お礼
ありがとうございます。 ボタンを押すので数値と演算子しか入らないです。 ゼロ除算するとなにがいけないのかわからないので、Windows XPの電卓で0÷10をやってみました。 「0で割ることはできません。」と表示が出て、びっくりしました! この2つの例外処理を追加したいと思います。ありがとうございますmm