หน้าแรก
 การบ้าน
  C/C++ new
  Java new
  Windows Phone
  แจ้งเรื่องที่ต้องการ
 บทความ
  .NET
  Android
  Blackberry
  C++Builder
  Delphi
  Java
  Mobile
  Open Source
  Pocket PC
  Visual Basic
  Web
  Windows Phone
  Others
 แบบเรียนฟรี
  ASP
  ASP.NET Webmatrix
  C++
  eVB
  J2ME
  Java
  PHP
 ซอร์สโค้ด
  Android
  ASP
  C++
  VC++
  CGI-Perl
  Delphi
  Java
  jQuery
  PHP
  Visual Basic
  .NET
 บริการจากเรา
  เปิดท้าย... ขายโค้ด
  Freeware
  อัตราค่าโฆษณา
  รายชื่อลูกค้า
  สถิติผู้เข้าเว็บ
 ดาว์นโหลด
 ค้นหาข้อมูล
 กระดานสนทนา
  .NET
  C/C++
  Delphi
  Java
  Palm/PocketPC
  Visual Basic
  Web
  อื่นๆ
 กระดานงาน
 ลิงค์เว็บ
 เกี่ยวกับผม
 อัตราค่าโฆษณา
Social Network

Facebook  Twitter  YouTube
 New Article
 Webboard
 Freelanceboard
Freeware
โปรแกรมเบอร์ดี (BerDee)
โปรแกรมเบอร์ดี (Android)
เกมส์เป่ายิ้งฉุบ
เกมส์เป่ายิ้งฉุบ(Android)
WebcamMonitor
WebcamMonitor(Windows)
scSendMail
scSendMail(Windows)
MSN Caption
MSN Caption(Windows)
  Freelance comment
  ติดต่อสอบถามมาได้ตลอดนะ...
2015-07-29 13:35:58
  ถ้าผมต้องการเว็บที่พัฒน...
2015-01-18 15:33:54
  ถ้าผมต้องการเว็บที่พัฒน...
2015-01-18 15:32:51
  ติดต่อสอบถามเข้ามาได้นะ...
2014-01-06 12:47:38
  ถ้ายังหาคนสอนไม่ได้ ก็ลอ...
2013-07-06 01:04:37
  สนใจส่งขอบเขตมาคุยราคาก...
2013-03-24 18:54:20
  ถ้ายังไม่มีคนรับงานติดต...
2012-12-16 19:18:14
  สนใจคะ ติดต่อ 0905076277...
2012-11-12 11:07:46
  รับทำโปรเจ็คนักศึกษาหรื...
2012-10-29 03:10:46
  sukit_te34@hotmail.com...
2012-10-29 03:09:36
  Webboard comment
  มาส่อง...
2024-08-19 15:45:12
  ช่วยเขียนโปรเจค: การควบค...
2024-08-07 09:13:31
  เขียนโปรแกรมภาษาจาวา
1.โ...

2023-09-12 11:40:28
  ต้องลอง debug ดูเองครับ
ไล่...

2023-06-08 18:03:06
  ร้านค้าแห่งหนึ่ง จะต้องน...
2021-09-21 08:47:08
  จงเขียนโปรแกรมดำเนินการ...
2021-05-07 15:06:11
  จงเขียนโปรแกรมสำหรับคำน...
2021-03-09 14:21:45
  ขอดู...
2021-01-04 23:56:45
  ขอโค้ดเพื่อทำการเรียนกา...
2020-12-09 23:02:09
  แล้ว ?...
2020-12-09 10:56:34
  Homework comment
  เขียนโปรแกรมเพื่อรับค่า...
2022-02-24 10:45:17
  จากโค้ดนี้อะครับ พอดีลอง...
2021-03-22 01:22:39
  จากโค้ดนี้อะครับ พอดีลอง...
2021-03-22 01:22:39
  โจทย์การบ้าน c++ เขียนรูปแ...
2020-04-06 11:01:33
  แบบนี้ขอเป็น ภาษา php หน่อย...
2019-09-18 14:36:34
  ผมไม่อยากให้คุณได้คะแนน...
2019-04-27 01:29:07
  อาจารย์เขาบอกแนวข้อสอบม...
2019-04-27 00:44:29
  ขอสอบถามการเขียน c++ ครับ เ...
2018-04-02 12:19:21
  โค้ดตัวอย่างศึกษาให้เข้...
2017-11-26 14:50:05
  คำนวณค่าน้ำโดยรับค่ามิเ...
2017-11-20 23:15:26
  Article comment
  เท่าที่อ่าน error คือพื้นที่...
2022-03-23 13:56:48
  เรียน สอบถามปัญหา กับ อ.คร...
2022-01-24 17:39:49
  ต้องการ ให้เขียน โปรแกรม ...
2019-12-09 11:39:58
  รับเขียน arx จาก vc++ 2017 ล็อคโปร...
2019-09-19 09:48:09
  ทำการ register ไฟล์ที่ชื่อ mswinsck.oc...
2019-09-17 14:05:56
  ใน vb 6 ไม่มี component winsock เลยค่ะ ส...
2019-09-03 10:31:02
  รบกวนขอสอบถามหน่อยนะครั...
2019-03-04 05:31:04
  สามารถนำตัวหนังสือจากภา...
2018-12-25 08:54:32
  มีcode ของ VB ไหมค่ะ ถ้ามีรบกว...
2017-09-28 16:50:02
  น่าจะได้ครับ ไม่เคยลอง
...

2017-07-11 09:59:35
  9Mcode comment

Link Exchange

อัตราค่าโฆษณา
 
แสดงสถานะการดาวน์โหลดเว็บเพจ (อ่าน 24,977)
ศุภกิจ ทองดี (9'M) บทความโดย: นาย ศุภกิจ ทองดี (9'M)
e-mail: webmaster@sourcecode.in.th
mobile: 09-5009-5351
Line: suppakit.thongdee
Youtube: 9Mcode
Fanpage: Sourcecode.in.th
   
: ดาว์นโหลดตัวอย่างโปรแกรม (ดาว์นโหลด 4,312 ครั้ง)

- - - - - - - - - - - - - - ผู้ให้การสนับสนุน- - - - - - - - - - - - - -

 
 
Freelanceรับพัฒนาโปรแกรม และเว็บ โดย 9'M 

ในบทความนี้เราจะใช้ คอมโพแนนต์ ที่ชื่อว่า Internet Transfer Control (ITC) ซึ่งเป็น คอนโทรล ที่ง่ายใช้ในการเขียนโปรแกรม รับส่งข้อมูลทางอินเทอร์เน็ต แต่เสียอยู่ที่ว่า ไม่มีส่วนของ การแสดงสถานะการดาวน์โหลดที่กำลังส่งผ่านอยู่ในขณะนั้น มันคงจะดี ถ้าคอนโทรลนี้มี พรอพเพอร์ตี้ DownloadProgress หรือว่า อีเวนต์ DataArrival ที่มี parameter ที่สามารถนำมาใช้ได้เลย.

เราจะใช้ 2 เมธอดของ ITC ในการดาวน์โหลดเว็บเพจ คือ OpenURL กับ Execute. เมธอด OpenURL จะเป็นเมธอดที่ใช้งานง่ายเมธอดนึง แต่มันจะมีข้อจำกัด และเราไม่สามารถจะรับข้อมูลที่เกี่ยวกับสถานะการดาวน์โหลด โดยใช้เมธอดนี้ได้เลย ในการรับข้อมูลจากเว็บเพจโดยใช้เมธอด OpenURL เราจะมีรูปแบบของโค้ดดังนี้:

strPageContent = Inet1.OpenURL(strURL, icString)

คุณจะเห็นว่ามันง่ายที่จะรับข้อมูลเว็บเพจมา ด้วยการใช้เมธอด OpenURL แต่ ITC ก็ไม่ได้ส่งข้อมูลอะไรที่เกี่ยวกับจำนวนของข้อมูลที่ส่งมา และเราก็ไม่สามารถที่จะควบคุมข้อมูลที่เข้ามาได้ ถ้าเป็นอย่างนั้น เราคงจำเป็นที่จะต้องเข้าถึงข้อมูลที่อยู่ใน Winsock buffer ซึ่งเป็นส่วนที่เก็บข้อมูลที่ถูกส่งมา ถ้าเราเข้าถึงข้อมูลนั้นได้ เราก็สามารถที่จะคำนวณขนาดของข้อมูลที่กำลังส่งมาได้

'เมธอด Execute จะส่งการร้องขอ HTTP ไปยังเว็บเซิร์ฟเวอร์
Inet1.Execute strURL, "GET"

ในการรับข้อมูลที่จะเข้ามาเราจำเป็นที่จะใช้เมธอด GetChunk ในการรับข้อมูลจากบัฟเฟอร์เข้าไปยังตัวแปร

strBuffer = Inet1.GetChunk(512)
strArrivedData = strArrivedData & strBuffer

ประเด็นตอนนี้อยู่ที่ว่าเมธอด GetChunk จะรับอาร์กิวเมนต์ที่เป็นตัวกำหนดขนาดของข้อมูลซึ่งจะได้จากบัฟเฟอร์ ซึ่งทำให้เราสามารถกำหนดขนาดของข้อมูลได้ ดังนั้นเราจึงสามารถควบคุมปริมาณข้อมูลที่เข้ามาได้ ยิ่งไปกว่านั้น เราสามารถที่จะทำได้ในระหว่างที่ทำการดาว์นโหลด โดยคัดลอกโค้ดต่อไปนี้ เอาไปใส่ใน ส่วนของอีเวนต์ StateChanged 

Private Sub Inet1_StateChanged(ByVal State As Integer)
    '
    Select Case State
        '
        Case icResponseCompleted
            '
            Do
                DoEvents
                '
                strBuffer = Inet1.GetChunk(512)
                strArrivedData = strArrivedData & strBuffer
                lngArrivedDataSize = Len(strArrivedData)
                '
            Loop Until Len(strBuffer) = 0
        '
    End Select
    '
End Sub

เอาละครับ , ตอนนี้เราสามารถที่จะแสดงจำนวนของข้อมูลที่เข้ามา แต่จะทำยังไงที่จะคิดให้ออกมาเป็นเปอร์เซ็นต์ เพื่อที่จะใช้กับคอนโทรลที่ชื่อ ProgressBar เราจำเป็นที่จะต้องรู้ขนาดของไฟล์ที่เราจะรับก่อนที่ข้อมูลจะเข้ามา ความจริงแล้วจากข้อกำหนดของ HTTP ที่กำหนดให้เว็บเซิร์ฟเวอร์ส่ง Content-Length header ไปพร้อมกับ HTTP response โดยฟิลด์ดังกล่าวจะบ่งบอกถึงขนาด ในการที่เราจะรับฟิลด์ดังกล่าวด้วย ITC เราจะต้องเรียกใช้เมธอด GetHeader ภายในโพรซีเจอร์ StateChanged

Private m_lngDocSize As Long

Private Sub Inet1_StateChanged(ByVal State As Integer)
    '
    Select Case State
        '
        Case icResponseReceived
            '
             If m_lDocSize = 0 Then
                 If Len(Inet1.GetHeader("Content-Length")) > 0 Then
                      m_lDocSize = CLng(Inet1.GetHeader("Content-Length"))
                 End If
             End If

            '
    End Select
    '
End Sub

โชคร้าย ที่มีบางลักษณะที่ เว็บเซิร์ฟเวอร์จะไม่ส่งฟิลด์ Content-Length header ,และเราจะไม่สามารถหาขนาดและแสดงสถานะการทำงานได้

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

สร้างโปรเจ็กต์

เริ่มต้นจากการเปิดโปรแกรม Visual Basic แล้วสร้างโปรเจ็กต์ Standard EXE กำหนดชื่อโปรเจ็กต์เป็น DownloadProgress กดปุ่ม Ctrl+T เพื่อเรียกไดอะล็อกComponents แล้วทำการเลือกเช็กบอกซ์ต่อไปนี้:

  • Microsoft Internet Transfer Control
  • Microsoft Rich Textbox Control
  • Microsoft Windows Common Controls

ทำการบันทึกโปรเจ็กต์

การสร้าง GUI

วางคอนโทรลต่อไปนี้ลงบนฟอร์มของโปรเจ็กต์:

  • TextBox
  • CommandButton
  • Two Frame controls
  • Label
  • ProgressBar
  • RichTextBox
  • Internet Transfer Control

จัดตำแหน่งของคอนโทรล ตามรูปด้านล่างนี้:

โค้ดของโปรแกรม

เปิดหน้าต่างเพื่อแก้ไขโค้ด แล้วทำการประกาศตัวแปรลงในส่วนของGeneral-Declarations :

Private m_lngDocSize As Long

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

ขั้นตอนต่อไปคือ การใส่โค้ดที่จะทำงานเมื่อมีการคลิกปุ่ม โดยจะใส่โค้ดนี้ลงในส่วนของโพซีเจอร์ Command1_Click:

Private Sub Command1_Click()
    '
    'reset file size value
    m_lngDocSize = 0
    'clear rtbDocument
    rtbDocument.Text = ""
    '
    'reset the ProgressBar control
    ProgressBar1.Value = 0.001
    '
    'clear the label control
    lblProgressInfo.Caption = ""
    '
    'define protocol for the ITC
    Inet1.Protocol = icHTTP
    '
    'call the Execute method to send
    'HTTP request to the webserver
    If Len(txtURL.Text) > 0 Then
        Inet1.Execute Trim$(txtURL.Text), "GET"
    End If
    '
End Sub

โค้ดข้างต้น จะเป็นในส่วนของการกำหนดค่าเริ่มต้นสำหรับคอนโทรล และส่งคำร้องขอ (request) ไปยังเว็บเซิร์ฟเวอร์ ที่ผู้ใช้โปรแกรมต้องการ เมื่อเซิร์ฟเวอร์ตอบสนอง (respond) เราก็จะเขียนโค้ดลงในส่วนของอีเวนต์ StateChanged ของ Internet Transfer Control เพื่อที่จะรับค่าข้อมูล Content-Length header และข้อมูลที่จะเข้ามา

Private Sub Inet1_StateChanged(ByVal State As Integer)
'
Dim strText As String
Dim strBuffer As String
Dim sngProgerssValue As Single
'
On Error Resume Next
'
 Select Case State
 '
 Case icResponseCompleted
  'retrieve data from the buffer       
  Do	   
   DoEvents
   '
   strBuffer = Inet1.GetChunk(512)        
   strText = strText & strBuffer        
   '		
   If m_lngDocSize > 0 Then
      If Len(strBuffer) > 0 Then
       'get percent value
       sngProgerssValue = Int((Len(strText) / m_lngDocSize) * 100)
      End If
      'update the label control with new caption
      lblProgressInfo.Caption = "Downloaded " & CStr(Len(strText)) & _
                                                                                " bytes (" & CStr(sngProgerssValue) & "%)"
      'update the PregressBar control with new value
      ProgressBar1.Value = sngProgerssValue
   End If
   '
  Loop Until Len(strBuffer) = 0
  '
  'put retrieved HTML source into the RichTextBox control
  rtbDocument.Text = strText
  '
 Case icResponseReceived
 '
 If m_lngDocSize = 0 Then
  '
  'retrieve size of the document
  If Len(Inet1.GetHeader("Content-Length")) > 0 Then
                                                 m_lngDocSize = CLng(Inet1.GetHeader("Content-Length"))
  End If
  '
 End If
  '
 End Select
 '
End Sub

กดปุ่ม F5 เพื่อทดสอบโปรแกรม ป้อน URL ที่ต้องการลงใน textbox แล้วทำการคลิกปุ่ม แล้วดูความเปลี่ยนแปลงที่เกิดขึ้น ถ้าเซิร์ฟเวอร์มีการส่งฟิลด์ Content-Length header เราก็จะเห็นสถานะการดาวน์โหลดเว็บเพจ แต่ถ้าไม่มีฟิลด์นี้ ก็จะไม่สามารถแสดงสถานะได้.

: ดาว์นโหลดตัวอย่างโปรแกรม (ดาว์นโหลด 4,312 ครั้ง)
 

- - - - - - - - - - - - - - ผู้ให้การสนับสนุน- - - - - - - - - - - - - -

สอบถาม
  • ห้ามการโฆษณา หากต้องการติดต่อหาลูกค้า ติดต่อโฆษณาโดยตรงได้ที่ webmaster@sourcecode.in.th
  • ห้ามใช้คำหยาบและคำพูดที่ไม่เหมาะสม
  • ขอสงวนสิทธิหากตรวจพบ ข้อความที่ไม่เหมาะสม ข้อความนั้นจะถูกลบทันที
ชื่อ
อีเมล์
รายละเอียด

 
 
คลิปสอนเขียนโปรแกรม
เรียนเขียนโปรแกรมดอทเน็ต
เรียนเขียนโปรแกรมแอนดรอยด์
เรียนเขียนโปรแกรมเบล็คเบอร์รี่
เรียนเขียนโปรแกรมซี ซีพลัสพลัส
เรียนเขียนโปรแกรมจาวา
เรียนการใช้งานลินุกส์
เรียนการเขียนโปรแกรมวินโดว์โฟน
เรียนการเขียนโปรแกรมพีเฮชพี มายเอสคิวเอล
อัตราค่าโฆษณา
 
บทความที่เกี่ยวข้อง

บันทึกภาพจาก WebCam

เขียนโปรแกรม visual basic 6 แสดงภาพจาก กล้อง WebCam ของคุณ

การ Ping หมายเลข IP

View Source ของเว็บด้วย Inet (Microsoft Internet Tranfer Control)

การเข้าถึงเอกสาร HTML ผ่านทาง WebBrowser Control

ส่ง Broadcast ข้อมูล ด้วย VB

Client/Server โดยใช้ UDP ผ่านทาง MS Winsock

โปรแกรม Daytime (ตัวอย่างการใช้ Winsock Control)

การใช้งาน Winsock Control
Tutorial
eVB Tutorial
ASP.NET Webmatrix Tutorial
J2ME Tutorial
C++  Tutorial
Java  Tutorial
PHP Tutorial
ASP Tutorial
 
แบบสำรวจ

Home - Article - Tutorial - Sourcecode - Dev Handbook - Search - WebBoard - Links - About Us

สงวนลิขสิทธิ์ ห้ามคัดลอก ทำซ้ำ แก้ไข ดัดแปลง ไม่ว่าในรูปแบบใด โดยไม่ได้รับอนุญาตเป็นลายลักษณ์อักษร
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์จากกระทรวงพาณิชย์: 7100503002000
Copyright 2001 SourceCode.in.th