Форум: "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