Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
1-1108368951
Игорь нтк
2005-02-14 11:15
2005.02.27
ограничение символов в Мемо


3-1106754082
denis24
2005-01-26 18:41
2005.02.27
Хранение больших текстов


1-1108542363
Игорь нтк
2005-02-16 11:26
2005.02.27
как сохранить выбор кнопки из radiogroup


3-1106739151
Ega23
2005-01-26 14:32
2005.02.27
Проблема подключения TSQLConnection к базе


1-1108392101
Вася
2005-02-14 17:41
2005.02.27
Запуск своего приложения из офисных приложений