Delphi WinAPI SetLocaleInfo / GetLocaleInfo - 设置/获取 当前区域设置的信息项(日期格式、语言格式等)
1、SetLocaleInfo
语法原型:
BOOL SetLocaleInfoA(
LCID Locale, //要检索其信息的区域设置标识符。
LCTYPE LCType, //要设置的区域设置信息的类型。
LPCSTR lpLCData //指向包含要设置的区域设置信息的以null结尾的字符串的指针。信息必须采用特定于指定常量的格式。应用程序对函数的Unicode版本使用Unicode字符串,对ANSI版本使用ANSI字符串。
);
参数:
Locale //要检索其信息的区域设置标识符。
- LOCALE_SYSTEM_DEFAULT //表示要操作的是系统默认的设置;
- LOCALE_USER_DEFAULT //表示要操作的是当前用户的设置。还可以取其他值,用于具体修改某种语言区域的设置。一般取 LOCALE_USER_DEFAULT。
LCType //表示要操作信息的类型。以下 CONSTANT Long 类型参数:
- LOCALE_SCURRENCY = 20 //本地语言货币符号
- LOCALE_SINTLSYMBOL = 21 //国际货币符号
- LOCALE_SMONDECIMALSEP = 22 //小数分隔符
- LOCALE_SMONTHOUSANDSEP = 23 //千位分隔符
- LOCALE_SMONGROUPING = 24 //数据分组方式
- LOCALE_ICURRDIGITS = 25 //# 本地数字
- LOCALE_IINTLCURRDIGITS = 26 //# 国际数字
- LOCALE_ICURRENCY = 27 //货币正数表示模式
- LOCALE_INEGCURR = 28 //货币负数表示模式
- LOCALE_IPOSSIGNPOSN = 82 //货币正数符号的位置
- LOCALE_INEGSIGNPOSN = 83 //货币负数符号的位置
- LOCALE_IPOSSYMPRECEDES = 84 //正数中,货币符号位于值之前
- LOCALE_IPOSSEPBYSPACE = 85 //正数中,货币符号与值之间被空格分开
- LOCALE_INEGSYMPRECEDES = 86 //负数中,货币符号位于值之前
- LOCALE_INEGSEPBYSPACE = 87 //负数中,货币符号与值之间被空格分开
- LOCALE_FONTSIGNATURE = 88 //font signature
- LOCALE_SENGCURRNAME = 4103 //货币的英语名称
- LOCALE_SNATIVECURRNAME = 4104 //货币的当地语言名称
- LOCALE_ILANGUAGE = 1 //语言ID
- LOCALE_SLANGUAGE = 2 //语言区域名称
- LOCALE_SENGLANGUAGE = 4097 //语言英语名称
- LOCALE_SABBREVLANGNAME = 3 //语言名称缩写
- LOCALE_SNATIVELANGNAME = 4 //当地语言名称
- LOCALE_ICOUNTRY = 5 //国家代码
- LOCALE_SCOUNTRY = 6 //国家本地名称
- LOCALE_SENGCOUNTRY = 4098 //国家英语名称
- LOCALE_SABBREVCTRYNAME = 7 //国家名称缩写
- LOCALE_SNATIVECTRYNAME = 8 //当地语言国家名称
- LOCALE_IDEFAULTLANGUAGE = 9 //缺省语言ID
- LOCALE_IDEFAULTCOUNTRY = 10 //缺省国家代码
- LOCALE_IDEFAULTCODEPAGE = 11 //缺省的OEM代码
- LOCALE_SLIST = 12 //list item separator
- LOCALE_IDEFAULTANSICODEPAGE = 4100 //缺省的ASCII代码
- LOCALE_IDEFAULTMACCODEPAGE = 4113 //缺省的MACINTOH代码
- LOCALE_IMEASURE = 13 //0 = 公制, 1 = 美制
- LOCALE_SDECIMAL = 14 //decimal separator
- LOCALE_STHOUSAND = 15 //thousand separator
- LOCALE_SGROUPING = 16 //digit grouping
- LOCALE_IDIGITS = 17 //number of fractional digits
- LOCALE_ILZERO = 18 //leading zeros for decimal
- LOCALE_SNATIVEDIGITS = 19 //native ascii 0-9
- //Windows NT 4.0/2000/XP
- LOCALE_SISO639LANGNAME = 89 //ISO 语言缩写名称
- LOCALE_SISO3166CTRYNAME = 90 //ISO 国家缩写名称
- //Windows 2000/XP
- LOCALE_IDEFAULTEBCDICCODEPAGE = 4114 //缺省的EBCDIC代码
- LOCALE_SSORTNAME = 4115 //排序名称
- LOCALE_INEGNUMBER = 4112 //negative number mode
- LOCALE_SDATE = 29 //日期分隔符 可以单独使用
- LOCALE_STIME = 30 //时间风隔符 可以单独使用
- LOCALE_SSHORTDATE = 31 //短日期格式
- LOCALE_SLONGDATE = 32 //长日期格式
- LOCALE_STIMEFORMAT = 4009 //时间格式
- LOCALE_IDATE = 33 //短日期格式的排列顺序
- LOCALE_ILDATE = 34 //长日期格式的排列顺序
- LOCALE_ITIME = 35 //时间格式标示符号
- LOCALE_ITIMEMARKPOSN = 4011 //时间标记符位置
- LOCALE_ICENTURY = 36 //世纪识别符 (短日期)
- LOCALE_ITLZERO = 37 //时间数字前面前导0
- LOCALE_IDAYLZERO = 38 //日期数字前面前导0 (短日期)
- LOCALE_IMONLZERO = 39 //月份数字前面前导0 (短日期)
- LOCALE_S1159 = 40 //AM 指示符
- LOCALE_S2359 = 41 //PM 指示符
- LOCALE_ICALENDARTYPE = 4105 //日历类型指示符
- LOCALE_IPAPERSIZE = 4106 //0 = letter, 1 = a4, 2 = legal, 3 = a3
- LOCALE_IOPTIONALCALENDAR = 4107 //其它日历类型指示符
- LOCALE_IFIRSTDAYOFWEEK = 4108 //一周中的第一天指示符
- LOCALE_IFIRSTWEEKOFYEAR = 4109 //一年中的第一周指示符
- LOCALE_SDAYNAME1 = 42 //星期一的长名称
- LOCALE_SDAYNAME2 = 43 //星期二的长名称
- LOCALE_SDAYNAME3 = 44 //星期三的长名称
- LOCALE_SDAYNAME4 = 45 //星期四的长名称
- LOCALE_SDAYNAME5 = 46 //星期五的长名称
- LOCALE_SDAYNAME6 = 47 //星期六的长名称
- LOCALE_SDAYNAME7 = 48 //星期天的长名称
- LOCALE_SABBREVDAYNAME1 = 49 //星期一的缩写名称
- LOCALE_SABBREVDAYNAME2 = 50 //星期二的缩写名称
- LOCALE_SABBREVDAYNAME3 = 51 //星期三的缩写名称
- LOCALE_SABBREVDAYNAME4 = 52 //星期四的缩写名称
- LOCALE_SABBREVDAYNAME5 = 53 //星期五的缩写名称
- LOCALE_SABBREVDAYNAME6 = 54 //星期六的缩写名称
- LOCALE_SABBREVDAYNAME7 = 55 //星期日的缩写名称
- LOCALE_SMONTHNAME1 = 56 //一月的长名称
- LOCALE_SMONTHNAME2 = 57 //二月的长名称
- LOCALE_SMONTHNAME3 = 58 //三月的长名称
- LOCALE_SMONTHNAME4 = 59 //四月的长名称
- LOCALE_SMONTHNAME5 = 60 //五月的长名称
- LOCALE_SMONTHNAME6 = 61 //六月的长名称
- LOCALE_SMONTHNAME7 = 62 //七月的长名称
- LOCALE_SMONTHNAME8 = 63 //八月的长名称
- LOCALE_SMONTHNAME9 = 64 //九月的长名称
- LOCALE_SMONTHNAME10 = 65 //十月的长名称
- LOCALE_SMONTHNAME11 = 66 //十一月的长名称
- LOCALE_SMONTHNAME12 = 67 //十二月的长名称
- LOCALE_SMONTHNAME13 = 4110 //十三月的长名称 (如果存在)
- LOCALE_SABBREVMONTHNAME1 = 68 //一月的缩写名称
- LOCALE_SABBREVMONTHNAME2 = 69 //二月的缩写名称
- LOCALE_SABBREVMONTHNAME3 = 70 //三月的缩写名称
- LOCALE_SABBREVMONTHNAME4 = 71 //四月的缩写名称
- LOCALE_SABBREVMONTHNAME5 = 72 //五月的缩写名称
- LOCALE_SABBREVMONTHNAME6 = 73 //六月的缩写名称
- LOCALE_SABBREVMONTHNAME7 = 74 //七月的缩写名称
- LOCALE_SABBREVMONTHNAME8 = 75 //八月的缩写名称
- LOCALE_SABBREVMONTHNAME9 = 76 //九月的缩写名称
- LOCALE_SABBREVMONTHNAME10 = 77 //十月的缩写名称
- LOCALE_SABBREVMONTHNAME11 = 78 //十一月的缩写名称
- LOCALE_SABBREVMONTHNAME12 = 79 //十二月的缩写名称
- LOCALE_SABBREVMONTHNAME13 = 4111 //十三月的缩写名称 (如果存在)
- LOCALE_SPOSITIVESIGN = 80 //positive sign
- LOCALE_SNEGATIVESIGN = 81 //negative sign
- LOCALE_SYEARMONTH = 4102 //year month format string
- LOCALE_IDIGITSUBSTITUTION = 4116 //0 = none, 1 = context, 2 = native digit
示例:
procedure SetDateTimeFormat();
var
p:DWORD;
begin
SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SSHORTDATE,pchar('yyyy-MM-dd')); //短日期
SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SLONGDATE,pchar('yyyy''年''M''月 ''d''日'''));
SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_STIMEFORMAT,pchar('H:mm:ss')); //设置时间
SendMessageTimeOut(HWND_BROADCAST,WM_SETTINGCHANGE,0,0,SMTO_ABORTIFHUNG,10,p);//设置完成后必须调用,通知其他程序格式已经更改,否则即使是程序自身也不能使用新设置的格式
end;
提示:设置日期时间格式后,应该向当前系统的激活窗口广播发送 WM_SETTINGCHANGE 消息,否则即使修改了,程序里还是不能使用的。
2、GetLocaleInfo
语法原型:
int GetLocaleInfoA(
LCID Locale, //要检索其信息的区域设置标识符。
LCTYPE LCType, //要检索的区域设置信息。
LPSTR lpLCData, //指向缓冲区的指针,此函数在其中检索请求的区域设置信息。如果cchData设置为0,则不使用此指针。有关更多信息,请参阅备注部分。
int cchData //lpLCData表示的数据缓冲区的大小,以TCHAR值为单位。或者,应用程序可以将此参数设置为0。在这种情况下,函数不使用lpLCData参数,而是返回所需的缓冲区大小,包括终止的空字符。
);
参数:
同上 SetLocaleInfo 的 的参数。
示例:
procedure GetDateTimeFormat();
var
buf:pchar;
i:integer;
GPrevShortDate,GPrevLongDate,GPrevTimeFormat:string;
begin
getmem(buf,100);
i:=100; //i必须在调用前赋值为buf缓冲区的长度。如果设为0或负值,将取不到设置的值
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SSHORTDATE,buf,i); //取当前用户设置,短日期格式。
GPrevShortDate:=string(buf);
i:=100;
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SLONGDATE,buf,i); //取长日期格式
GPrevLongDate:=string(buf);
i:=100;
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_STIMEFORMAT,buf,i); //取时间格式
GPrevTimeFormat:=string(buf);
FreeMem(buf);
end;
创建时间:2021.04.26 更新时间: