ひとりでんたく。- Visual Basic で電卓つく~る。その8 -←前回。
前回のあらすじ。
あは♪おかしくなってきたw
前回は電卓で言うC(クリア)を作りました。それだけです。(←こっちがあらすじ。)
さて、ここまで、さすがに思いついたまま部分的に作ったのでわやくちゃです。
なので・・・
とりあえずちゃんとつく~る!(なんだこれw)
前回の時点でのCalculator クラスのコードはこちらに置いておきました→こちら。※ 見ると目から汗がでてくるのは気のせいではありません。
すでにうすうす気付いている点をば。
- 1 → + → + って入力する→泣く。
- 1 → + → . って入力する→泣く。
- Decimal の範囲からはみ出たら→逝く。
- 0 除算→逝く。
- 無機能→カオス。
ちゃんとフローを書いてから作ればよかったですね。ええ、最初のエントリの時点で。orz
ま、しかたないのでここらで一度整理整頓。なによりもまず
エラーがでたら・・・もうクリアしてからじゃないとダメっぽく
します。「私たち、やり直せない?」ってことですね。(違
ん~どうしよっかな~?・・・エラー状態かどうかを判断するフィールドをつくりましょうか。それで管理しましょ♪
Private _isError As Boolean
で、以下のような条件式をやんちゃなメソッドの先頭に追加しておきます。
If Me._isError Then
Exit Sub
End If
んでもって、Clear メソッドで、Me._isError = False にするわけですね。あぁ楽チン。
ではまず、
これからなんとかしましょう。現状では + を入力する度に計算処理をしてしまうのが問題ですね。先ほどのエラーの処理も踏まえて以下のように修正します。
Public Sub SetArithmeticOperation(ByVal op As Calculator.ArithmeticOperation)
If Me._isError Then
Exit Sub
End If
If Me._nextInputIsNew AndAlso Me._operation <> ArithmeticOperation.None Then
Me._operation = op
Exit Sub
End If
Me.Calculate()
If Not Me._isError Then
Me._memo = Decimal.Parse(Me.DisplayText)
Me._operation = op
Me._nextInputIsNew = True
End If
End Sub
なんとなく・・・できたかな?つぎー!
小数点を入力する処理で、新しい入力かどうかの判断ができていませんね。orz
コイツも修正修正っと。
Public Sub SetDecimalPoint()
If Me._isError Then
Exit Sub
End If
Dim newText As String
If Me._nextInputIsNew Then
newText = "0"
Me._nextInputIsNew = False
Else
newText = Me.DisplayText
End If
If newText.Contains(".") Then
Exit Sub
Else
newText &= "."
End If
Me.DisplayText = newText
End Sub
さて・・・エラーが出たらやり直しにはできました。でもエラー(例外発生ではない)になりません。だって Me._isError = True ってコード無いですもの。
- Decimal の範囲からはみ出たら→逝く。
- 0 除算→逝く。
計算しておかしなことになったらエラーですね。Calculate メソッドをちょっと修正してみます。ついでにエラーのときはエラーのメッセージを出すようにしましょうか。
Private Sub Calculate()
If Me._isError Then
Exit Sub
End If
Dim errorMessage As String = String.Empty
Dim calcResult As Decimal
Dim current As Decimal
If Decimal.TryParse(Me.DisplayText, current) Then
Try
Select Case Me._operation
Case ArithmeticOperation.Addition
calcResult = Decimal.Add(Me._memo, current)
Case ArithmeticOperation.Subtraction
calcResult = Decimal.Subtract(Me._memo, current)
Case ArithmeticOperation.Multiplication
calcResult = Decimal.Multiply(Me._memo, current)
Case ArithmeticOperation.Division
If current = Decimal.Zero Then
Me._isError = True
errorMessage = "Divide By Zero !? (´д`)"
Exit Select
End If
calcResult = Decimal.Divide(Me._memo, current)
Case Else
Exit Sub
End Select
Catch ex As System.OverflowException
Me._isError = True
errorMessage = "ヽ(`Д´)ノ Overflow!!"
End Try
Else
Me._isError = True
errorMessage = "?? (゚Д゚≡゚Д゚) ??"
End If
If Me._isError Then
Me.DisplayText = errorMessage
Else
Me.DisplayText = calcResult.ToString
End If
End Sub
なんとなく想像で書いていますが、こんな感じかな?(テストしなさいよ。テストを。
で、その他もろもろ(?)ちょっとずつ修正したのをこちらに置いておきますね。
残るは・・・
・・・。
(∩゚д゚)アーアーきこえなーい