Открываю модальную форму, чет делаю, закрываю и .... раскладка возвращается в EN (она в системе по умолчанию).
Как избавиться от этого?
(отслеживать самопроизвольное переключение и возвращать к предидущей - не вариант).
(никаких автоматов на переключение в системе нет)
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
12-04-2010 14:25 | Комментарий к предыдущим ответам
>>> Ну а что же это тогда такое?
Имелось ввиду, что да, переключателей должно быть больше, но поскольку он один, то получается, что его значение установлено верно.
Другой вопрос, что:
1. Их действительно должно быть больше.
2. Его название (FarEast - не интуитивно) привело к неправильному его использованию.
К сожалению я потерял ссылку, где об этом говорилось :( Писал по памяти.
12-04-2010 10:30 | Комментарий к предыдущим ответам
Оказывается, это не глюк.
Ну а что же это тогда такое?
Дело в том, что во времена Win9x существовало две версии (две различные кодовые базы) Windows - западная и дальневосточная (FarEast), которая учитывала много дополнительных моментов. Отсюда идёт этот переключатель FarEast.
Вот проблема как раз и заключается в том, что переключатель всего один, а должно быть как минимум два: IsEastAsianVersion, IsIMESupported. А ещё лучше три: IsDBCSCodepage, чтобы не выполнять абсолютно не нужные в большинстве случаев проверки на LeadBytes. Да, раньше вариантов было всего два и можно было обойтись одним переключателем, но теперь-то надо оставить IME включённым, но выключить все хаки для локализованных версий и поддержку DBCS.
Windows NT изначально была unicode-ной и учитывала все эти моменты, поэтому у неё имеется всего одна (общая) кодовая база. Поэтому на ней FarEast = True (потому что именно это значение отвечает за полную поддержку unicode).
В коде имеются места, где есть проверка и на FarEast и на VER_PLATFORM_WIN32_NT, так что эта одна база существует чисто теоретически. Например, то же IME имелось отнюдь не во всех локализациях NT4.
Ошибка в другом месте. Пока не ясно, зачем там вообще стоит этот ActivateKeyboardLayout.
Я считаю, что "ошибка" в том, что изменения для поддержки Юникода поручили тем, кто не знал всех тонкостей и просто не мог отличить поддержку возможностей типа IME, от хаков предназначенных для конкретных азиатских локализаций. Например, я сильно сомневаюсь, что баг исправляемый вот этим хаком
if SysLocale.FarEast and (Win32Platform = VER_PLATFORM_WIN32_NT) then
with Value do
begin
Inc(MaxSubKeyLen, MaxSubKeyLen);
Inc(MaxValueLen, MaxValueLen);
end;
присутствует в поддерживаемых Delphi2010 версиях Windows. Но так как теперь FarEast всегда True, то и это исправление будет всегда активно.
09-04-2010 09:47 | Комментарий к предыдущим ответам
>>> А вот это вообще убивает наповал (функция InitSysLocale из SysUtils.pas). Они нас всех сделали китайцами!
Оказывается, это не глюк.
Дело в том, что во времена Win9x существовало две версии (две различные кодовые базы) Windows - западная и дальневосточная (FarEast), которая учитывала много дополнительных моментов. Отсюда идёт этот переключатель FarEast.
Windows NT изначально была unicode-ной и учитывала все эти моменты, поэтому у неё имеется всего одна (общая) кодовая база. Поэтому на ней FarEast = True (потому что именно это значение отвечает за полную поддержку unicode).
13-03-2009 11:07 | Комментарий к предыдущим ответам
Ну вот... Борланд уподобился малышу Билли. Раньше я ставил "новинки" от мелкомягких через два-три года после начала продаж. Теперь, чувствую, и Д2009 начну юзать ближе к 2012 году...если доживу. ;-)
Да... ну понакрутили в этой Delphi2009:
Нормальный вариант (с проверкой на "узкоглазость")
procedure TInplaceEditList.WMKillFocus(var Message: TWMKillFocus);
begin
if not SysLocale.FarEast then
begin
inherited;
end else
begin
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;
inherited;
if HWND(Message.FocusedWnd) <> Grid.Handle then
ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
end;
CloseUp(False);
end;
А тут всех под одну гребёнку
procedure TCustomDBGrid.WMKillFocus(var Message: TMessage);
begin
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;
inherited;
if not ((InplaceEditor <> nil) and
(HWND(Message.WParam) = InplaceEditor.Handle)) then
ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
end;
"юзер" сам не переключает
программа/система сбрасывает раскладку на "умолчание"
этот код только включает
при переходе по формам одной проги - происходит сброс.
каких либо действий по смене раскладки (кроме установки при старте проги) в самой программе нет.
Странно. Я точно такой код разместил в dpr-е - работает на ура. Кой в каких местах нужена "железно" латынь: до - установил 0409, после - вернул 0419. А уж если юзер сам переключает раскладки - это его трудности.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.