ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 3875|ตอบกลับ: 0

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

[คัดลอกลิงก์]

308

กระทู้

498

โพสต์

5973

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
5973


อันที่จริงแอดมินได้เขียนบทความสำหรับ VB6 เอาไว้เมื่อ 8 ปีที่แล้ว วันนี้เอามารีรันให้ใหม่ก็แล้วกันครับ ส่วนการทำ Users Login สำหรับ VB.NET คลิ๊กเข้าไปอ่านได้ที่นี่ ...

ทำความเข้าใจกับชุดโครงสร้างข้อมูล สำหรับ Visual Basic 6.0
การกำหนดชนิดของข้อมูลเป็นชุดๆเอาไว้ ในลักษณะเป็นแบบ โครงสร้าง (Structure) โดยที่ทำการกำหนดรูปแบบต่างๆเอาเอง หรือ เรียกว่า User-Defined Types (UDTs) จะประกอบไปด้วยประเภทของข้อมูลหลากหลายชนิด เช่น String, Long หรือ Boolean มาประกอบรวมกันเป็นชุดข้อมูล แต่การกำหนด หรือ ประกาศจะถือว่าเป็นเพียงต้นแบบ หรือ Template เท่านั้นนะครับ ยังเรียกใช้งานโดยตรง หรือ เก็บข้อมูลเข้าไปไม่ได้ โดยมีรูปแบบดังต่อไปนี้ คือ ... แอ่นแอ้นนนนนน
  1. [Public | Private] Type TypeName
  2.     Variable1 As DataType
  3.     Variable2 As DataType
  4.     ...
  5.     ...
  6.     VariableN As DataType
  7. End Type
คัดลอกไปที่คลิปบอร์ด

modVarType.bas - เก็บตัวแปรชนิดโครงสร้าง
  1. ' ========================================================
  2. ' การกำหนดชนิดของข้อมูลเป็นชุดเอาไว้ (Structure) หรือ User-defined Types (UDTs)
  3. ' โดยจะประกอบไปด้วยประเภทของข้อมูลหลายชนิด เช่น String, Long หรือ Boolean
  4. ' การประกาศ USER_INFO และประกอบด้วยชนิดของข้อมูลหลากหลาย ... แต่ขณะนี้
  5. ' มันเป็นเพียงต้นแบบ หรือ Template เท่านั้นน่ะครับ ... ยังเรียกใช้งานโดยตรงไม่ได้
  6. ' ========================================================
  7. ' *** จะต้องกำหนดการใช้งานที่ Module ด้วยเท่านั้นนะครับ ***
  8. Public Type USER_INFO

  9.     ' Primary Key ของ User
  10.     USER_USERPK As Integer
  11.    
  12.     ' ชื่อผู้ใช้ที่เข้ามาสู่ระบบ
  13.     USER_USERID As String
  14.    
  15.     ' รหัสผ่าน
  16.     USER_PASSWORD As String
  17.    
  18.     ' เป็น Administrator หรือ ผู้ดูแลระบบหรือไม่
  19.     USER_ISADMIN As Boolean
  20.    
  21.     ' เก็บชื่อเต็มของผู้ใช้ เช่น ผู้ดูแลระบบ หรือ พนักงาน 1
  22.     USER_COMPLETENAME As String
  23.    
  24.     ' วันเวลาที่เข้าสู่ระบบ
  25.     USER_TIMELOGIN As Date

  26. End Type
  27. ' ========================================================
คัดลอกไปที่คลิปบอร์ด

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

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

  6. ' =========================== เพิ่มเติม ========================
  7. ' ในกรณีที่เราต้องการกำหนดระดับ User ให้มีหลายๆระดับ
  8. ' - กำหนดฟิลด์ในตารางข้อมูล UserLevel แบบ Byte ก็พอ (เหลือเฟือ)
  9. ' - กำหนด Data Type คือ USER_LEVEL As Byte
  10. ' เช่น 0 = Admin, 1 = Manager, 2 = User
  11. ' =========================================================
คัดลอกไปที่คลิปบอร์ด

frmLogin.frm - เป็นฟอร์มหลักและทำการตรวจสอบ User/Password
  1. Option Explicit

  2. Private Sub Form_Load()
  3.     Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
  4.     txtUserID.Text = ""
  5.     txtPassword.Text = ""
  6.    
  7.     Call OpenDataBase
  8.    
  9. End Sub

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

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

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

  19.     ' เริ่มตรวจสอบชื่อผู้ใช้งานก่อนว่ามีในระบบหรือไม่
  20.     ' การกำหนด Set RS = New Recordset หมายถึงการปิด RecordSet เดิมลง (กรณีเปิดค้างไว้)
  21.     Set RS = New Recordset
  22.     Statement = "SELECT * FROM tblUser WHERE UserID = " & "'" & Trim(txtUserID) & "'"
  23.     RS.CursorLocation = adUseClient
  24.     RS.Open Statement, ConnDB, adOpenForwardOnly, adLockReadOnly, adCmdText
  25.    
  26.     ' การใช้ RecordCount ได้ เราต้องตั้งการอ่านแบบ RS.CursorLocation = adUseClient
  27.     ' หากพบข้อมูลให้คัดลอกรหัสผ่านไว้ในตัวแปรก่อน ... อันนี้เผื่อเอาไว้ในกรณีที่มีการเข้ารหัสข้อมูล (Encrypt Data)
  28.     If RS.RecordCount > 0 Then
  29.         
  30.         strPass = "" & RS("Password")
  31.         
  32.         ' กรณีที่เราเข้ารหัสข้อมูล (Encrypt) ก็ต้องถอดรหัส (Decrypt) ก่อน จึงจะเปรียบเทียบค่าได้
  33.         ' นี่แหละคือสาเหตุที่ผมต้องแยกการตรวจสอบชื่อผู้ใช้  และ รหัสผ่าน ออกจากกัน
  34.         ' เช่น strPass = DecryptData(RS("Password"))
  35.         
  36.     ' ไม่พบข้อมูลให้กลับไปแก้ไขใหม่
  37.     Else
  38.         MsgBox "ชื่อผู้ใช้งานไม่ถูกต้อง กรุณาลองใหม่อีกครั้ง.", vbOKOnly + vbExclamation, "รายงานสถานะ"
  39.         txtUserID.SetFocus
  40.         RS.Close:   Set RS = Nothing
  41.         Exit Sub
  42.     End If
  43.    
  44.     ' เมื่อชื่อผู้ใช้ถูกต้องแล้ว ก็ไปตรวจสอบรหัสผ่านในลำดับต่อไป
  45.     ' ตรวจสอบรหัสผ่านของผู้ใช้งานก่อนว่าตรงกันกับในระบบหรือไม่ โดยปรับตัวอักขระทุกตัวให้เป็นตัวเล็ก (LCase)
  46.     If LCase(txtPassword.Text) <> LCase(strPass) Then
  47.         MsgBox "รหัสผ่านไม่ถูกต้อง กรุณาลองใหม่อีกครั้ง.", vbOKOnly + vbExclamation, "รายงานสถานะ"
  48.         txtPassword.SetFocus
  49.         RS.Close:   Set RS = Nothing
  50.         Exit Sub
  51.     End If
  52.    
  53.     ' คัดลอกค่าต่างๆที่จำเป็นเอาไว้ในชุดข้อมูล CurrUser เพื่อนำไปใช้ประโยชน์ได้ในภายหลัง
  54.     ' เช่น การเปลี่ยนรหัสผ่าน หรือ การตรวจสอบสถานะว่า User นี้ เข้าถึงข้อมูลได้ในระดับไหน
  55.     ' จากส่วนของโมดูล ... modVarType.bas
  56.     With CurrUser
  57.    
  58.         ' ตัวนี้สำคัญเลย เมื่อเวลาการบันทึกข้อมูลลงไปในตารางอื่นๆ จะได้รู้ว่า User ใดเป็นผู้กระทำ
  59.         ' เราเก็บเฉพาะค่า Primary Key หรือ UserPK นะครับ ... UserID ไม่ได้เอาไปเก็บด้วย
  60.         ' ต้องแยกความแตกต่างระหว่าง Primary Key กับพวกเหล่า ID ทั้งหลายเช่น รหัสผู้ใช้
  61.         ' รหัสสินค้า รหัสลูกค้า เหล่านี้ด้วยครับ
  62.         .USER_USERPK = RS("UserPK")
  63.         ' เช่น UserPK = 1, UserID = ADMIN
  64.         ' ไม่ว่าคุณจะเปลี่ยนชื่อ UserID จาก ADMIN มาเป็น THONGKORN หรือ SURAPON ก็ตาม
  65.         ' มันก็ยังชี้ชัดๆว่าเป็น User คนเดียวกันอยู่วันยังค่ำ โดยไม่ต้องไปเปลี่ยนแปลงข้อมูลใดๆในตารางอื่นๆเลย
  66.         ' เพราะเราไม่ได้เปลี่ยนแปลงค่า Primary Key ที่จะสร้างความสัมพันธ์ไปยังตารางอื่นๆ
  67.         
  68.         .USER_USERID = "" & RS("UserID")
  69.         
  70.         ' นำไปใช้ในเวลาที่ผู้ใช้ต้องการเปลี่ยนรหัสผ่าน
  71.         .USER_PASSWORD = LCase(strPass)
  72.         
  73.         .USER_COMPLETENAME = "" & RS("CompleteName")
  74.         .USER_TIMELOGIN = Now()
  75.         
  76.         ' True คือ Admin ... หากเป็น False ก็คือระดับ User
  77.         .USER_ISADMIN = RS("Admin")
  78.         
  79.     End With
  80.     RS.Close:   Set RS = Nothing
  81.    
  82.     ' เข้าสู่ระบบ ... ทดสอบเอาค่าชนิดข้อมูลที่ประกาศเอาไว้มาใช้งาน
  83.     ' ทดสอบว่าเป็นระดับ  Admin หรือไม่ ...
  84.     If CurrUser.USER_ISADMIN Then
  85.         MsgBox "ยินดีต้อนรับคุณ " & CurrUser.USER_COMPLETENAME & " เข้าสู่ระบบ" & vbCrLf & _
  86.         "คุณอยู่ในระดับ Administrator.", vbOKOnly + vbInformation, "รายงานสถานะ"
  87.     Else
  88.         MsgBox "ยินดีต้อนรับคุณ " & CurrUser.USER_COMPLETENAME & " เข้าสู่ระบบ" & vbCrLf & _
  89.         "คุณอยู่ในระดับ User เท่านั้น.", vbOKOnly + vbInformation, "รายงานสถานะ"
  90.     End If
  91.    
  92.     ' ปกติก็ต้อง Unload แล้วเรียกฟอร์มหลักขึ้นใช้งาน
  93.     End
  94.    
  95. End Sub

  96. Private Sub Form_Activate()
  97.     txtUserID.SetFocus
  98. End Sub

  99. Private Sub Form_Unload(Cancel As Integer)
  100.     Call CloseDataBase
  101.     Set frmLogin = Nothing
  102.     End
  103. End Sub

  104. Private Sub cmdExit_Click()
  105.     Unload Me
  106. End Sub

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

  111. Private Sub txtPassword_KeyPress(KeyAscii As Integer)
  112.     If KeyAscii = 13 Then
  113.         KeyAscii = 0
  114.         Call cmdOK_Click
  115.     End If
  116. End Sub

  117. Private Sub txtUserID_GotFocus()
  118.     Call HLText(txtUserID)
  119. End Sub

  120. Private Sub txtPassword_GotFocus()
  121.     Call HLText(txtPassword)
  122. End Sub

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

  127. Private Sub txtUserID_KeyPress(KeyAscii As Integer)
  128.     If KeyAscii = 13 Then
  129.         KeyAscii = 0
  130.         SendKeys "{TAB}"
  131.     Else
  132.         ' ตรวจสอบการรับค่าเฉพาะตัวเลขและตัวอักษรภาษาอังกฤษตัวเล็ก และ ตัวใหญ่ (0-9, a - z, A-Z)
  133.         KeyAscii = CheckAlphaNumeric(KeyAscii)
  134.     End If
  135. End Sub
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับแบบเต็ม VB6 (SP6) ได้ที่นี่

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-3-29 20:40 , Processed in 0.226557 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้