Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

GetLocaleInfo и строковое название языка.


vertal ©   (2004-12-25 17:05:00) 

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


icWasya   (2005-01-11 12:38:00) [1]

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

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


Cobalt   (2004-12-27 10:11:00) [2]

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
, однако.
Мда, напортачили они...


GuAV   (2004-12-27 02:11:00) [3]

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


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

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


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

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


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


> 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


GuAV   (2004-12-26 22:58:00) [7]

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-26 19:59:00) [8]


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

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


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

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


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

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

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

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

С уважением,


Leonid Troyanovsky   (2004-12-26 11:53:00) [10]


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

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


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

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


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


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

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


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

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


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

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


Anatoly Podgoretsky   (2004-12-26 01:14:00) [13]

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

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


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

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


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

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

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

С уважением,


Leonid Troyanovsky   (2004-12-25 19:21:00) [16]


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


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

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

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


Leonid Troyanovsky   (2004-12-25 18:23:00) [17]


> 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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо