Subwayeatfresh
Subwayeatfresh

Reputation: 59

Triangle Calculator for vb.net, unknow error

Public Class Triangle
    Inherits Form1
    Private SideA As Single
    Property a() As Single
        Get
            Return SideA
        End Get
        Set(value As Single)
            SideA = value
        End Set
    End Property
    Private SideB As Single
    Property b() As Single
        Get
            Return SideA
        End Get
        Set(value As Single)
            SideB = value
        End Set
    End Property
    Private SideC As Single
    Property C() As Single
        Get
            Return SideA
        End Get
        Set(value As Single)
            SideC = value
        End Set
    End Property

    Private Semiperimeter As Single
    ReadOnly Property s() As Single
        Get
            Return Semiperimeter
        End Get
    End Property
    'consrtuctor 
    Sub New(ByVal sngSideA As Single, ByVal sngSideB As Single, ByVal sngSideC As Single)

        Me.SideA = sngSideA
        Me.SideB = sngSideB
        Me.SideC = sngSideC
        Me.Semiperimeter = 0.5 * (SideA + SideB + SideC)

    End Sub

    'Public methods 

    '-----------------------------------------------------------------------
    'Returns true if sides are a,b,c are valid for a triangle 
    'post:true returned if te sum of sides a and b are greaerthan side c. False returned otherwise 
    '-----------------------------------------------------------------------

    Public Function ValidTriangle() As Boolean

        If SideA + SideB > SideC Then 'valid triangle
            Return True
        Else
            Return False
        End If
    End Function

    '--------------------------------------------------------------------
    'Pre: sides a,b, and c correspond to a valid triangle 
    'post: Area of a triangle returned 
    '---------------------------------------------------------------------

    Public Function Area() As Single

        Return Math.Sqrt(Semiperimeter * (Semiperimeter - SideA) * (Semiperimeter - SideB) * (Semiperimeter - SideC))

    End Function

    '--------------------------------------------------------------------
    'Returns the type (right, acute, obtuse) of an triangle 
    'Pre: Sides a,b, and c correpond to a valid riangle 
    'Post: type of a triangle returned
    '-------------------------------------------------------------------
    Public Function Type() As String

        Select Case SideC ^ 2
            Case SideA ^ 2 + SideB ^ 2
                Return "Right Triangle."
            Case Is < SideA ^ 2 + SideB ^ 2
                Return "Acute Triangle."
            Case Is > SideA ^ 2 + SideB ^ 2
                Return "Obtuse Triangle."
        End Select
    End Function
End Class
-------------------------------------------------------------------------------------------
Public Class Form1
    Inherits System.Windows.Forms.Form
    Private Sub Calculate(ByVal sender As Object, ByVal e As EventArgs) Handles btnArea.Click, btnPerimeter.Click, btnType.Click

        Dim sngSideA As Single = Val(Me.txtSideA.Text)
        Dim sngSideB As Single = Val(Me.txtSideB.Text)
        Dim sngSideC As Single = Val(Me.txtSideC.Text)
        Dim UserTriangle As New Triangle(sngSideA, sngSideB, sngSideC)

        If UserTriangle.ValidTriangle Then
            Dim btnButtonClicked As Button = sender
            Select Case btnButtonClicked.Tag
                Case "Area"
                    Me.lblArea.Text = UserTriangle.Area
                Case "Perimeter"
                    Me.lblPerimeter.Text = UserTriangle.s * 2
                Case "Type"
                    Me.lblType.Text = UserTriangle.Type
            End Select
        Else
            MessageBox.Show("Measurements are wrong")
            Me.txtSideA.Text = Nothing
            Me.txtSideB.Text = Nothing
            Me.txtSideC.Text = Nothing
        End If
    End Sub

    Private Sub SideChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtSideA.TextChanged, txtSideB.TextChanged, txtSideC.TextChanged
        Me.lblArea.Text = Nothing
        Me.lblPerimeter.Text = Nothing
        Me.lblType.Text = Nothing
    End Sub
End Class

ok soooo i do apologize for pretty much only using code but i'm so lost...... Can someone please explain to me why my triangle calculator doesn't work. The program runs with no errors and it works if I click one of the buttons before I enter any values. Once again, I'm really sorry... and thanks for any help you can provide.

Upvotes: 1

Views: 855

Answers (2)

Idle_Mind
Idle_Mind

Reputation: 39122

Instead of using the Tag() property and a String, you can literally check if the Sender is a particular Button like this:

    If UserTriangle.ValidTriangle Then
        If sender Is btnArea Then
            Me.lblArea.Text = UserTriangle.Area
        ElseIf sender Is btnPerimeter Then
            Me.lblPerimeter.Text = UserTriangle.s * 2
        Else
            Me.lblType.Text = UserTriangle.Type
        End If
    Else
        MessageBox.Show("Measurements are wrong")
        Me.txtSideA.Text = Nothing
        Me.txtSideB.Text = Nothing
        Me.txtSideC.Text = Nothing
    End If

Upvotes: 1

Karl Anderson
Karl Anderson

Reputation: 34846

This is a problem:

Dim btnButtonClicked As Button = sender

You need to cast the sender to a Button, like this:

Dim btnButtonClicked As Button = DirectCast(sender, Button)

Now you can check the Tag property of the button like you are in this code:

Select Case btnButtonClicked.Tag
    Case "Area"
        Me.lblArea.Text = UserTriangle.Area
    Case "Perimeter"
        Me.lblPerimeter.Text = UserTriangle.s * 2
    Case "Type"
        Me.lblType.Text = UserTriangle.Type
    End Select

By the way, it works when you click the button without entering any values, because the UserTriangle.ValidTriangle returns False and the offending line above does not execute.

Upvotes: 2

Related Questions