|
อันที่จริงแอดมินได้เขียนบทความสำหรับ VB6 เอาไว้เมื่อ 8 ปีที่แล้ว วันนี้เอามารีรันให้ใหม่ก็แล้วกันครับ ส่วนการทำ Users Login สำหรับ VB.NET คลิ๊กเข้าไปอ่านได้ที่นี่ ...
ทำความเข้าใจกับชุดโครงสร้างข้อมูล สำหรับ Visual Basic 6.0
การกำหนดชนิดของข้อมูลเป็นชุดๆเอาไว้ ในลักษณะเป็นแบบ โครงสร้าง (Structure) โดยที่ทำการกำหนดรูปแบบต่างๆเอาเอง หรือ เรียกว่า User-Defined Types (UDTs) จะประกอบไปด้วยประเภทของข้อมูลหลากหลายชนิด เช่น String, Long หรือ Boolean มาประกอบรวมกันเป็นชุดข้อมูล แต่การกำหนด หรือ ประกาศจะถือว่าเป็นเพียงต้นแบบ หรือ Template เท่านั้นนะครับ ยังเรียกใช้งานโดยตรง หรือ เก็บข้อมูลเข้าไปไม่ได้ โดยมีรูปแบบดังต่อไปนี้ คือ ... แอ่นแอ้นนนนนน
- [Public | Private] 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) ได้ที่นี่
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|