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

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

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

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

การตั้งค่ารูปแบบปฏิทิน - รูปแบบวันที่ โดยไม่ผ่าน Control Panel

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 28/2/2552   เวลา: 18:59
(อ่าน : 17634) 
ปัญหาที่เกิดขึ้นมาตลอดก็คือเรื่องของรูปแบบวันที่ เพราะเราต้องเขียนโค้ดติดต่อ (Interface) กับผู้ใช้งานคนไทยในรูปแบบของปี พ.ศ. เพราะบรรดาฐานข้อมูลนั้นถูกกำหนดให้ "เก็บข้อมูลในรูปแบบของ ค.ศ." ทีนี้ก่อนที่โปรแกรมจะทำงาน เราก็ควรตั้งรูปแบบปฏิทิน - รูปแบบวันที่ ให้กับ User ด้วยการกำหนดให้เองโดยผ่านทางการเขียนโค้ด (ลำบากขึ้น) เพิ่มเติม ด้วยการเรียกใช้งาน API (Application Programming Interface)
ดาวน์โหลด
ดาวน์โหลด 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
ข้อมูลเพิ่มเติม
ทำการอ่านค่ารูปแบบวันที่ของระบบเพื่อนำไปประยุกต์ใช้งานกับ MS Access
เริ่มต้นกระบวนการทำงาน

จาก Control Panel --> Regional and Langauge Options


ก่อนเปลี่ยน ...


สั่งให้โปรแกรมทำงาน
มาดูโค้ดกันเถอะ ...

Option Explicit

Public Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" ( _
    ByVal Locale As Long, _
    ByVal LCType As Long, _
    ByVal lpLCData As String, _
    ByVal cchData As Long) _
    As Long

Public Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" ( _
    ByVal Locale As Long, _
    ByVal LCType As Long, _
    ByVal lpLCData As String) _
    As Boolean

Public Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long

Global DefaultCalendarType As String    ' เก็บค่าปฏิทินเดิมเอาไว้
Global DefaultShortDate As String             ' เก็บรูปแบบวันที่ (dd/MM/yy)
Global DefaultLongDate As String             ' เก็บรูปแบบวันที่ (dd/MM/yyyy)

' โปรแกรมย่อย (Main) ที่เป็น Start up Project ได้ทันที
Sub Main()
    
    Dim LCID As Long
    Dim Symbol As String
    Dim iRet As Long
    
    ' หาค่า Locale ID (information) ในระบบ ... ไทยแลนด์ = 1054
    LCID = GetSystemDefaultLCID()
    
    ' ส่วนแรกจะเป็นการปรับรูปแบบปฏิทินจากอะไรก็แล้วแต่ ... ให้เป็น พุทธศักราช (พ.ศ.)
    ' ค่าคงที่ที่ประกาศไว้ Module RegionalSetting ... ผมยกเอามาให้ดูครับ ... พี่น้อง
    ' Public Const LOCALE_ICALENDARTYPE   As Long = &H1009
    
    ' กระโดดไปโปรแกรมย่อย GetUserLCID เพื่อหาค่าว่าปฏิทินใช้ในรูปแบบไหนกันแน่
    Symbol = GetUserLCID(LCID, LOCALE_ICALENDARTYPE)
    ' ค่าที่จะถูก Return กลับมา (String) เช่น "1" หรือ "7"
    ' --> "1" Gregorian (localized)
    ' --> "2" Gregorian (English strings always)
    ' --> "3" Era: Year of the Emperor (Japan)
    ' --> "4" Era: Year of Taiwan Region
    ' --> "5" Tangun Era(Korea)
    ' --> "6" Hijri (Arabic lunar)
    ' --> "7" Thai ... ไทยแลนด์มีค่าเท่ากับ 7
    ' --> "8" Hebrew (Lunar)
    ' --> "9" Gregorian Middle East French
    ' --> "10" Gregorian Arabic calendar
    ' --> "11" Gregorian Transliterated English
    ' --> "12" Gregorian Transliterated French
    
    ' เก็บค่าเอาไว้ในตัวแปรแบบ Global ... สำหรับตอนที่ปิดโปรแกรมแล้วก็ค่อยคืนค่ากลับไปตามเดิม
    DefaultCalendarType = Symbol
    
    ' เปลี่ยนค่าปฏิทินให้เป็น พุทธศักราช
    Symbol = "7"
    ' หรือทดสอบกำหนด Symbol = "1" ... ก็จะเห็นเป็นปี ค.ศ.
    ' หากว่า iRet ถูกส่งกลับมาเป็น 0 คือ มีการเกิด Error ขึ้นมาน่ะครับ
    iRet = SetLocaleInfo(LCID, LOCALE_ICALENDARTYPE, Symbol)
    
    ' สำหรับรูปแบบวันที่แบบสั้น - Short Date
    Symbol = GetUserLCID(LCID, LOCALE_SSHORTDATE)
    DefaultShortDate = Symbol
    ' เปลี่ยนค่าตามที่ต้องการ ... M ตัวใหญ่น่ะครับ
    Symbol = "dd/MM/yy"
    iRet = SetLocaleInfo(LCID, LOCALE_SSHORTDATE, Symbol)
    
    
    ' สำหรับรูปแบบวันที่แบบยาว -  Long Date
    Symbol = GetUserLCID(LCID, LOCALE_SLONGDATE)
    DefaultLongDate = Symbol
    ' เปลี่ยนค่าตามที่ต้องการ
    Symbol = "dd MMMM yyyy"
    iRet = SetLocaleInfo(LCID, LOCALE_SLONGDATE, Symbol)

End Sub

' โปรแกรมย่อยที่ใช้ในการหาค่ารูปแบบต่างๆ ... และส่งค่ากลับไปเป็นแบบ String
' ศึกษาเรื่องของการรับส่งค่าด้วย ByVal และ ByRef ด้วยน่ะครับผม
' http://www.g2gnet.com/News/activeNews_view.asp?articleID=101
Public Function GetUserLCID(ByRef LCID As Long, ByVal LCType As Long) As String

    Dim Symbol As String
    Dim iRet As Long

    ' หาขนาดของชนิดข้อมูลที่ต้องการ (Locale Type) เช่น ...
    ' กรณีของรูปแบบปฏิทิน LOCALE_ICALENDARTYPE = &H1009  หรือ 4105 (ฐาน 10)
    ' กรณีของวันที่แบบสั้น LOCALE_SSHORTDATE = &H1F หรือ 31 (ฐาน 10)
    ' ค่าที่ว่ามานี้ เป็นการกำหนดค่าคงที่เอาไว้ เพื่อใช้งานผ่านทาง WinAPI น่ะครับผม
    iRet = GetLocaleInfo(LCID, LCType, Symbol, Len(Symbol))
    
    ' ไม่มีการเกิด Error ... ค่า iRet จะไม่เป็น 0 (หากเป็น 0 หรือเป็น เท็จ หรือ False นั่นเองครับ ... จำไว้ให้ดี)
    If iRet Then
        ' จับจองพื้นที่ในหน่วยความจำ (Buffer) ... Space เป็นการกำหนดขนาดตามจำนวนของ iRet
        Symbol = Space$(iRet)
        
        ' และเรียกซ้ำอีกครั้ง ... เพื่อกำหนดขนาดหน่วยจำที่ต้องการ (Buffer)
        iRet = GetLocaleInfo(LCID, LCType, Symbol, Len(Symbol))
        ' หากสามารถทำงานได้สำเร็จ ... iRet ต้องมากกว่า 0
        If iRet Then
            ' นั่นคือ iRet จะเป็นตัวกำหนดขนาดของหน่วยความจำเอาไว้
            ' คืนค่ากลับผ่านทางฟังค์ชั่น (String)
            GetUserLCID = Left$(Symbol, iRet - 1)
        End If
        
        ' จาก Statement ด้านบน เขียนสั้นแบบนี้ก็ได้ ... If iRet Then GetUserLCID = Left$(Symbol, iRet - 1)
        
    End If
    
End Function
Conclusion:
จากโปรแกรมย่อย GetUserLCID (ฟังค์ชั่น) ตัวนี้ ... พี่น้องสามารถนำไปประยุกต์ใช้งานได้อย่างกว้างขวางมากมาย ไม่ว่าจะเป็นเรื่องของรูปแบบของตัวเลข เวลา หรือ สกุลเงิน เพื่อจัดรูปแบบให้ตรงกับระบบฐานข้อมูล (DataBase) แต่ละตัวที่ได้เลือกมาใช้งาน ... แบบเป็นอิสระ โดยไม่ต้องไปพะวงว่าจะมีผลกระทบต่อการใช้งานโปรแกรมอื่นๆที่อยู่ในเครื่องเดียวกันหรือไม่

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