2

мое приложение delphi 2009 имеет базовую систему перевода, которая использует GNUGetText. Я использовал некоторые вызовы API API для подготовки шрифтов. я думал, что он работает правильно до недавнего времени, когда у кого-то из Мальты возникла проблема с моим приложением, который не срабатывал именно в этой области. мое приложение используется во всем мире. некоторые из этого кода, возможно, устарели, поскольку d2009 использует unicode.определение набора символов для использования

все это действительно необходимо для того, чтобы мое приложение работало во всех локациях?

TForm.Font.Charset

это было мое понимание я должен установить Font.Charset экземпляра TFORM в соответствии с локали пользователя. это верно?

TranslateCharsetInfo() выиграть функции API

Windows.pas Delphi 2009 говорит:

function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo; 
dwFlags: DWORD): BOOL; 

Delphi 5 по Windows.pas говорит:

function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo; 
dwFlags: DWORD): BOOL; stdcall; 

из MSDN Microsoft:

BOOL TranslateCharsetInfo(
    __inout DWORD FAR *lpSrc, 
    __out LPCHARSETINFO lpCs, 
    __in  DWORD dwFlags 
); 

назад, когда этот код был написан (назад в Дельфи 5 дней), слово было InPort функции неверен и правильный путь был:

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 большинство/все это автоматически? мои инстинкты говорят мне, что я слишком много работаю над этим ...

Благодарим вас за помощь!

ответ

1

На самом деле, я не уверен, что Delphi 2009, но MSDN говорит:

Обратите внимание, что DEFAULT_CHARSET не реальный набор символов; Скорее, он является константой, родственной NULL, что означает «показывать символы в любых кодировках».

Итак, я предполагаю, что вам просто нужно удалить весь код, который вы упомянули, и он должен работать.

+0

спасибо за ваш комментарий Lars D! я попрошу, чтобы кто-то попробовал мое приложение в такой локали. –

0

Не совсем ответ на этот вопрос, но «маленькая» заметка о возможном повреждении памяти с помощью этого кода под D2009 +.Функция GetLocaleInfo «MSDN: возвращает количество символов, полученных в буфере данных локали ...», а не BYTES, поэтому в D2009 + вы ДОЛЖНЫ выделить 2 байта для каждого символа. Лучший способ сделать это написать:

GetMem(Buffer, iSize * SizeOf(Char)); //This will be safe for all delphi versions 

Без этого вы можете привести к непредсказуемым AVs (D2009 +), функция GetLocaleInfo может перезаписать вашу память, потому что вы выделили слишком маленький буфер.

Кроме того, я не понимаю, почему вы пытаетесь изменить кодировку для пользовательской локали, я думаю, что вы должны изменить кодировку на ваш перевод назначения (например, ваша программа настроена на перевод на русский язык, но работает на Английская ОС, тогда вам нужно изменить charset на RUSSIAN_CHARSET, а не ANSI_CHARSET). И под D2009 + я не уверен, что это необходимо, но я могу ошибаться.

+0

хорошо пункт. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^