我的delphi 2009应用程序有一个使用GNUGetText的基本翻译系统。我曾使用一些win API调用来准备字体。我认为它的工作是正确的,直到最近马耳他的某个人在我的应用程序出现问题时才完全失败。我的应用程序全球使用。由于d2009使用unicode,因此一些代码可能已经过时。确定要使用的字符集
为了让我的应用程序能够在所有语言环境中工作,这些都是真正必需的吗?
TForm.Font.Charset
这是我的理解,我必须根据用户的区域设置TForm的实例的Font.Charset。它是否正确?
TranslateCharsetInfo()赢得API函数
德尔福2009年的windows.pas说:
function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo;
dwFlags: DWORD): BOOL;
德尔福5的windows.pas说:
function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo;
dwFlags: DWORD): BOOL; stdcall;
从微软的MSDN
:
BOOL TranslateCharsetInfo(
__inout DWORD FAR *lpSrc,
__out LPCHARSETINFO lpCs,
__in DWORD dwFlags
);
当这个代码写(在Delphi回5天)
回,字功能的运行轨迹是不正确的和正确的方法是:
function TranslateCharsetInfo(lpSrc: Pointer; var lpCs: TCharsetInfo;
dwFlags: DWORD): BOOL; stdcall; external gdi32;
公告称,D2009 windows.pas文件复制不是stdcall。我应该使用TranslateCharsetInfo的哪个声明?
代码
的是,除了基本上我一直在做如下:
var
Buffer : PChar;
iSize, iCodePage : integer;
rCharsetInfo: TCharsetInfo;
begin
// SysLocale.DefaultLCID = 1802
iSize := GetLocaleInfo(SysLocale.DefaultLCID, LOCALE_IDefaultAnsiCodePage,
nil, 0);
// size=14
GetMem(Buffer, iSize);
try
if GetLocaleInfo(SysLocale.DefaultLCID, LOCALE_IDefaultAnsiCodePage, Buffer,
iSize)=0 then
RaiseLastOSError;
// Buffer contains 0 so codepage = 0
iCodePage:=Result := StrToInt(string(Buffer));
finally
FreeMem(Buffer);
end;
// this function is not called according to MSDN's directions for
// TCI_SRCCODEPAGE and the call fails.
if not TranslateCharsetInfo(Pointer(iCodePage), rCharsetInfo,
TCI_SRCCODEPAGE) then
RaiseLastOSError;
// acts upon the form
Font.Charset:= rCharsetInfo.ciCharset;
end;
我只是不知道有足够的了解这个......奇怪的是,几年前,当我写这个,我被说服了,它工作正常。未能检查API调用返回码的结果...
是不是有更聪明的方法来做到这一点? RTL/VCL不会自动完成大部分/全部这些操作吗?我的直觉告诉我,我正在努力工作......
谢谢你的帮助!
感谢您的评论Lars D!我会要求某人在这样的语言环境中尝试我的应用。 – 2009-11-23 22:45:13