Как по Locale/CodePage определить Charset для языка?
От: aDelphi  
Дата: 26.04.05 09:45
Оценка:
Как по Locale или по CodePage определить Charset для того или иного языка?
т.е. например для
русского $0419 — RUSSIAN_CHARSET;
английский $0409 — DEFAULT_CHARSET;
французский $040C — EASTEUROPE_CHARSET; или другой какой-нибудь
т.е. нужна стандартная функция которая это делает.
Ну или очень классная идея как это сделать.

Нужно это для того, чтобы корректно отображались Hint-ы для контролов в зависимости от выбранного языка.

Спасибо
Re: Как по Locale/CodePage определить Charset для языка?
От: Dimonka Верблюд  
Дата: 26.04.05 10:20
Оценка: 57 (2)
Нашёл такой вот примерчик в баг репортах..:


procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  buffer: array [0..6] of Char;
  CodePage : DWORD;
  cs : TCharsetInfo;
  charset : TFontCharset;
begin

// Find the TFontCharset for Romania...

  for i := 0 to Languages.Count - 1 do
    if Languages.Ext [i] = 'ROM' then
    begin
      GetLocaleInfo(Languages.LocaleID [i], LOCALE_IDEFAULTANSICODEPAGE, buffer, SizeOf(buffer));
      CodePage := StrToIntDef(Buffer, GetACP);
      Win32Check (TranslateCharsetInfo (CodePage, cs, TCI_SRCCODEPAGE));
      charset := cs.ciCharset;

      ShowMessage (Format ('Use TFontCharset=%d for Romania', [charset]))
    end
end;
Re[2]: Как по Locale/CodePage определить Charset для языка?
От: aDelphi  
Дата: 26.04.05 11:27
Оценка:
Спасибо за ответ.
Только вот выдается ошибка:
"A call to an OS function failed"
при выполнении строки
Win32Check(TranslateCharsetInfo(lpSrc, lpCs, TCI_SRCCODEPAGE));

Может быть подскажешь в чем проблема?

var
  lpSrc: DWORD;
  lpCs: TCharsetInfo;
  charset: TFontCharset;
begin
  lpSrc := 1251; // или другие
  Win32Check(TranslateCharsetInfo(lpSrc, lpCs, TCI_SRCCODEPAGE));
  charset := lpCs.ciCharset;
Re[3]: Как по Locale/CodePage определить Charset для языка?
От: Dimonka Верблюд  
Дата: 26.04.05 13:26
Оценка:
Здравствуйте, aDelphi, Вы писали:

D>Спасибо за ответ.

D>Только вот выдается ошибка:
D>"A call to an OS function failed"
D>при выполнении строки
D>Win32Check(TranslateCharsetInfo(lpSrc, lpCs, TCI_SRCCODEPAGE));

D>Может быть подскажешь в чем проблема?


По всей видимости надо поставить апдейт на Delphi. Этот пример из Quality Central на borland.com и он отмечен как "закрыт"
Re[4]: Как по Locale/CodePage определить Charset для языка?
От: aDelphi  
Дата: 26.04.05 16:29
Оценка:
Здравствуйте, Dimonka, Вы писали:

D>По всей видимости надо поставить апдейт на Delphi. Этот пример из Quality Central на borland.com и он отмечен как "закрыт"


Использую Delphi 7 + Update 1, Win2K Pro SP 4

Скажи пожалуйста какой еще апдейт нужен?

Спасибо
Re[3]: Как по Locale/CodePage определить Charset для языка?
От: Dimonka Верблюд  
Дата: 26.04.05 20:27
Оценка:
Здравствуйте, aDelphi, Вы писали:

D>Спасибо за ответ.

D>Только вот выдается ошибка:
D>"A call to an OS function failed"
D>при выполнении строки
D>Win32Check(TranslateCharsetInfo(lpSrc, lpCs, TCI_SRCCODEPAGE));

D>Может быть подскажешь в чем проблема?


Извиняюсь, не дочитал до конца отчёт.. В Delphi неправильно обьявлена функция TranslateCharsetInfo в Windows.pas её надо переобьявить следующим образом:
  function TranslateCharsetInfo(lpSrc: DWORD; var lpCs: TCharsetInfo; dwFlags: DWORD): BOOL; stdcall; external 'gdi32.dll';


nb. With this workaround you can still pass the address of a FONTSIGNATURE structure to the API — just cast the address to a DWORD.

Re[4]: Как по Locale/CodePage определить Charset для языка?
От: aDelphi  
Дата: 27.04.05 06:29
Оценка:
Здравствуйте, Dimonka, Вы писали:

Спасибо дружище за ответ, все классно работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.