Давайте посмотрим на первую функцию, чтобы увидеть, где она идет не так.
Function CalcOilLubeCharges() As Decimal
Const Oil = 36.0
Const Lube = 28.0
If chkOil.Checked Then
CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Oil)
End If
В первой строке объявляется функция с именем CalcOilLubeCharges и типом возврата Decimal
В следующих двух строках объявляются константы. Компилятор не знает, что вы будете иметь sh для работы с десятичной дробью (предпочтительно при работе с деньгами), поэтому он принимает Double. Вы можете сказать это, удерживая курсор над Oil
и Lube
. Чтобы исправить это место через D
после числа.
Давайте предположим, что проверено chkOil
. Теперь приходит беда.
CalcOilLubeCharges = CInt(CalcOilLubeCharges() + Lube)
Правая сторона присваивания вызывает CalcOilLubeCharges
, метод, в котором мы находимся. Возможно, вы ошибочно предположили, что это переменная, но это имя Function
. Это происходит снова и снова, пока мы не получим переполнение стека.
Чтобы исправить это, используйте локально объявленную переменную для хранения значений.
Я также показал вам краткий способ сложения с +=
.
Function CalcOilLubeCharges() As Decimal
Const Oil = 36D
Const Lube = 28D
Dim LubeOilCharge As Decimal
If chkOil.Checked Then
LubeOilCharge += Oil
End If
If chkLube.Checked Then
LubeOilCharge += Lube
End If
Return LubeOilCharge
End Function
Function CalcFlushCharges() As Decimal
Const Radiator = 50D
Const Transmission = 120D
Dim Flush As Decimal
If chkRadiator.Checked Then
Flush += Radiator
End If
If chkTransmission.Checked Then
Flush += Transmission
End If
Return Flush
End Function
Function CalcMiscCharges() As Decimal
Const Inspection = 36D
Const Muffler = 200D
Const Rotation = 20D
Dim Misc As Decimal
If chkInspection.Checked Then
Misc += Inspection
End If
If chkMuffler.Checked Then
Misc += Muffler
End If
If chkTireRotation.Checked Then
Misc += Rotation
End If
Return Misc
End Function
Sub CalculateTotalCharges()
Dim TotalCharges As Decimal
TotalCharges = CalcMiscCharges() + CalcOilLubeCharges() + CalcFlushCharges()
lbTotalFeesOutput.Text = TotalCharges.ToString("N2")
End Sub