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
|