Delphi WinAPI SetLocaleInfo / GetLocaleInfo

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  更新时间:

博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你所有帮助,谢谢!
原文地址:https://www.cnblogs.com/guorongtao/p/14703093.html