thongkorn โพสต์ 2017-11-29 13:07:20

[VB6] การทำระบบเข้าสู่การใช้งาน (Users Login) ด้วยการใช้โครงสร้าง หรือ Structure

http://www.g2gnet.com/webboard/images/vb6/LoginStructure.png
อันที่จริงแอดมินได้เขียนบทความสำหรับ VB6 เอาไว้เมื่อ 8 ปีที่แล้ว วันนี้เอามารีรันให้ใหม่ก็แล้วกันครับ ส่วนการทำ Users Login สำหรับ VB.NET คลิ๊กเข้าไปอ่านได้ที่นี่ ...

ทำความเข้าใจกับชุดโครงสร้างข้อมูล สำหรับ Visual Basic 6.0
การกำหนดชนิดของข้อมูลเป็นชุดๆเอาไว้ ในลักษณะเป็นแบบ โครงสร้าง (Structure) โดยที่ทำการกำหนดรูปแบบต่างๆเอาเอง หรือ เรียกว่า User-Defined Types (UDTs) จะประกอบไปด้วยประเภทของข้อมูลหลากหลายชนิด เช่น String, Long หรือ Boolean มาประกอบรวมกันเป็นชุดข้อมูล แต่การกำหนด หรือ ประกาศจะถือว่าเป็นเพียงต้นแบบ หรือ Template เท่านั้นนะครับ ยังเรียกใช้งานโดยตรง หรือ เก็บข้อมูลเข้าไปไม่ได้ โดยมีรูปแบบดังต่อไปนี้ คือ ... แอ่นแอ้นนนนนน
Type TypeName
    Variable1 As DataType
    Variable2 As DataType
    ...
    ...
    VariableN As DataType
End Type
modVarType.bas - เก็บตัวแปรชนิดโครงสร้าง
' ========================================================
' การกำหนดชนิดของข้อมูลเป็นชุดเอาไว้ (Structure) หรือ User-defined Types (UDTs)
' โดยจะประกอบไปด้วยประเภทของข้อมูลหลายชนิด เช่น String, Long หรือ Boolean
' การประกาศ USER_INFO และประกอบด้วยชนิดของข้อมูลหลากหลาย ... แต่ขณะนี้
' มันเป็นเพียงต้นแบบ หรือ Template เท่านั้นน่ะครับ ... ยังเรียกใช้งานโดยตรงไม่ได้
' ========================================================
' *** จะต้องกำหนดการใช้งานที่ Module ด้วยเท่านั้นนะครับ ***
Public Type USER_INFO

    ' Primary Key ของ User
    USER_USERPK As Integer
   
    ' ชื่อผู้ใช้ที่เข้ามาสู่ระบบ
    USER_USERID As String
   
    ' รหัสผ่าน
    USER_PASSWORD As String
   
    ' เป็น Administrator หรือ ผู้ดูแลระบบหรือไม่
    USER_ISADMIN As Boolean
   
    ' เก็บชื่อเต็มของผู้ใช้ เช่น ผู้ดูแลระบบ หรือ พนักงาน 1
    USER_COMPLETENAME As String
   
    ' วันเวลาที่เข้าสู่ระบบ
    USER_TIMELOGIN As Date

End Type
' ========================================================
อย่างไรก็ตามการกำหนด UDTs เอาไว้มันยังไม่เพียงพอ เพราะ USER_INFO เปรียบเสมือนเป็นเพียง Template ซึ่งมันยังไม่สามารถจัดเก็บข้อมูลเข้าไปได้ เราจึงต้องกำหนดตัวแปรให้กับชุดข้อมูล (UDTs) ก่อนดังนี้ คือ
Public CurrUser As USER_INFO
' เพื่อให้เรียกใช้งานชุดข้อมูล USER_INFO ผ่านทางตัวแปร CurrUser อีกที

' การเรียกใช้งาน เช่น ....
' CurrUser.USER_ID ... ก็จะแสดงค่าของชื่อผู้ใช้ เช่น ADMIN หรือ USER
' CurrUser.USER_ISADMIN ... เก็บสถานะว่าเป็น True หรือ False ...

' =========================== เพิ่มเติม ========================
' ในกรณีที่เราต้องการกำหนดระดับ User ให้มีหลายๆระดับ
' - กำหนดฟิลด์ในตารางข้อมูล UserLevel แบบ Byte ก็พอ (เหลือเฟือ)
' - กำหนด Data Type คือ USER_LEVEL As Byte
' เช่น 0 = Admin, 1 = Manager, 2 = User
' =========================================================
frmLogin.frm - เป็นฟอร์มหลักและทำการตรวจสอบ User/Password
Option Explicit

Private Sub Form_Load()
    Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
    txtUserID.Text = ""
    txtPassword.Text = ""
   
    Call OpenDataBase
   
End Sub

' / ------------------------------------------------------------------
' เริมต้นทำการตรวสอบข้อมูลของผู้ใช้งาน
Private Sub cmdOK_Click()
' / ------------------------------------------------------------------

' ตัวแปรเก็บค่ารหัสผ่านจากตารางข้อมูล
Dim strPass As String

    ' ตรวจสอบค่าว่างหรือไม่ ... หากใช่ให้กลับไปป้อนชื่อผู้ใช้ หรือ รหัสผ่านใหม่
    If Trim(txtUserID.Text) = "" Or Len(Trim(txtUserID.Text)) = 0 Then txtUserID.SetFocus: Exit Sub
    If Trim(txtPassword.Text) = "" Or Len(Trim(txtPassword.Text)) = 0 Then txtPassword.SetFocus: Exit Sub

    ' เริ่มตรวจสอบชื่อผู้ใช้งานก่อนว่ามีในระบบหรือไม่
    ' การกำหนด Set RS = New Recordset หมายถึงการปิด RecordSet เดิมลง (กรณีเปิดค้างไว้)
    Set RS = New Recordset
    Statement = "SELECT * FROM tblUser WHERE UserID = " & "'" & Trim(txtUserID) & "'"
    RS.CursorLocation = adUseClient
    RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
   
    ' การใช้ RecordCount ได้ เราต้องตั้งการอ่านแบบ RS.CursorLocation = adUseClient
    ' หากพบข้อมูลให้คัดลอกรหัสผ่านไว้ในตัวแปรก่อน ... อันนี้เผื่อเอาไว้ในกรณีที่มีการเข้ารหัสข้อมูล (Encrypt Data)
    If RS.RecordCount > 0 Then
      
      strPass = "" & RS("Password")
      
      ' กรณีที่เราเข้ารหัสข้อมูล (Encrypt) ก็ต้องถอดรหัส (Decrypt) ก่อน จึงจะเปรียบเทียบค่าได้
      ' นี่แหละคือสาเหตุที่ผมต้องแยกการตรวจสอบชื่อผู้ใช้และ รหัสผ่าน ออกจากกัน
      ' เช่น strPass = DecryptData(RS("Password"))
      
    ' ไม่พบข้อมูลให้กลับไปแก้ไขใหม่
    Else
      MsgBox "ชื่อผู้ใช้งานไม่ถูกต้อง กรุณาลองใหม่อีกครั้ง.", vbOKOnly + vbExclamation, "รายงานสถานะ"
      txtUserID.SetFocus
      RS.Close:   Set RS = Nothing
      Exit Sub
    End If
   
    ' เมื่อชื่อผู้ใช้ถูกต้องแล้ว ก็ไปตรวจสอบรหัสผ่านในลำดับต่อไป
    ' ตรวจสอบรหัสผ่านของผู้ใช้งานก่อนว่าตรงกันกับในระบบหรือไม่ โดยปรับตัวอักขระทุกตัวให้เป็นตัวเล็ก (LCase)
    If LCase(txtPassword.Text) <> LCase(strPass) Then
      MsgBox "รหัสผ่านไม่ถูกต้อง กรุณาลองใหม่อีกครั้ง.", vbOKOnly + vbExclamation, "รายงานสถานะ"
      txtPassword.SetFocus
      RS.Close:   Set RS = Nothing
      Exit Sub
    End If
   
    ' คัดลอกค่าต่างๆที่จำเป็นเอาไว้ในชุดข้อมูล CurrUser เพื่อนำไปใช้ประโยชน์ได้ในภายหลัง
    ' เช่น การเปลี่ยนรหัสผ่าน หรือ การตรวจสอบสถานะว่า User นี้ เข้าถึงข้อมูลได้ในระดับไหน
    ' จากส่วนของโมดูล ... modVarType.bas
    With CurrUser
   
      ' ตัวนี้สำคัญเลย เมื่อเวลาการบันทึกข้อมูลลงไปในตารางอื่นๆ จะได้รู้ว่า User ใดเป็นผู้กระทำ
      ' เราเก็บเฉพาะค่า Primary Key หรือ UserPK นะครับ ... UserID ไม่ได้เอาไปเก็บด้วย
      ' ต้องแยกความแตกต่างระหว่าง Primary Key กับพวกเหล่า ID ทั้งหลายเช่น รหัสผู้ใช้
      ' รหัสสินค้า รหัสลูกค้า เหล่านี้ด้วยครับ
      .USER_USERPK = RS("UserPK")
      ' เช่น UserPK = 1, UserID = ADMIN
      ' ไม่ว่าคุณจะเปลี่ยนชื่อ UserID จาก ADMIN มาเป็น THONGKORN หรือ SURAPON ก็ตาม
      ' มันก็ยังชี้ชัดๆว่าเป็น User คนเดียวกันอยู่วันยังค่ำ โดยไม่ต้องไปเปลี่ยนแปลงข้อมูลใดๆในตารางอื่นๆเลย
      ' เพราะเราไม่ได้เปลี่ยนแปลงค่า Primary Key ที่จะสร้างความสัมพันธ์ไปยังตารางอื่นๆ
      
      .USER_USERID = "" & RS("UserID")
      
      ' นำไปใช้ในเวลาที่ผู้ใช้ต้องการเปลี่ยนรหัสผ่าน
      .USER_PASSWORD = LCase(strPass)
      
      .USER_COMPLETENAME = "" & RS("CompleteName")
      .USER_TIMELOGIN = Now()
      
      ' True คือ Admin ... หากเป็น False ก็คือระดับ User
      .USER_ISADMIN = RS("Admin")
      
    End With
    RS.Close:   Set RS = Nothing
   
    ' เข้าสู่ระบบ ... ทดสอบเอาค่าชนิดข้อมูลที่ประกาศเอาไว้มาใช้งาน
    ' ทดสอบว่าเป็นระดับAdmin หรือไม่ ...
    If CurrUser.USER_ISADMIN Then
      MsgBox "ยินดีต้อนรับคุณ " & CurrUser.USER_COMPLETENAME & " เข้าสู่ระบบ" & vbCrLf & _
      "คุณอยู่ในระดับ Administrator.", vbOKOnly + vbInformation, "รายงานสถานะ"
    Else
      MsgBox "ยินดีต้อนรับคุณ " & CurrUser.USER_COMPLETENAME & " เข้าสู่ระบบ" & vbCrLf & _
      "คุณอยู่ในระดับ User เท่านั้น.", vbOKOnly + vbInformation, "รายงานสถานะ"
    End If
   
    ' ปกติก็ต้อง Unload แล้วเรียกฟอร์มหลักขึ้นใช้งาน
    End
   
End Sub

Private Sub Form_Activate()
    txtUserID.SetFocus
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call CloseDataBase
    Set frmLogin = Nothing
    End
End Sub

Private Sub cmdExit_Click()
    Unload Me
End Sub

Private Sub txtPassword_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyDown Then SendKeys "{TAB}"
    If KeyCode = vbKeyUp Then SendKeys "+{TAB}"
End Sub

Private Sub txtPassword_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
      KeyAscii = 0
      Call cmdOK_Click
    End If
End Sub

Private Sub txtUserID_GotFocus()
    Call HLText(txtUserID)
End Sub

Private Sub txtPassword_GotFocus()
    Call HLText(txtPassword)
End Sub

Private Sub txtUserID_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyDown Then SendKeys "{TAB}"
    If KeyCode = vbKeyUp Then SendKeys "+{TAB}"
End Sub

Private Sub txtUserID_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
      KeyAscii = 0
      SendKeys "{TAB}"
    Else
      ' ตรวจสอบการรับค่าเฉพาะตัวเลขและตัวอักษรภาษาอังกฤษตัวเล็ก และ ตัวใหญ่ (0-9, a - z, A-Z)
      KeyAscii = CheckAlphaNumeric(KeyAscii)
    End If
End Subดาวน์โหลดโค้ดต้นฉบับแบบเต็ม VB6 (SP6) ได้ที่นี่
หน้า: [1]
ดูในรูปแบบกติ: [VB6] การทำระบบเข้าสู่การใช้งาน (Users Login) ด้วยการใช้โครงสร้าง หรือ Structure