หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 1 0 9 5 9 8

7 ธันวาคม พ.ศ.2549
237 Users On-Line.
Visitors - Page views
 8 4 0 2 7 5 5
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

เรียนรู้ XML กับ Visual Basic 6.0 ภาค 4 (แจกโค้ดโปรแกรมดูทีวีออนไลน์ VB6+XML)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 19/7/2551 14:49:00
(อ่าน : 39767) 
ด้วยความที่ผมเองฝึกฝนการทำเว็บไซต์ด้วย Vi Editor ที่อยู่บนระบบปฏิบัติการ Unix มาก่อน ซึ่งมันไม่ใช่ Tool สำเร็จรูปแบบ Dream Weaver แน่นอนว่าเอกสาร HTML ที่ทำขึ้นมานั้นต้องใช้งาน Tag ล้วนๆ อันนี้ย่อมเป็น "พื้นฐาน" ที่ดีส่งผลมาถึงยุคปัจจุบัน ... พอผมมาทำการศึกษาเรื่องเอกสาร XML (eXtensive Markup Language) ซึ่งมันก็เป็น Text File แบบพิเศษ มี Tag ปิดหัวปิดหางเหมือนกับ HTML และแน่ยิ่งกว่าแช่แป้ง ผมก็จะใช้ระยะเวลาอันสั้นในการทำความเข้าใจกับมันได้อย่างไม่ยากเย็นนัก แต่คำถามที่เกิดขึ้นในใจของผมต่อมา คือ เราจะเอามันไปใช้งาน ใช้ประโยชน์อะไรได้บ้าง ... ณ จุดนี้นี่เองที่จะต้องสร้างจินตนาการ ที่มันล่องลอยอยู่กลางอากาศ แล้วจับมันมาปั้นเป็นหน้าตาโปรแกรมให้ได้ ดั่งเช่นเรื่องของ XML นี้ ที่ผมคิดๆไว้ก็มีอยู่ 3-4 เรื่อง ... เอาเป็นว่าสรุปลงที่โปรแกรมดูทีวีออนไลน์นี่ก็แล้วกันครับพี่น้อง ... ประเด็นต่อมา คือ แล้วจะใช้งาน และ ควบคุมมันยังไงล่ะ (เอ้อ ... นั่นน่ะซิ) ... แหละนี่ก็คือที่มาของการเรียนรู้ ศึกษาในแบบฉบับ How To And Do It ... ของผมเองครับ ... พี่น้อง
เริ่มต้นกับเอกสาร XML ธรรมดานี่แหละ
พี่น้องครับ ... ผมเองเคยเกริ่นนำไว้นานแล้วเกี่ยวกับกระบวนการเรียนรู้ของผม ผมจะอ่านทฤษฎีเอาแบบผ่านๆสายตาไป ซึ่งมันก็เข้าใจบ้าง ไม่เข้าใจบ้าง (ไปตามเรื่อง ... 55555+) ประมาณว่าเอาหลักการได้สักประมาณ 20% ก็พอ ... อ้าวววว !!! แล้วที่เหลือ 80% ก็จะเป็นการปฏิบัติหมดเลยเหรอ ... เปล่าเลยครับพี่น้อง พอลงมือปฏิบัติไปสักหน่อย มันก็ต้องย้อนกลับมาหาทฤษฎีเองนั่นแหละ โดยสรุปมันจะได้ออกมาอย่างละ 50/50 ไปเอง ... ดังเช่นตัวอย่าง (จริงๆ) นี้

ข้อผิดพลาดที่ StationName Tag (หรือ Element) ... ทะลึ่งไม่รับภาษาไทย


การแก้ปัญหา ... นี่แหละตอนที่เริ่มต้นเตาะแตะของผม ... 55555+

ด้วยแนวทางแบบคิดย้อนกลับของผม (Backward) ... จะเจอปัญหาจากการปฏิบัติ แล้วค่อยถอยกลับไปหาทฤษฎีเพื่อมาอธิบาย หรือ หาคำตอบนั่นเอง หรือ พี่น้องก็ลองคิดแบบเดินหน้า (Forward) ... เช่น หากไม่มีส่วนของการประกาศ (Declaration) แล้วมันจะเกิดอะไรขึ้นล่ะ ... อันนี้ก็ขึ้นอยู่กับศีล สมาธิของใครของมันแหละครับ ... อมิตตพุทธ ...
เรียนรู้ XML กับ Visual Basic 6.0 ภาค 1
เรียนรู้ XML กับ Visual Basic 6.0 ภาค 2
เรียนรู้ XML กับ Visual Basic 6.0 ภาค 3 (แปลงร่าง XML ให้กลายเป็น HTML)
แจกฟรี ... Source Code โปรแกรมดูทีวีออนไลน์ ด้วย VB.Net (2008)
ตรวจสอบรายชื่อสถานี/รายการแบบ Real Time
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
เริ่มต้นกระบวนการทำงาน

Project --> References ...


Project --> Components ...


Design Time

มาดูโค้ดกันเถอะ ... Babe Version (เวอร์ชั่นเด็กๆอนุบาลแมวเหมียว)
    โปรเจคนี้ ผมเลือก ListView Control มาใช้งาน ก็เนื่องจากว่า
  1. ผมไม่ได้ใช้งานมานานแล้ว เลยเอาออกมาปัดฝุ่นใหม่ ... 55555+
  2. ทำงานได้เร็วกว่าตารางกริด
  3. ไม่ต้องคำนวณหาจำนวนของแถวที่ใช้งานก่อน
  4. ใช้ Mouse Wheel กับ ListView ได้ ... กรณีของ DataGrid ต้องเพิ่ม Class Module เข้าไปอีก

' กรณีที่ใช้กับไฟล์ g2gnettv.xml .... ซึ่งมันจะไม่มี Attribute
Private Sub ReadXML()
On Error GoTo ErrHandler

Dim xmlDom As New MSXML2.DOMDocument60
Dim oNodeList As IXMLDOMNodeList
Dim oNode As IXMLDOMElement
Dim oChildNode As IXMLDOMElement
Dim oAttribute As IXMLDOMAttribute

' ประกาศตัวแปรสำหรับ ListItem ที่ต้องใช้งานใน ListView
Dim LV As ListItem

Set xmlDom = New MSXML2.DOMDocument60

Dim strURL As String

' อันนี้ต้องใช้สำหรับการเชื่อมต่อไปยัง Web Server
xmlDom.async = False

' =================== ใช้คู่กับ Path ที่เราระบุ =================
strURL = App.Path
If Right$(strURL, 1) <> "\" Then strURL = strURL & "\"
strURL = strURL & "g2gnettv.xml"
' strURL = "http://www.g2gnet.com/g2gnettv/g2gnettv.asp"
' ====================================================

' กำหนดเอกสารปลายทางที่จะอ่าน
xmlDom.Load (strURL)
    
    If Not xmlDom.documentElement Is Nothing Then
        Set oNodeList = xmlDom.documentElement.selectNodes("channel/Station")
        
        fraStation.Caption = "จำนวนรายชื่อสถานี/รายการ - " & oNodeList.length & " รายการ."
        
        With lvwStation
            .ListItems.Clear
            .View = lvwReport
            .ColumnHeaders.Add 1, , "ID", 0
            .ColumnHeaders.Add 2, , "ชื่อสถานี/รายการ", .Width - 330
            .ColumnHeaders.Add 3, , "Media", 0
        End With
' แบบนี้ง่ายๆ หมูน้อยเลย ... อ่านค่าไล่ไปทีละ Station Element For Each oNode In oNodeList Set oChildNode = oNode.selectSingleNode("ID") If Not oChildNode Is Nothing Then Set LV = lvwStation.ListItems.Add(, , oChildNode.Text) Set oChildNode = oNode.selectSingleNode("StationName") If Not oChildNode Is Nothing Then LV.SubItems(1) = oChildNode.Text Set oChildNode = oNode.selectSingleNode("Media") If Not oChildNode Is Nothing Then LV.SubItems(2) = oChildNode.Text Next Else MsgBox "ขออภัย ... ไม่สามารถนำเข้าข้อมูลสถานีจากเอกสาร XML ได้.", vbOKOnly + vbInformation, "รายงานสถานะ" Exit Sub End If Set LV = Nothing ExitProc: Exit Sub ErrHandler: MsgBox Err.Number & vbCrLf & Err.Description, vbOKOnly + vbInformation, "รายงานความผิดพลาด" Resume ExitProc End Sub
พัฒนาต่อด้วยการใช้งาน Attribute ในแต่ละ Element
เนื่องจากผมต้องการออกแบบโปรแกรมของผม ให้สามารถอ่านเอกสาร XML ทั้งแบบเดิม และ แบบใหม่ได้พร้อมๆกัน เพื่ออะไรเหรอครับ ... ก็เพื่อที่วันหน้าผมอาจเปลี่ยนแปลงรูปแบบของเอกสาร XML ไปอีก แต่ก็ต้องคงไว้ให้ผู้ใช้งานใน XML เดิม ยัีงคงสามารถใช้งานได้ตามปกติไงล่ะครับ ... เหตุผลอีกอย่าง คือ มันท้าทายแนวคิดออกไปอีกน่ะซิครับ ... พี่น้อง ... เอิ๊กๆๆๆๆ

Option Explicit

Private Sub ReadXML2ListView()
On Error GoTo ErrHandler
' งานนี้ต้องการ DOM (Document Object Model) Component
' ซึ่ง Component ตัวนี้ จะประกอบไปด้วย
' Nodes - IXMLDOMNode
' NodeLists - IXMLDOMNodeList
' Elements - IXMLDOMElement
' Attributes - IXMLDOMattribute

Dim xmlDom As New MSXML2.DOMDocument60
Dim oNodeList As IXMLDOMNodeList
Dim oNode As IXMLDOMElement
Dim oChildNode As IXMLDOMElement
Dim oAttribute As IXMLDOMAttribute

' ประกาศตัวแปรสำหรับ ListItem ที่ต้องใช้งานใน ListView
Dim LV As ListItem

Set xmlDom = New MSXML2.DOMDocument60

Dim strURL As String

' อันนี้ต้องใช้สำหรับการเชื่อมต่อไปยัง Web Server
xmlDom.async = False

'xmlDom.validateOnParse = False
'xmlDom.resolveExternals = False

' เมื่อเริ่มต้นการทำงานผ่าน Remote Server
'xmlDom.setProperty "ServerHTTPRequest", True

' =================== ใช้คู่กับ Path ที่เราระบุ =================
strURL = App.Path
If Right$(strURL, 1) <> "\" Then strURL = strURL & "\"
strURL = strURL & "g2gnettvnew.xml"
'strURL = strURL & "g2gnettv.xml"
' ====================================================

' กรณีที่ระบุผ่านทาง Web Server  โดยตรง ... อาจจะสงสัยว่าทำไมมันไม่เป็นนามสกุล XML ก็เพราะ ...
' ผมให้ ASP Script อ่านจาก DataBase อีกทีนึง
' ซึ่งหากผม Update รายการใหม่ๆเข้ามา พี่น้องก็จะได้ข้อมูลใหม่ๆเหมือนกันครับ
' นี่แหละ ... เห็นข้อดีของ XML หรือยังครับ
'strURL = "http://www.g2gnet.com/g2gnettv/g2gnettv.asp"
'strURL = "http://www.g2gnet.com/g2gnettv/g2gnettvnew.asp"

' กำหนดเอกสารปลายทางที่จะอ่าน
xmlDom.Load (strURL)
    
    ' ทดสอบก่อนว่าเอกสารที่รับมามีรูปแบบ XML หรือไม่ (ลักษณะของต้นไม้กลับหัวนั่นแหละครับ)
    If Not xmlDom.documentElement Is Nothing Then
        Set oNodeList = xmlDom.documentElement.selectNodes("channel/Station")
        
        ' สำหรับท่านที่อยากเปลี่ยนแปลงไปใช้งานพวก Data Grid จะต้องหาค่าจำนวนข้อมูลทั้งหมดให้ได้เสียก่อน
        ' เพื่อที่จะระบุจำนวนแถวให้กับเหล่า Data Grid ได้ ... โดยใช้ oNodeList.length
        fraStation.Caption = "จำนวนรายชื่อสถานี/รายการ - " & oNodeList.length & " รายการ."
        
With lvwStation .ListItems.Clear .View = lvwReport ' Index = 0 .ColumnHeaders.Add 1, , "ID", 0 ' Index = 1 .ColumnHeaders.Add 2, , "ชื่อสถานี/รายการ", .Width - 330 ' ส่วนนี้เอาไปซ่อนไว้ ไม่ให้ผู้ใช้งานเห็น ... เหอๆๆๆๆ ... แอบครับแอบ ' Index = 2 .ColumnHeaders.Add 3, , "Media", 0 End With
' เริ่มต้นไล่ตาม Root Element For Each oNode In oNodeList ' ตอนนี้กำลังอ่านค่า StationName Element ... ก็เพื่อจะหาว่ามันมี ID Atrribute อยู่หรือเปล่าไงครับ Set oChildNode = oNode.selectSingleNode("StationName") ' พบข้อมูลใน StationName Element นี้หรือไม่ If Not oChildNode Is Nothing Then ' ตรวจสอบก่อนว่าใน StationName Element มันมี ID Attribute อยู่หรือไม่ ' <StationName ID="1"> If Not IsNull(oChildNode.getAttribute("ID")) Then ' เพิ่ม Item หลักให้กับ ListView ก่อน Set LV = lvwStation.ListItems.Add(, , oChildNode.getAttribute("ID")) ' ใส่ค่า StationName Element เข้าไปในหลักที่ 2 (หรือ Index = 1) LV.SubItems(1) = oChildNode.Text ' ไม่มี ID Attribute อยู่ ... ดังนั้นก็ต้องอ่าน ID Element มาโดยตรงครับ Else ' กำหนด ID Element Set oChildNode = oNode.selectSingleNode("ID") ' เพิ่ม Item หลักให้กับ ListView Set LV = lvwStation.ListItems.Add(, , oChildNode.Text) ' ใส่ค่า StationName Element เข้าไปในหลักที่ 2 (หรือ Index = 1) Set oChildNode = oNode.selectSingleNode("StationName") LV.SubItems(1) = oChildNode.Text End If End If ' อ่านค่า URL สำหรับ Element ที่ชื่อ Media Set oChildNode = oNode.selectSingleNode("Media") If Not oChildNode Is Nothing Then ' ใส่ค่า Media Element เข้าไปในหลักที่ 3 (หรือ Index = 2) LV.SubItems(2) = oChildNode.Text End If ' การใช้ IF ในกรณีที่มีชุดคำสั่งเพียง 1 ชุด (Statement) ... ไม่ต้องปิดด้วย End If ก็ได้น่ะครับ ... ดังนี้ ' If Not oChildNode Is Nothing Then LV.SubItems(2) = oChildNode.Text Next Else MsgBox "ขออภัย ... ไม่สามารถนำเข้าข้อมูลสถานีจากเอกสาร XML ได้.", vbOKOnly + vbInformation, "รายงานสถานะ" Exit Sub End If Set LV = Nothing ExitProc: Exit Sub ErrHandler: MsgBox Err.Number & vbCrLf & Err.Description, vbOKOnly + vbInformation, "รายงานความผิดพลาด" Resume ExitProc End Sub Private Sub Form_Load() Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2 Me.Height = Me.ScaleHeight Me.Width = Me.ScaleWidth Me.Caption = "Source Code โปรแกรมดูทีวีออนไลน์ (XML-TV On Line)" ' ปิดการใช้งานเมนู ... ไม่ให้ผู้ใช้งานกดเมาส์ขวา ... 55555+ WMP.enableContextMenu = False WMP.stretchToFit = True Call ReadXML2ListView ' ใช้กับไฟล์ g2gnettv.xml ซึ่งจะไม่มี Attribute ' Call ReadXML End Sub ' เหตุการณ์กด Double Click เมาส์ ในแถวที่เลือกจาก ListView Private Sub lvwStation_DblClick() If Val(lvwStation.selectedItem.Text) <= 0 Or IsNull(lvwStation.selectedItem.Text) Then Exit Sub ' ให้อ่านค่าจาก Column ที่ 3 ... แต่ค่า Index = 2 น่ะครับ ... พี่น้อง ' จากนั้นก็กำหนดเป็น URL ให้กับ Windows Media PLayer WMP.url = lvwStation.selectedItem.SubItems(2) Me.Caption = "Source Code โปรแกรมดูทีวีออนไลน์ (XML-TV On Line) - [" & lvwStation.selectedItem.SubItems(1) & "]" End Sub ' เหตุการณ์เมื่อกด Enter ใน ListView ... ก็เรียกไปยังโปรแกรมย่อย lvwStation_DblClick เลย ' ไม่จำเป็นต้องมาเขียนโค้ดที่ซ้ำๆเหมือนกันอีก ... Private Sub lvwStation_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyReturn Then KeyAscii = 0 Call lvwStation_DblClick End If End Sub
Conclusion:
นี่ก็แค่ตัวอย่างเล็กๆน้อยๆที่นำมาเล่าสู่ให้พี่น้องได้รับรู้กันไปบ้าง ... แหละนี่คืองานส่วนหนึ่งของผมที่มันก่อเกิดมาจากจินตนาการกลางอากาศล้วนๆ ไม่ใช่การเรียนรู้เพื่อไปสอบ หรือ เำพื่อเอาไปสอน แต่เพื่อต้องการจะใช้งานมัน และ สามารถควบคุมมันได้ด้วย ... ความรู้จะปราศจากความหมาย หากไม่สามารถนำมาใช้ได้จริง
จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560