![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Смена раскладки клавиатуры на русский
Savek © (2011-04-27 17:07:00)Столкнулся с проблемой: При потере фокуса DBGrid-ом раскладка клавиатуры переключается на русскую... Проект и откомпилированный модуль (D2010) можно посмотреть здесь http://depositfiles.com/files/by8o591pq
Хотя смотреть особо нечего: в Delphi 2010 File-New-VCL Application -Delphi
На форму кидаю DBGrid, Button, запускаю. Чудеса проявляются так: кликаем по сетке, переключаем на английскую раскладку, кликаем кнопку - вуаля! Опять русская раскладка! Проверял на XP и win7. Кто нибудь сталкивался? Баг не смертельный, но в большом проекте напрягает..
GMasta (2011-09-01 19:57:00) [1]Сам столкнулся с данной проблемой и нагуглил вот что:
Лечение "прыгающей раскладки"
В юникодовских делфях иногда встречается косяк "прыгающей раскладки" при переходе между контролами..лечить методом Application.NonBiDiKeyboard:='00000419'; приведет к тормозам с получением фокуса контролом...а вот если в dprдобавить PInteger (@Screen.DefaultKbLayout)^:=-1;то не прыгает..
NVK (2011-08-11 13:05:00) [2]проблема описана вполне реальная. Поясню: вот уже лет 9 пользуемся на конторе своей прогой, писаной еще в дельфях 6, потом перешли на 7, сейчас уже откомпилирована на 2010. проблемы начались, когда сменила систему на winServer2008 rus (лицензионная, локализованная). здесь же стоит и дельфя! В силу ряда причин пришлось указать по умолчанию язык = английский. Прогу время от времени приходится сопровождать. Собственно, о чем я: при переходе между гридами (или из textEdit - Grid) и обратно - сбрасывается раскладка клавиатуры на английскую! в массе мест это не актуально, а там, где очень нужно русский шрифт спас вариант следующего типа:
LoadKeyBoardlayout('00000419',KLF_ACTIVATE)- ''00000419' - русский, '00000409' - английский
sniknik (2011-05-05 13:00:00) [3]> Microsoft обратно не примет.
тоже сомневаюсь, но окончательный вывод делал бы после проверки... не микрософт, как вдруг какой нибудь Фленов "шутки шутит", и в какой нибудь используемой на компах сторонней программе в системные настройки пишет... ну, а чего? не используется же, давным давно, тогда дай ка под свои нужды приспособлю...
ну типа того.
Anatoly Podgoretsky (2011-05-05 11:52:00) [4]Microsoft обратно не примет.
sniknik (2011-05-05 11:35:00) [5]> попортил флаги на всех машинах в отдельно взятом здании
при чем тут флаги на машинах? в системе этот флаг не используется с вин 3.1, и как смотреть что именно в системе (убедится), я показывал, но ты смотреть не хочешь... хочешь "бла бла шоу".
проблема у тебя в том, что где то в генофонде (т.к. твой "код" пример, без кода, значит генофонд/подключаемые модули) в коде явно, независимо от параметра системы эта настройка переопределена.
> а сама программа ведёт себя правильно.
программу пишешь ты, значит она по определению неверна... я бы проверив флаг/вдруг это именно от системы, и нет "злодейского кода" (ну а вдруг? мало ли пишут, что не используется, мсдн тоже может ошибаться), просто вернул бы его взад, и все.
Savek (2011-05-05 10:21:00) [6]Ладно, убедил. Буду разъяснять юзерам, что какой-то злыдень попортил флаги на всех машинах в отдельно взятом здании, а сама программа ведёт себя правильно.
sniknik (2011-05-04 19:30:00) [7]> т.е. ты хочешь сказать, что под вин3.1 переключение раскладки клавиатуры при потере фокуса сеткой это нормальное поведение программы?
а разве нет? при включенном флаге "не поддержки" локальных символов, после того как дали хоть что то вводить, вернуть раскладку назад (тогда она вроде была одна на все приложения как в doc), очень правильно.
> его делали "правщики генофонда"
ты "глазки то разуй", прочитай то что сам же приводишь
> procedure TCustomDBGrid Eh.WMKillFocus(var Message: TWMKillFocus);
где тут правка генофонда? нормальный, честный компонент... не оскорбляй людей. пользуешься их трудом да еще и на них наговариваешь...
а защищаются они от таких... ну что ж молодцы. может сталкивались с теми кто кто этом флаг начал в других целях использовать... (вот если сами SysUtils в генофонде переписали, а после такие коментарии ставят... вот это было бы весело. а так просто не разобрались/не захотели что к чему, да и все)
Savek (2011-05-04 12:24:00) [8]обнаружил что с DBGridEh этого глюка нет, вероятно из-за того что его делали "правщики генофонда", вот процедура (коментарии оригинальные)
procedure TCustomDBGridEh.WMKillFocus(var Message: TWMKillFocus);
var
InvalidRect: TRect;
begin
if FSortMarking and
not ((InplaceEditor <> nil) and (Message.FocusedWnd = InplaceEditor.Handle)) then
begin
FSortMarking := False;
DoSortMarkingChanged;
end;
if HandleAllocated and (dgRowSelect in Options) then
begin
with inherited Selection do
InvalidRect := BoxRect(Left - FrozenCols, Top, Right, Bottom);
WindowsInvalidateRect(Handle, InvalidRect, False);
end;
if not SysLocale.FarEast
then inherited
else
begin
{
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;}
inherited;
{ This code switches layout to default language. This code is incorrect.
if not ((InplaceEditor <> nil) and (Message.FocusedWnd = InplaceEditor.Handle))
then ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);}
end;
// if not IsMyInplaceControlHandle(HWND(Message.WParam)) then
// ControlLeaveFocus;
if FSelectionActive <> IsSelectionActive then
begin
SelectionActiveChanged;
if (sebShowOnlyWhenGridActiveEh in EditButtonsShowOptions) and not
(sebShowOnlyForCurCellEh in EditButtonsShowOptions) and not
(sebShowOnlyForCurRowEh in EditButtonsShowOptions) then
Invalidate;
end;
if FInTitleFilterListboxVisible then
InTitleFilterListboxCloseUp(False);
end;
Savek (2011-05-04 12:05:00) [9]
> вот и выяснили... не запускай прогу на вин3.1! :)
т.е. ты хочешь сказать, что под вин3.1 переключение раскладки клавиатуры при потере фокуса сеткой это нормальное поведение программы?
sniknik (2011-05-03 17:18:00) [10]> А у кого ни будь еще подобное наблюдается?
ну, я таких не знаю/не нашел.
но наверное у злостных "правщиков" генофонда... (иначе зависело бы от того где выполняется, т.к. в нормальном виде переменная устанавливается из флагов системы. а тут, единожды скомпилированный, везде... явно константа)
Anatoly Podgoretsky (2011-05-03 16:49:00) [11]> sniknik (03.05.2011 16:40:31) [31]
А у кого ни будь еще подобное наблюдается?
sniknik (2011-05-03 16:40:00) [12]а читать совсем совсем не умеешь? или не хочешь? до разжёвывания...
[20]
Savek (2011-05-03 16:23:00) [13]
> правильнее думаю переменную от которой зависит (и не только
> это) явно пере прописать, раз оно у вас чем то "сбивается".
> и раз оно
а существует логическое объяснение - зачем оригиналу может понадобиться переключение раскладки? Зачем это изначально реализовано?
sniknik (2011-05-03 10:09:00) [14]> Не знаю, насколько это правильно
правильнее думаю переменную от которой зависит (и не только это) явно пере прописать, раз оно у вас чем то "сбивается".
и раз оно
> Так - то же самое, что и в XDBGrid.
чем генофонд править (а лучше найти, и "покарать ан..." того кто уже "правил" и намудрил с этой переменной, ну и убрать эту хрень), а то дождетесь что "карать" будет вас.
Дмитрий Белькевич (2011-05-03 09:45:00) [15]
> в оригинале D7 так
Так - то же самое, что и в XDBGrid.
Только что в XDBGrid в двух местах - еще и в самом редакторе.
> если не секрет как поправили?
А там же - смотри код в [19]. Прибил нафиг переключение. Не знаю, насколько это правильно, но самопереключающаяся раскладка - это совсем плохо.
Savek (2011-05-03 09:17:00) [16]
> Дмитрий Белькевич (02.05.11 12:39) [19]
> Ничего лучшего, как поправить сырцы не придумали
если не секрет как поправили?
Anatoly Podgoretsky (2011-05-02 14:50:00) [17]
> if not ((InplaceEditor <> nil) and
> (HWND(Message.WParam) = InplaceEditor.Handle)) then
> ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
>
Не будет создан. Надо специально переводить его в режим редактирования и только тогда для редактора будет назначен язык по умолчанию.
sniknik (2011-05-02 14:09:00) [18]> Если "if not ((InplaceEditor <> nil) and" не создается то и код установки кодовой страницы никогда не будет выполнен.
наоборот InplaceEditor <> nil будет фалсе, т.к. не создан и равен nil, "and" с фалсе со следующим тоже = фалсе, а not за скобками его "перевернет" в труе.
sniknik (2011-05-02 14:06:00) [19]> И не надо запусать InplaceEditor
ну и вообще то по коду, если он не создан, то код выполнится. т.е. главное все таки условие выше.
> значение которое выдает "больной"
хотя, мало ли, может кто после InitSysLocale где нибудь явно SysLocale.FarEast:= true; прописал...
Anatoly Podgoretsky (2011-05-02 13:59:00) [20]Если "if not ((InplaceEditor <> nil) and" не создается то и код установки кодовой страницы никогда не будет выполнен.
То что автор партизан сомнений нет