Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

GetLocaleInfo и строковое название языка.   Найти похожие ветки 

 
vertal ©   (2004-12-25 17:05) [0]

В kernel32.dll есть функция GetLocaleInfo(A), позволяющая получить строку с названием или сокращенным названием языка, для которого LCID передается в качестве параметра. А мне, наоборот,  нужно получить по этой строке LanguageID . Есть ли какая-нибудь функция в Windows API для этой цели? Ведь преобразование взаимно однозначное.


 
Leonid Troyanovsky ©   (2004-12-25 18:23) [1]


> vertal ©   (25.12.04 17:05)  
> В kernel32.dll есть функция GetLocaleInfo(A), позволяющая
> получить строку с названием или сокращенным названием языка,
> для которого LCID передается в качестве параметра. А мне,
> наоборот,  нужно получить по этой строке LanguageID . Есть
> ли какая-нибудь функция в Windows API для этой цели? Ведь
> преобразование взаимно однозначное.


Путем EnumSystemLocales: StringList.AddObjects, внося
в Objects - LCID, и имя -
GetLocaleStr(LCID, LOCALE_SABBREVLANGNAME, "").
Тогда IndexOf даст нужный индекс: LCID(Objects[idx])
(лучше в Sorted).

--
С уважением, LVT.

ЗЫ В моей D6 есть какая-то кривость в декларациях.
Короче, объявлять  EnumLocalesProс приходится так:

function EnumLocalesProс(Name: PChar): Longint; stdcall;
var
 LCID: Integer;
 ..
begin
 LCID := StrToInt("$" + name);
 ..
 Result := 1; // для продолжения
end;


 
Leonid Troyanovsky ©   (2004-12-25 19:21) [2]


> Leonid Troyanovsky ©   (25.12.04 18:23) [1]
> ЗЫ В моей D6 есть какая-то кривость в декларациях.


Дело прояснилось: одни решили, что 1 это и есть TRUE для BOOL.
А вторые посчитали, что BOOL(1) это -1. {BOOL = LongBool}

Двоечники. Даже не знаю, кто хуже успевает :)

--
С уважением, LVT.


 
Игорь Шевченко ©   (2004-12-26 01:01) [3]

Leonid Troyanovsky ©   (25.12.04 19:21) [2]

Это реализация Nls-enumerators в Windows. Они (поубивал бы) сравнивают значение, возвращаемое callback-функцией с TRUE, а не с FALSE, как было бы правильно.

С уважением,


 
Хакер ©   (2004-12-26 01:04) [4]

Игорь Шевченко ©   (26.12.04 1:01) [3]
а чему равно TRUE  ?  - -1 ?


 
Anatoly Podgoretsky ©   (2004-12-26 01:14) [5]

Leonid Troyanovsky ©   (25.12.04 19:21) [2]
Игорь Шевченко ©   (26.12.04 01:01) [3]

Вот, вот, недавно обсуждали это в Потрепаться, там тоже не поверили.


 
Cobalt ©   (2004-12-26 01:41) [6]

Так, при сравнении с константой в С проблемы?
В Дельфях я что-то не обнаружил...


 
Leonid Troyanovsky ©   (2004-12-26 11:47) [7]


> Игорь Шевченко ©   (26.12.04 01:01) [3]

> Это реализация Nls-enumerators в Windows. Они (поубивал
> бы) сравнивают значение, возвращаемое callback-функцией
> с TRUE, а не с FALSE, как было бы правильно.


Ага, а борландов не хотелось убить? :)
Что значит Longint(Bool(1)) = -1 ?
В D3, по-крайней мере, не умничали.

--
С уважением, LVT.


 
Leonid Troyanovsky ©   (2004-12-26 11:53) [8]


> Anatoly Podgoretsky ©   (26.12.04 01:14) [5]

> Вот, вот, недавно обсуждали это в Потрепаться, там тоже
> не поверили.


Зря они так.
Нам надо всегда быть готовым к подвохам как со стороны MS,
так и Borland. Хотя, объем документации, конечно, не сравним.
Т.е., про плюхи первых можно дознаться,
то вторые ведут себя геройски.

--
С уважением, LVT.


 
Игорь Шевченко ©   (2004-12-26 19:27) [9]

Leonid Troyanovsky ©   (26.12.04 11:47) [7]

А борландов не хотелось убить, так как, насколько мне известно, борландами же (а может, и не только ими) определено лишь то, что false равно нулю. А true может быть любым ненулевым значением.

А программиста, писавшего Nls-enumerators, из MS наверное уже уволили :)

С уважением,


 
Leonid Troyanovsky ©   (2004-12-26 19:59) [10]


> Игорь Шевченко ©   (26.12.04 19:27) [9]

> то, что false равно нулю. А true может быть любым ненулевым
> значением.


Ну, да. При условии, что это значение $FFFFFFFF :)

--
С уважением, LVT


 
GuAV ©   (2004-12-26 22:58) [11]

Leonid Troyanovsky ©   (26.12.04 19:59) [10]

В Borland не думали что в BOOL TRUE = $FFFFFFFF.

Cравните результат для Boolean и BOOL. (код из одной из предыдущих веток "Boolean vs BOOL")

function b1: boolean;
asm
mov eax, 4 //недопустимое значение
end;

function b2: boolean;
asm
mov eax, 1
end;

function b3: boolean;
asm
mov eax, 256 //недопустимое значение
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if b1 = b2 then
 showmessage("b1 = b2"); //не выполнится
if b3 then
 showmessage("b3"); // не выполнится
end;

Если заменить в описаниях функций Boolean на BOOL, то showmessage выполнятся. Т.е. для BOOL любое ненулевое значение true и сравнение с другим ненулевым значением даст true хотя и сами значения могут быть и не равны.


 
Leonid Troyanovsky ©   (2004-12-27 00:51) [12]


> GuAV ©   (26.12.04 22:58) [11]

> В Borland не думали что в BOOL TRUE = $FFFFFFFF.


Ну, и о чем же они думали, делая Bool(1)?
1, IMHO, это не нулевое значение, и нефиг его преобразовывать.
Я мог бы согласится в случаях  ord, inc, succ, но уж если я
пишу LongBool(1), значит мне нужна 1, а не -1.

Примеры c Boolean здесь не катят, тут положена солома:

If such a value appears in a context where a Boolean is  
expected, the compiler automatically converts any value of
nonzero ordinality to True.

Но я и вовсе не использую контекста Boolean в случае
b {:LongBool} := LongBool(1).
Какого хрена _здесь_ автоматическое преобразование?
Правильно - они посчитали, что правильно $FFFFFFFF ;)

--
С уважением, LVT


 
Cobalt ©   (2004-12-27 00:58) [13]

2 GuAV ©   (26.12.04 22:58) [11]
Ну, понимаешь, тут есть одна особенность:
Boolean types
A Boolean variable occupies one byte of memory, a ByteBool variable also occupies one byte, a WordBool variable occupies two bytes (one word), and a LongBool variable occupies four bytes (two words).


 
Anatoly Podgoretsky ©   (2004-12-27 01:00) [14]

А черт знает о чем они думали.


 
GuAV ©   (2004-12-27 02:11) [15]

2 Leonid Troyanovsky ©   (27.12.04 0:51) [12]

Есть такой глюк. Я нашел такой выход:

const
 WIN_TRUE_VALUE: LongWord = 1;
var
 WIN_TRUE: BOOL absolute WIN_TRUE_VALUE;

Leonid Troyanovsky ©   (27.12.04 0:51) [12]
Примеры c Boolean здесь не катят, тут положена солома:


Cолома положенна для XxxxBool, но не для Boolean.

Cobalt ©   (27.12.04 0:58) [13]
Не только в этом дело. см if b1 = b2 then из [12], на этом примере видно ещё одно отличие Boolean от BOOL


 
Cobalt ©   (2004-12-27 10:11) [16]

2 GuAV ©   (27.12.04 02:11) [15]
см if b1 = b2 then из [12], на этом примере видно ещё одно отличие Boolean от BOOL.
Самое обидное, что такое
if boolean(b1) = boolean(b2) then
showmessage("b1 = b2"); //не выполнится

тоже не прокатывает :(
cmp bl,al
jnz +$0A
, однако.
Мда, напортачили они...


 
icWasya ©   (2005-01-11 12:38) [17]

а так не пробовали

function EnumLocalesProс(Name: PChar): LONGBOOL; stdcall;



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.038 c
14-1107775727
Vasya.ru
2005-02-07 14:28
2005.02.27
А какие вообще разрешения экранов бывают?


1-1108537973
Zhekson
2005-02-16 10:12
2005.02.27
Иконка в StatusBar_e - это реально???


14-1107428519
ArMellon
2005-02-03 14:01
2005.02.27
Кому не лень...


1-1107948544
Polad
2005-02-09 14:29
2005.02.27
Шифрование логина и пароля


6-1103107812
Grim
2004-12-15 13:50
2005.02.27
UDP Broadcast и OpenGL: проблемы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский