Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  05:20[Войти] | [Зарегистрироваться]
Ответ на вопрос № 69184

13-03-2009 05:52
Добрый день!
Делфи 2009
В приложении есть несколько форм.
При запуске устанавливаю раскладку

rus:=LoadKeyboardLayout('00000419', 0);
ActivateKeyboardLayout(rus,0);


Открываю модальную форму, чет делаю, закрываю и .... раскладка возвращается в EN (она в системе по умолчанию).
Как избавиться от этого?
(отслеживать самопроизвольное переключение и возвращать к предидущей - не вариант).
(никаких автоматов на переключение в системе нет)

Заранее благодарен откликнувшимся.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

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 10:02 | Комментарий к предыдущим ответам
Кстати, вот эта ошибка на QC: отчёт №79485

09-04-2010 09:47 | Комментарий к предыдущим ответам
>>> А вот это вообще убивает наповал (функция InitSysLocale из SysUtils.pas). Они нас всех сделали китайцами!
Оказывается, это не глюк.

Дело в том, что во времена Win9x существовало две версии (две различные кодовые базы) Windows - западная и дальневосточная (FarEast), которая учитывала много дополнительных моментов. Отсюда идёт этот переключатель FarEast.

Windows NT изначально была unicode-ной и учитывала все эти моменты, поэтому у неё имеется всего одна (общая) кодовая база. Поэтому на ней FarEast = True (потому что именно это значение отвечает за полную поддержку unicode).

Так что вот эти строчки:

{$IF DEFINED(UNICODE)}
  SysLocale.FarEast := True;
{$ELSE}
  SysLocale.FarEast := GetSystemMetrics(SM_DBCSENABLED) <> 0;
{$IFEND}


а также отсутствие if not FarEast в TCustomDBGrid.WMKillFocus - это правильно и ошибки не содержит.

Ошибка в другом месте. Пока не ясно, зачем там вообще стоит этот ActivateKeyboardLayout.

13-03-2009 11:14 | Комментарий к предыдущим ответам
Ну... никто и не ждал, что переход на unicode будет безболезненным, верно? :)

13-03-2009 11:07 | Комментарий к предыдущим ответам
Ну вот... Борланд уподобился малышу Билли. Раньше я ставил "новинки" от мелкомягких через два-три года после начала продаж. Теперь, чувствую, и Д2009 начну юзать ближе к 2012 году...если доживу. ;-)

13-03-2009 10:41 | Комментарий к предыдущим ответам
А вот это вообще убивает наповал (функция InitSysLocale из SysUtils.pas):

{$IF DEFINED(UNICODE)}
  SysLocale.FarEast := True;
{$ELSE}
  SysLocale.FarEast := GetSystemMetrics(SM_DBCSENABLED) <> 0;
{$IFEND}

То есть они нас всех сделали китайцами!
Так что одной правки DBGrids.pas будет недостаточно.

13-03-2009 10:32 | Сообщение от автора вопроса
УУУУРРРАААА!

ВОПРОС РЕШЕН

САПСИБО DRON

ИСПОЛЬЗОВАЛ
PInteger(@Screen.DefaultKbLayout)^:=-1;


13-03-2009 10:25
Да... ну понакрутили в этой 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:

  PInteger(@Screen.DefaultKbLayout)^:=-1;


13-03-2009 10:24 | Сообщение от автора вопроса
Screen.DefaultKbLayout:=LoadKeyboardLayout('00000419', 0);

ERROR E2129 Cannot assign to a read-only property


13-03-2009 09:48
Как насчёт попробовать ставить Screen.DefaultKbLayout?

13-03-2009 09:36
Аналогичный вопрос без ответа (более широко описано)
http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=632253&pg=-1

13-03-2009 09:33
XP SP2

13-03-2009 09:31 | Вопрос к автору: запрос дополнительной информации
При запуске - это где? У меня Vista, D2009. Не воспроизводится.

13-03-2009 09:01
А если в ActivateKeyboardLayout передать не ноль, а $100?
ничего не меняет в плане решения данного вопроса

13-03-2009 08:59
Аналогичный вопрос без ответа
http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=632253&pg=-1

Видать формы у Вас непростые...или сами напортачили. Даже у Экселя (несколько открытых файлов, книг) единая раскладка клавиатуры (Excel 2003).


С формами ничего сложного нет
За эксель вкурсе, в своей проге того же ожидаю

13-03-2009 08:37 | Комментарий к предыдущим ответам
Я так понимаю $100 - всем приложениям - большой привет в плане раскладки клавиатуры?

13-03-2009 08:35
Видать формы у Вас непростые...или сами напортачили. Даже у Экселя (несколько открытых файлов, книг) единая раскладка клавиатуры (Excel 2003).

13-03-2009 08:35
А если в ActivateKeyboardLayout передать не ноль, а $100?

13-03-2009 08:08
"юзер" сам не переключает
программа/система сбрасывает раскладку на "умолчание"

этот код только включает
при переходе по формам одной проги - происходит сброс.
каких либо действий по смене раскладки (кроме установки при старте проги) в самой программе нет.

13-03-2009 08:01
Правда, для читабельности, пишу
ActivateKeyboardLayout(LoadKeyboardLayout('00000419', 0),0);

13-03-2009 08:00
Странно. Я точно такой код разместил в dpr-е - работает на ура. Кой в каких местах нужена "железно" латынь: до - установил 0409, после - вернул 0419. А уж если юзер сам переключает раскладки - это его трудности.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования