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

หรือติดต่อเข้ามาทาง 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 2 6 1 1 4 0

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

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

ฟังค์ชั่นที่ใช้ในการคำนวณหาค่าความแตกต่างระหว่างวันเดือนปี 2 ค่า

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 31/7/2550 23:59:00
(อ่าน : 20499) 

ในหลายฉากหลายตอนผมเองได้กล่าวถึงเรื่องของโปรแกรมย่อย (Sub Program) และบางบทความก็เป็นเจตนารมณ์ของผมเองที่ต้องการให้พี่น้อง ได้ทำการแปลงส่วนของการทำงานซ้ำๆให้กลายมาเป็นโปรแกรมย่อยแทน เพื่อจัดระเบียบ ลดความซ้ำซ้อนของโค้ด การตรวจสอบการทำงานของโปรแกรมทำได้ง่าย สามารถทำการตัดต่อเพื่อนำไปใช้ประโยชน์อย่างอื่นได้อย่างคล่องตัว จะเห็นได้ชัดเจนจากการเปิด หรือ ปิดการเชื่อมต่อข้อมูล ที่เก็บไว้ใน Module เมื่อนำไปใช้งานกับโปรเจคอื่นๆ ก็แค่ดึงไฟล์ Module (.BAS) ไปซ่ะงั้นเลย และดัดแปลงเล็กน้อย ไม่ต้องมามัวงมโข่งเขียนขึ้นใหม่ให้เสียเวลา

 

    แทบจะทุกๆภาษาคอมพิวเตอร์ โปรแกรมย่อยจะแบ่งออกเป็น 2 แบบคือ
  1. โปรแกรมย่อย ชื่อเรียกมันเยอะขึ้นกับภาษาที่ใช้ เช่น Sub Program, Sub Routine หรือ Procedure
  2. ฟังค์ชั่น (Function)
    ทั้งสองแบบ บางที (บ่อยครั้ง) เราจะเรียกมันว่าเป็น "คำสั่ง" โดยกำเนิดเกิดจาก
  1. ติดมากับตัวแปลภาษา (Build In) เช่น Left$("ABC", 1), Mid$("ABC", 2, 1) หรือ MsgBox() ที่เราคุ้นเคยนี่แหละ ใน Visual Basic การเกิดเหตุการณ์ (Events) นั่นก็ถือว่าเป็นโปรแกรมย่อยได้ทั้ง 2 แบบเหมือนกัน ส่วน WinAPI มักจะเป็นเรื่องของฟังค์ชั่นครับผม
  2. สร้างขึ้นมาใหม่ เช่น ตัวอย่างของเรื่องนี้แหละครับ
    ความเหมือนของทั้งสองแบบ คือ สามารถส่งค่า (Argument) ผ่านไปยังโปรแกรมย่อยได้ การส่งค่าก็มีอีก 2 แบบ คือ
  1. Pass By Value คือ การส่งค่าผ่านตัวแปรไปตรงๆ เช่น
    
    Private Sub Form_Load()
    Dim NumberOfTimes As Integer
        
        NumberOfTimes = 3
    	
        ' พิจารณาเฉพาะตัวแปร NumberOfTimes พอครับ ... พี่น้อง
        ' ส่งค่า NumberOfTimes ซึ่งมีค่าเท่ากับ 3 ไปเลย
        Call ShowMessage("Hello, World", NumberOfTimes)
    
        ' ให้แสดงผลค่าของ NumberOfTimes
        MsgBox NumberOfTimes
        ' คำตอบคือ 3 เนื่องจากเป็นการส่งค่าไปโดยตรง ไม่ได้ถูกชี้ไปโดยตำแหน่งที่เก็บข้อมูล (Memory Address)
        ' ว่าง่ายๆ ตำแหน่งที่เก็บข้อมูลของ NumberOfTimes กับ Times มันอยู่คนละที่กัน ... ไม่เกี่ยวข้องกัน
    End Sub
    
    ' ดังนั้นตัวแปรเพื่อรับค่า (Parameter) Times จึงมีค่าเท่ากับ 3 ด้วย
    Sub ShowMessage(ByRef Text As String, ByVal Times As Integer)
    Dim i As Integer
        For i = 1 To Times
            Debug.Print Text
        Next
        ' เปลี่ยนค่าตัวแปร Times ให้เท่ากับ 23
        Times = 23
    End Sub
    
  2. Pass By Reference คือ การส่งค่าผ่านตำแหน่งหน่วยความจำ ... อธิบายเป็นตัวอักษรยากครับ ขอให้พิจารณาจากตัวอย่างแล้วกัน
    
    Private Sub Form_Load()
    Dim NumberOfTimes As Integer
        
        NumberOfTimes = 3
    	
        ' อันนี้เป็นการส่งค่าตำแหน่งที่เก็บข้อมูลของตัวแปร NumberOfTimes ไป
        Call ShowMessage("Hello, World", NumberOfTimes)
    
        ' เมื่อกลับมาจากการทำงานโปรแกรมย่อย
        MsgBox NumberOfTimes
        ' คำตอบคือ 23 เนื่องจากถูกชี้ไปโดยตำแหน่งที่เก็บข้อมูล (Memory Address)
        ' ตำแหน่งที่เก็บข้อมูลของ NumberOfTimes กับ Times มันอยู่ที่เดียวกันครับ ... พี่น้อง
        ' แต่ชื่อที่เราอ้างอิงถึงมันคนละชื่อกัน ก็เท่านั้น ... นี่แหละคือข้อดีของภาษาระดับสูง
        ' ใครที่ศึกษาภาษาระดับกึ่งต่ำกึ่งสูง เช่น Assembly มา (แบบผม) ... ย่อมได้เปรียบ เพราะจะทำความเข้าใจในเรื่องนี้ได้ง่ายกว่า
    End Sub
    
    ' รับค่า Argument เข้ามาแบบอ้างอิงตำแหน่ง
    Sub ShowMessage(ByRef Text As String, ByRef Times As Integer)
    Dim i As Integer
        For i = 1 To Times
            Debug.Print Text
        Next
    
        Times = 23
        ' เปลี่ยนค่าตัวแปร Times ให้เท่ากับ 23
        ' เมื่อเป็นการอ้างอิงตำแหน่งของการเก็บข้อมูล
        ' ดังนั้นเมื่อส่งค่าผ่าน ByRef ตำแหน่งของ Times กับ NumberOfTimes มันคือที่ๆเดียวกัน
        ' แต่ VB มันเป็นภาษาระดับสูง เราจึงไม่ต้องไปสนใจว่ามันอยู่ที่ Address ที่เท่าไร
    End Sub
    
    ความแตกต่างของทั้งสองอย่าง ก็คือ
  1. โปรแกรมย่อย ไม่สามารถคืนค่ากลับมาได้
  2. ฟังค์ชั่น สามารถคืนค่ากลับมาได้ (Return) ดังปรากฏในตัวอย่างนี้แหละครับ

 

รายละเอียดต่างๆก็ลองศึกษาหาเพิ่มเติมดูเอาแล้วกันครับ ก็เปิดจากหนังสือที่ทุกท่านแทบจะมีไว้ในอ้อมกอดกันหมดแล้วล่ะ พยายามเรียนรู้นอกระบบ นอกกรอบ (แบบผม) และที่สำคัญ "ต้องเจียมเนื้อเจียมตัว ว่าเราอยู่ในฐานะของผู้ใช้เทคโนโลยี ไม่ได้เป็นผู้สร้างเทคโนโลยี" อย่างเวลาเราจะขันน็อตสักตัว มีประแจอยู่เต็มกล่องเครื่องมือไปหมด ก็ลองเลือกๆจับๆมาหมุนลองดู พร้อมๆกับประเมินด้วยสายตาว่ามันจะแก้ปัญหาให้เราได้ด้วยหรือเปล่าน่ะ ประเดี๋ยวมันก็ได้เองนั่นแหละ ยิ่งทำบ่อยๆเท่าไร เปลี่ยนน็อตขนาดใหม่ๆไปเรื่อยๆ ก็จะรู้เองล่ะว่าจะจับประแจเบอร์ไหนมาใช้งาน จะเสียเวลาศึกษาไปทำไมว่า ประแจแต่ละเบอร์นั้นมีขนาดกี่หุน แล้วมันทำมาจากสารประกอบอะไรบ้าง จะต้องจับประแจขึ้นมาตั้งฉาก ทำมุมกี่องศา มันถึงจะเกิดแรง หรือ พลังงานสูงสุด ... เหอๆๆๆๆ ... เพราะสิ่งที่เราต้องการ คือ ขันน็อตให้มันแน่น ... แค่นั้นเอง (จริงๆ) ... ไม่รู้ใช้คำเปรียบเทียบ เปรียบเปรยให้ฟัง จะ Get กันบ้างหรือเปล่า ...


Public Function CalcDate(sDate As Date, eDate As Date) As String
Dim vDays As Integer
Dim vMonths As Integer
Dim vYears As Integer
    ' Parameters:
    '    sDate - ค่าวันเดือนปีเกิด (หรือวันเดือนปีที่ต้องการคำนวณหา)
    '    eDate - คำนวณเทียบกับวันเดือนปีปัจจุบัน (Now())
    ' Results:
    '    vYears - เก็บค่าความแตกต่างของจำนวนปี
    '    vMonths - เก็บค่าความแตกต่างของจำนวนเดือน
    '    vDays - เก็บค่าความแตกต่างของจำนวนวัน
    
    ' หาความแตกต่างของจำนวนเดือน
    vMonths = DateDiff("m", sDate, eDate)
    vDays = DateDiff("d", DateAdd("m", vMonths, sDate), eDate)
    If vDays < 0 Then
        vMonths = vMonths - 1
        vDays = DateDiff("d", DateAdd("m", vMonths, sDate), eDate)
    End If
    vYears = vMonths \ 12 ' หารตัดเศษก็จะได้จำนวนปี
    vMonths = vMonths Mod 12 ' การหารเอาเศษ โดยจะมีค่าระหว่าง 0, 1, 2, ... 11 ไม่มีทางเท่ากับ หรือ มากกว่า 12
    CalcDate = "จำนวน: " & vYears & " ปี " & vMonths & " เดือน " & vDays & " วัน."
End Function


การเรียกใช้งานก็แค่หาตัวแปร หรือ Control มารับค่า เช่น Label1.Caption = CalcDate("01/01/2520", Now)

จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560