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

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

[VB.NET] โค้ดประยุกต์ใช้งาน CheckedListBox Control กับข้อมูลเท็กซ์ไฟล์แบบ INI (Initialize File)

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

310

กระทู้

501

โพสต์

6035

เครดิต

ผู้ดูแลระบบ

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

Rank: 9Rank: 9Rank: 9

เครดิต
6035


สำหรับบทความนี้แอดมินจะแสดงให้เห็นถึงการนำเอา CheckedListBox Control มาประยุกต์ใช้งานกับข้อมูล Initailize File หรือ INI สาระสำคัญคือ การแยก (Parser) ข้อมูลในตัว INI ซึ่งจะประกอบไปด้วย Section ตามด้วย Key และ Value เช่น  
[test]
Item 1 = True
Item 2 = False
Item 3 = True

[language]
default=thai

เมื่อข้อมูลที่อยู่ในเครื่องหมาย Bracket [] คือ Section ส่วน Item 1 คือ Key และ True คือ Value ... โดยทั่วๆไปก็ไม่ค่อยมีปัญหามากมายนักกับการอ่านข้อมูลในแต่ละ Section ที่มีรูปแบบตายตัวเหมือนตัวอย่างด้านบน แต่บางครั้งปัญหาจะเกิดในลักษณะของการจัดเก็บข้อมูลในแบบ Dynamic ที่ทำให้เกิดความยืดหยุ่นของงานโปรแกรมมากกว่าแบบ Static ดังนั้นปัญหาของ INI Parser ก็คือในกรณีเราไม่รู้จุดสิ้นสุดของข้อมูลในแต่ละชุด ...

แอดมินก็พึ่งหัดใช้ CheckedListBox เป็นครั้งแรก ซึ่งการเริ่มต้นฝึกฝนของแอดมิน ก็จะก้าวข้ามส่วนของการ Design Time ไป แล้วมักจะใช้วิธีการเขียนโค้ดแบบ Run Time แทน เช่น โค้ดตัวอย่างนี้เป็นการสร้าง Item ขึ้นมาด้วยโค้ด และสุ่มค่าเลขคู่/คี่เพื่อกำหนด Checked/Unchecked ในแต่ละ Item
  1.     ' / --------------------------------------------------------------------
  2.     ' / สร้าง CheckedListBox และสุ่มค่า Check/Uncheck ทำการทดสอบ
  3.     Private Sub CreateSample()
  4.         Me.CheckedListBox1.Items.Clear()
  5.         Dim RndClass As New Random
  6.         For i As Integer = 0 To 14
  7.             With Me.CheckedListBox1
  8.                 .Items.Add("Item " & i + 1)
  9.                 If RndClass.Next(0, 99) Mod 2 = 0 Then
  10.                     CheckedListBox1.SetItemChecked(i, CheckState.Checked)
  11.                 End If
  12.             End With
  13.         Next
  14.     End Sub
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของการแยกแยะ Key กับ Value ออกจากกัน
  1.     ' / --------------------------------------------------------------------
  2.     ' / แยก Key และ Value เพื่อแสดงผลใน CheckedListBox
  3.     Private Sub ParserCheckedListBox(ByVal iniFile As String, ByVal Section As String)
  4.         Dim blnMatch As Boolean = False
  5.         Dim iRow As Integer = 0
  6.         '/ Reads each line from the text file one at a time.
  7.         For Each line As String In IO.File.ReadLines(iniFile)
  8.             '/ ต้องเช็คก่อนว่าเป็น Section ที่ต้องการหรือไม่? (ใส่ Lower Case หรือให้เป็นอักษรตัวเล็กทั้งหมด)
  9.             If LCase(line) = "[" & LCase(Section) & "]" Then
  10.                 blnMatch = True
  11.                 '/ เมื่อได้ Section ตามที่ต้องการ (blnMatch = True)
  12.             ElseIf blnMatch Then
  13.                 '/ แยก (Split) Key กับ Value ออกจากกันด้วยเครื่องหมาย =
  14.                 Dim sArr As String() = line.Split("="c)
  15.                 '/ เพิ่มไอเทมด้วย sArr(0)
  16.                 CheckedListBox1.Items.Add(sArr(0))
  17.                 '/ หากค่าใน sArr(1) มีค่าเป็นจริง (CBool = Convert To Boolean)
  18.                 If CBool(sArr(1)) Then CheckedListBox1.SetItemChecked(iRow, CheckState.Checked)
  19.                 '/ เลื่อน Key ไอเทม
  20.                 iRow += 1
  21.             End If
  22.         Next
  23.     End Sub
คัดลอกไปที่คลิปบอร์ด
แอดมินเขียนเป็นโปรแกรมย่อย (Sub Program) เอาไว้ให้เพียงเท่านี้ เพราะง่ายต่อการศึกษาโค้ดก่อน แต่ฝากคำถามให้ไปคิดกันต่อในเรื่องของการแยกข้อมูลออกจากกันของ INI ซึ่งมันเป็นงานเหมือนเดิมที่ซ้ำๆกันตลอด แต่ให้สังเกตว่าการนำ Key และ Value ไปใช้ใน Control แต่ละตัวมันจะมี Method ที่ไม่เหมือนกัน ตรงนี้แหละที่เราจะลดรูปคำสั่งลงด้วยวิธีการอย่างไร???

ตัวอย่างของการบันทึกไฟล์ INI ซึ่งในลักษณะไดนามิคแบบนี้ จะทำให้เราลดชุดคำสั่งลงไปในกรณีที่มีไอเทมเป็นจำนวนมากๆได้
  1.     Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click
  2.         For i As Integer = 0 To Me.CheckedListBox1.Items.Count - 1
  3.             WriteIni(strFileINI, "test", CheckedListBox1.Items(i), CheckedListBox1.GetItemChecked(i))
  4.         Next
  5.         MsgBox("Save data initialize complete.")
  6.         Me.Close()
  7.     End Sub
คัดลอกไปที่คลิปบอร์ด


โค้ดแบบเต็มทั้งหมด
  1. Public Class frmCheckedListBox

  2.     Dim strFileINI As String = MyPath(Application.StartupPath) & "config.ini"

  3.     Private Sub frmCheckedListBox_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  4.         '// เช็คว่ามีไฟล์ Config.ini อยู่หรือไม่???
  5.         If My.Computer.FileSystem.FileExists(strFileINI) Then
  6.             Call ParserCheckedListBox(strFileINI, "test")
  7.         Else
  8.             '/ การสร้างไอเทมและค่าแบบสุ่ม
  9.             Call CreateSample()
  10.         End If
  11.     End Sub

  12.     ' / --------------------------------------------------------------------
  13.     ' / แยก Key และ Value เพื่อแสดงผลใน CheckedListBox
  14.     Private Sub ParserCheckedListBox(ByVal iniFile As String, ByVal Section As String)
  15.         Dim blnMatch As Boolean = False
  16.         Dim iRow As Integer = 0
  17.         '/ Reads each line from the text file one at a time.
  18.         For Each line As String In IO.File.ReadLines(iniFile)
  19.             '/ ต้องเช็คก่อนว่าเป็น Section ที่ต้องการหรือไม่? (ใส่ Lower Case หรือให้เป็นอักษรตัวเล็กทั้งหมด)
  20.             If LCase(line) = "[" & LCase(Section) & "]" Then
  21.                 blnMatch = True
  22.                 '/ เมื่อได้ Section ตามที่ต้องการ (blnMatch = True)
  23.             ElseIf blnMatch Then
  24.                 '/ แยก (Split) Key กับ Value ออกจากกันด้วยเครื่องหมาย =
  25.                 Dim sArr As String() = line.Split("="c)
  26.                 '/ เพิ่มไอเทมด้วย sArr(0)
  27.                 CheckedListBox1.Items.Add(sArr(0))
  28.                 '/ หากค่าใน sArr(1) มีค่าเป็นจริง (CBool = Convert To Boolean)
  29.                 If CBool(sArr(1)) Then CheckedListBox1.SetItemChecked(iRow, CheckState.Checked)
  30.                 '/ เลื่อน Key ไอเทม
  31.                 iRow += 1
  32.             End If
  33.         Next
  34.     End Sub

  35.     ' / --------------------------------------------------------------------
  36.     Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click
  37.         For i As Integer = 0 To Me.CheckedListBox1.Items.Count - 1
  38.             WriteIni(strFileINI, "test", CheckedListBox1.Items(i), CheckedListBox1.GetItemChecked(i))
  39.         Next
  40.         MsgBox("Save data initialize complete.")
  41.         Me.Close()
  42.     End Sub

  43.     ' / --------------------------------------------------------------------
  44.     ' / สร้าง CheckedListBox และสุ่มค่า Check/Uncheck ทำการทดสอบ
  45.     Private Sub CreateSample()
  46.         Me.CheckedListBox1.Items.Clear()
  47.         Dim RndClass As New Random
  48.         For i As Integer = 0 To 14
  49.             With Me.CheckedListBox1
  50.                 .Items.Add("Item " & i + 1)
  51.                 If RndClass.Next(0, 99) Mod 2 = 0 Then
  52.                     CheckedListBox1.SetItemChecked(i, CheckState.Checked)
  53.                 End If
  54.             End With
  55.         Next
  56.     End Sub

  57.     Private Sub frmCheckedListBox_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  58.         Me.Dispose()
  59.         Application.Exit()
  60.     End Sub

  61.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  62.         Me.Close()
  63.     End Sub
  64. End Class
คัดลอกไปที่คลิปบอร์ด

โค้ดในส่วนของ GetPrivateProfileString/WritePrivateProfileString หรือ Windows API ที่เรานำมาใช้กับ INI File
  1. Module modFunction

  2.     ' / --------------------------------------------------------------------
  3.     ' / Initialized Management
  4.     Private Declare Unicode Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringW" ( _
  5.         ByVal lpApplicationName As String, _
  6.         ByVal lpKeyName As String, _
  7.         ByVal lpString As String, _
  8.         ByVal lpFileName As String _
  9.         ) As Int32

  10.     Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringW" ( _
  11.         ByVal lpApplicationName As String, _
  12.         ByVal lpKeyName As String, _
  13.         ByVal lpDefault As String, _
  14.         ByVal lpReturnedString As String, _
  15.         ByVal nSize As Int32, _
  16.         ByVal lpFileName As String _
  17.         ) As Int32
  18.     ' / --------------------------------------------------------------------

  19.     ' / --------------------------------------------------------------------
  20.     Public Function WriteIni(ByVal iniFileName As String, ByVal Section As String, ByVal ParamName As String, ByVal ParamVal As String) As Integer
  21.         WriteIni = WritePrivateProfileString(Section, ParamName, ParamVal, iniFileName)
  22.     End Function

  23.     ' / --------------------------------------------------------------------
  24.     Public Function ReadIni(ByVal IniFileName As String, ByVal Section As String, ByVal ParamName As String, ByVal ParamDefault As String) As String
  25.         Dim ParamVal As String = Space$(1024)
  26.         Dim LenParamVal As Long = GetPrivateProfileString(Section, ParamName, ParamDefault, ParamVal, Len(ParamVal), IniFileName)
  27.         ReadIni = Left$(ParamVal, LenParamVal)
  28.     End Function

  29.     ' / --------------------------------------------------------------------
  30.     ' / Get my project path
  31.     ' / AppPath = C:\My Project\bin\debug
  32.     ' / Replace "\bin\debug" with ""
  33.     ' / Return : C:\My Project\
  34.     Function MyPath(ByVal AppPath As String) As String
  35.         '/ MessageBox.Show(AppPath);
  36.         AppPath = AppPath.ToLower()
  37.         '/ Return Value
  38.         MyPath = AppPath.Replace("\bin\debug", "").Replace("\bin\release", "").Replace("\bin\x86\debug", "")
  39.         '// If not found folder then put the \ (BackSlash) at the end.
  40.         If Microsoft.VisualBasic.Right(MyPath, 1) <> "" Then MyPath = MyPath & ""
  41.     End Function

  42. End Module
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่

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

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

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

51

โพสต์

233

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
233
โพสต์ 2017-12-21 13:09:14 | ดูโพสต์ทั้งหมด

ขอบพระคุณอย่างสูงครับ

0

กระทู้

58

โพสต์

10

เครดิต

Member

Rank: 2

เครดิต
10
โพสต์ 2022-10-25 17:06:37 | ดูโพสต์ทั้งหมด

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

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

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

GMT+7, 2024-4-20 20:07 , Processed in 0.110378 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

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