Option Explicit
' รับค่าตัวเลขชุดแรก หรือ ตัวตั้ง
Dim FirstValue As Double
' รับค่าตัวเลขปัจจุบัน
Dim CurrentValue As Double
' เพื่อเลือกเครื่องหมาย + - * / แล้วนำไปประมวลผล
Dim Operator As String
Private Sub Form_Load()
' ตั้งฟอร์มอยู่กึ่งกลาง
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
' เคลียร์ค่า TextBox
txtValue.Text = ""
End Sub
Private Sub cmdExit_Click()
Set frmCalculator = Nothing
End
End Sub
' ###############################################
' รับค่าตัวเลข โดยกำหนด Index ให้กับ CommandButton เพราะมันเป็นการกระทำที่ซ้ำๆกันตลอด
' เมื่อคลิ๊กเลือกปุ่มแต่ละตัว จะใช้คุณสมบัติ Caption ในการดึงค่า หรือ ตัวเลขที่อยู่บนปุ่มมาใช้งาน
' เพราะค่า Input ที่รับเข้ามา คือ 0 - 9 และเครื่องหมายจุดทศนิยมเท่านั้น
' เป็นการลดโค้ดลงไปได้อย่างมากครับ ... พี่น้อง
Private Sub cmdValue_Click(Index As Integer)
' ###############################################
Dim i As Integer, CountDot As Integer
' รับค่าจากการคลิ๊กเลือกปุ่มเข้ามาต่อท้าย โดยอ่านค่า Caption ของปุ่มคำสั่ง
txtValue.Text = txtValue.Text & cmdValue(Index).Caption
' ดักเหตุการณ์การกดเครื่องหมายจุดทศนิยมมากกว่า 1 ตัวครับ ... พี่น้อง
' แนวคิดก็ง่ายมาก ... ให้นับเครื่องหมายจุดทศนิยมที่คลิ๊กเข้ามาเอาไว้ก่อน
For i = 1 To Len(Trim$(txtValue.Text))
If Mid$(Trim$(txtValue.Text), i, 1) = "." Then CountDot = CountDot + 1
Next
' หากนับแล้วมีการกดเครื่องหมายจุดทศนิยมเท่ากับ 2 ตัว ก็ให้ลบความยาวของค่าที่รับมาออกไป 1 ตัว
' เช่น รับมา 12.. นั่นคือ นับความยาวของ txtValue ได้เท่ากับ 4 แล้วลบออก 1 ก็จะเหลือ 12.
' หรือ 12.5. ก็ทำเหมือนกัน นับความยาว txtValue ได้เท่ากับ 5 ลบออกไป 1 ก็จะเหลือ 12.5 อิอิอิอิอิ ... หมูน้อยเลย
' ให้หาทางคิดด้วยวิธีอื่นลองดูด้วยน่ะครับ ... เป็นการฝึกฝนวิทยายุทธให้ล้ำเลิศ พัฒนาได้ก้าวไกลต่อไป
If CountDot = 2 Then txtValue.Text = Mid$(Trim$(txtValue.Text), 1, Len(Trim$(txtValue.Text)) - 1)
' ของแถมการใช้เงื่อนไขการทำซ้ำของ Do While
'i = 1
'CountDot = 0
' กรณีใช้เงื่อนไขด้วยอการอ่านค่าความยาวของชุดตัวเลข
'Do While i <= Len(Trim$(txtValue.Text))
' If Mid$(Trim$(txtValue.Text), i, 1) = "." Then
' CountDot = CountDot + 1
' If CountDot = 2 Then
' txtValue.Text = Mid$(Trim$(txtValue.Text), 1, Len(Trim$(txtValue.Text)) - 1)
' Exit Do
' End If
' End If
' i = i + 1
'Loop
' เก็บค่าปัจจุบันเอาไว้
CurrentValue = Val(txtValue.Text)
End Sub
Private Sub cmdClear_Click()
' เคลียร์ค่าใหม่ให้เป็น 0
FirstValue = 0
CurrentValue = 0
txtValue.Text = ""
End Sub
' ###############################################
' ส่วนของ Operator ต่างๆ + - * /
' ###############################################
Private Sub cmdPlus_Click()
' รับค่าตัวตั้งเข้ามา แล้วเลือกเครื่องหมาย + ต่อไปให้เคลียร์ค่า TextBox เพื่อเตรียมรับเลขชุดต่อไป
txtValue.Text = ""
' ส่งค่าตัวตั้งไปเก็บไว้ในตัวแปร FirstValue เอาไว้ก่อน
FirstValue = CurrentValue
' เคลียร์ค่าปัจจุบันเป็น 0 เพื่อรับตัวเลขชุดต่อไป
CurrentValue = 0
' กำหนดการกระทำ คือ การบวก
Operator = "+"
End Sub
' ส่วนที่เหลือ - * / ก็ทำเหมือนกัน แต่เปลี่ยน Operator ก็เท่านั้นเองครับ
Private Sub cmdMinus_Click()
txtValue.Text = ""
FirstValue = CurrentValue
CurrentValue = 0
Operator = "-"
End Sub
Private Sub cmdMultiply_Click()
txtValue.Text = ""
FirstValue = CurrentValue
CurrentValue = 0
Operator = "*"
End Sub
Private Sub cmdDevide_Click()
txtValue.Text = ""
FirstValue = CurrentValue
CurrentValue = 0
Operator = "/"
End Sub
' ###############################################
' ###############################################
' การสลับเครื่องหมาย
Private Sub cmdNegative_Click()
' ###############################################
' สลับเครื่องหมาย จากบวกเป็นลบ และ จากลบเป็นบวก
' คณิตศาสตร์ฉบับอนุบาลแมวเหมียว ... เมื่อลบเจอบวก ก็กลายเป็นลบ ... เมื่อลบเจอลบ ก็กลายเป็นบวก
CurrentValue = -CurrentValue
' แสดงผลใน TextBox ด้วย
txtValue.Text = CurrentValue
End Sub
' ###############################################
' หาคำตอบโดยเลือกจาก Operator ที่กำหนดเอาไว้ล่วงหน้า
' การที่ผมเลือกใช้ Select Case เพราะมันอ่านง่ายกว่า If Then ElseIf ครับ ...
Private Sub cmdAnswer_Click()
' ###############################################
' คำแนะนำ หากนำไปส่งอาจารย์ ... ก็ลองแก้ไข เช่น
' ใช้ตัวเลขแทน เช่น Case 1 = +, 2 = -, 3 = *, 4 = / (อย่าลืมเปลี่ยนตัวแปร Operator เป็นแบบตัวเลขด้วยน่ะครับ)
' ใช้คำแทน เช่น Case "Plus", "Minus", "Multiply", "Devide"
' หรือ ใช้ If Then ElseIf ไปเลยก็ได้ ... เพื่อความกิ๊บเก๋ ไม่ซ้ำเพื่อน 55555+
Select Case Operator
Case "+"
txtValue.Text = FirstValue + CurrentValue
Case "-"
txtValue.Text = FirstValue - CurrentValue
Case "*"
txtValue.Text = FirstValue * CurrentValue
Case "/"
' ดัก Error เพื่อไม่สามารถหารด้วย 0 ได้ครับ ... หรือ อาจจะให้มีการแจ้งเตือนกับผู้ใช้ด้วยก็ดี
If CurrentValue = 0 Then Exit Sub
txtValue.Text = FirstValue / CurrentValue
End Select
' เก็บค่าเอาไว้ เพื่อให้สามารถทำการคำนวณต่อได้เลย เช่น
' 25 + 3 = 28 (ค่านี้ก็เก็บไว้ใน CurrentValue)
' พอต่อไปก็อาจจะ + 5 เข้าไปอีก ก็จะทำการบวกต่อไปได้เลย (คำตอบ คือ 33)
CurrentValue = Val(txtValue.Text)
End Sub
|