Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];
ВнизСмена раскладки клавиатуры на русский Найти похожие ветки
← →
Savek (2011-04-27 17:07) [0]Столкнулся с проблемой: При потере фокуса DBGrid-ом раскладка клавиатуры переключается на русскую... Проект и откомпилированный модуль (D2010) можно посмотреть здесь http://depositfiles.com/files/by8o591pq
Хотя смотреть особо нечего: в Delphi 2010 File-New-VCL Application -Delphi
На форму кидаю DBGrid, Button, запускаю. Чудеса проявляются так: кликаем по сетке, переключаем на английскую раскладку, кликаем кнопку - вуаля! Опять русская раскладка! Проверял на XP и win7. Кто нибудь сталкивался? Баг не смертельный, но в большом проекте напрягает..
← →
Anatoly Podgoretsky © (2011-04-27 19:02) [1]> Savek (27.04.2011 17:07:00) [0]
В региональных настройках установи язык по умолчанию английский.
← →
Savek (2011-04-28 09:42) [2]не помогает. Но даже если бы и помогло, такой способ вряд ли кого-то устроит.
← →
KilkennyCat © (2011-04-28 09:48) [3]эксперимент описан не до конца... какая раскладка, когда взад в дбгрид фокус?
← →
Styx (2011-04-28 11:09) [4]
> В региональных настройках установи язык по умолчанию английский
Зачем язык-то? Не язык надо, а, собственно, раскладку.
← →
Savek (2011-04-28 12:50) [5]
> Зачем язык-то? Не язык надо, а, собственно, раскладку.
дествительно "помогло", только теперь раскладка скачет на английскую
> эксперимент описан не до конца... какая раскладка, когда
> взад в дбгрид фокус?
когда взад остаётся в русской.
Т.е сетка теряя фокус переключает раскладку на ту которая по умочанию, если она отличалась и на этом "успокаивается" .
Самому кажется бредом. У кого есть D2010 попробуйте смоделировать ситуацию
← →
Anatoly Podgoretsky © (2011-04-28 14:19) [6]> Savek (28.04.2011 12:50:05) [5]
В Виндоус каждое приложение независимо друг от друга, это не ДОС где одна
раскладка на все.
Чего проверять то, когда это не зависит от языка программирования и
поведение является нормальным для ОС, начиная как минимум с ХР
Или ты про что?
← →
oldman © (2011-04-28 15:01) [7]
> Anatoly Podgoretsky © (28.04.11 14:19) [6]
Но в пределах одного приложения самопроизвольной
смены раскладки быть не должно...
> кликаем кнопку - вуаля! Опять русская раскладка!
А что в коде клика?
← →
Anatoly Podgoretsky © (2011-04-28 16:34) [8]
> Но в пределах одного приложения самопроизвольной
> смены раскладки быть не должно...
В нормальном не должно
← →
sniknik © (2011-04-28 17:26) [9]> Т.е сетка теряя фокус переключает раскладку на ту которая по умочанию, если она отличалась и на этом "успокаивается".
почему сетка? почему не кнопка? почему при потере фокуса а не при клике например? и т.д.
если рядом с кнопкой положить к примеру едит/спидбатон (не берет фокуса)/и еще один с "ручной"(кодом) сменой фокуса/что то другое типа мемо и т.д., + переключение клавишами по табу, + не пустой грид, а отображающий данные (там инплейс едиты еще формируются) и т.д. ... в разных вариантах проверить в общем.
а то как то маловато данных для анализа. (может это вообще шутка такая, и код у кнопки как раз переключает раскладку. покупать 2010й ради проверки это как то слишком)
← →
KilkennyCat © (2011-04-29 00:33) [10]
> покупать 2010й ради проверки это как то слишком
ради этого не надо. да и работал я год на 2010-ой, небыло таких проблем
← →
MsGuns © (2011-04-29 11:49) [11]И к бабке не ходить, что у него где-то мухляж с переключением раскладки, а при обработке событий перемещения фокуса из/в грид этот код дергается.
← →
Savek (2011-04-29 13:46) [12]
> почему сетка? почему не кнопка? почему при потере фокуса
> а не при клике например? и т.д.
проблема проявилась в большом проекте, который обсуждать здесь нет смысла, а странное поведение удалось смоделировать на простом примере.
> И к бабке не ходить, что у него где-то мухляж с переключением
> раскладки, а при обработке событий перемещения фокуса из/в
> грид этот код дергается.
если карма не позволяет скачать проект с депозита выкладываю код unit1.pasunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
никакого рукописного кода, только автоматически созданный при помещении на форму двух компонентов
← →
MsGuns © (2011-04-29 14:32) [13]Барабашка
← →
KilkennyCat © (2011-05-01 05:05) [14]
> если карма не позволяет скачать проект с депозита выкладываю
> код unit1.pas
а толку? то, что ты кинул пару стандартных компонент и все - ничего не гарантирует. может ты исковеркал генофонд, может еще чего...
вот у меня нет такой проблемы.
и ты темнишь, не говоришь на скольких машинах и с какими осями и настройками-дополнениями тестировал...
← →
Savek (2011-05-01 10:44) [15]
> ничего не гарантирует. может ты исковеркал генофонд, может
> еще чего...
генофонд не трогал - век воли не видать!
> вот у меня нет такой проблемы.
выложи куда нибудь архив с проектом и exe файлом
> и ты темнишь, не говоришь на скольких машинах и с какими
> осями и настройками-дополнениями тестировал...
оси в первом посте , машин две, сервиспаки сейчас не скажу, в понедельник буду в офисе отпишусь
← →
sniknik © (2011-05-01 12:12) [16]> ничего не гарантирует.
+ ничего не проясняет. т.к. настолько "минималистский", что предлагает единственное действие, но выводы делаются совершенно однозначные, с указанием на "виновного" см. [9].
p.s. не люблю "авторских" выводов, вместо информации... в 99% случаях они либо врут("шутят"), либо ошибаются. в общем если ты сам знаешь "от чего", то зачем спрашивать, решить ты тогда тоже можешь сам (найти причину это 80% работы/знаний).
p.p.s. то, что автор вместо того чтобы положить еще несколько компонент, и сделать пару действий начинает доказывать, что он прав, только еще больше убеждает, что это "шутник".
← →
Savek (2011-05-02 09:56) [17]На фундаментальное исследование у меня не хватает знаний, а тему создал всего лишь в надежде, что кто-то сталкивался с подобной проблемой и знает решение.
← →
sniknik © (2011-05-02 11:06) [18]какие исследования, кто тебя просил их делать? тебе вроде как наоборот сказали, что твои выводы нафиг не нужны, если спрашиваешь. нужна только исходная информация, столько, чтобы хватило сделать свои... не одно действие.
(это как показать запись 1го промаха футболиста и сказать - вот правда плохо играет? надо его уволить, из-за него команда проигрывает...??? - а покажи ка другие моменты с его участием... и тут пошла "пурга", - я не судья, знаний мало, в футболе не разбираюсь...)
тебе что несколько доп компонентов на форму кинуть/одну строчку кода дописать знаний не хватает? тогда извини программирование не для тебя.
> но в большом проекте напрягает..
откуда взялся большой проект? может лучше обратится к тому кто его написал? пусть исправит.
← →
Дмитрий Белькевич (2011-05-02 12:39) [19]Скорее всего знаю этот баг. Он у нас на другом гриде проявляется, который писали из дбгрида.
У нас в этом месте:
procedure TXInplaceEditList.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 TXCustomDBGrid.WMKillFocus(var Message: TMessage);
begin
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;
inherited;
if FNeedRestoreImeName then
{if not ((InplaceEditor <> nil) and
(HWND(Message.WParam) = InplaceEditor.Handle)) then
ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);}
end;
Ничего лучшего, как поправить сырцы не придумали, саппорт сказал - что и в оригинале так же, мы токо скопипастили. Оригинал, впрочем не смотрел.
← →
sniknik © (2011-05-02 13:37) [20]> саппорт сказал - что и в оригинале так же, мы токо скопипастили.
в оригинале D7 такprocedure TCustomDBGrid.WMKillFocus(var Message: TMessage);
begin
if not SysLocale.FarEast then inherited
else
begin
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;
inherited;
if not ((InplaceEditor <> nil) and
(HWND(Message.WParam) = InplaceEditor.Handle)) then
ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
end;
end;
т.е. все зависит отSysLocale.FarEast:= GetSystemMetrics(SM_DBCSENABLED) <> 0;
и
+
SM_DBCSENABLED - Флаг использования символов, состоящих из двух байт (используется в тех языках, где для представления всех символов не хватает 8-разрядной сетки). Эта константа определена только для Windows версии 3.1
вот и выяснили... не запускай прогу на вин3.1! :)
> Оригинал, впрочем не смотрел.
а посмотри
← →
Anatoly Podgoretsky © (2011-05-02 13:47) [21]> sniknik (02.05.2011 13:37:20) [20]
И не надо запусать InplaceEditor
← →
sniknik © (2011-05-02 13:55) [22]> И не надо запусать InplaceEditor
так он у него в "примере" и не создается никогда, в принципе, грид пустой ни к чему не подключенный, я почему в [9] и просил (одно из) чтобы был еще и заполненный, проверить с ним.
а вот теперь бы еще не помешало значение которое выдает "больной" по GetSystemMetrics(SM_DBCSENABLED), плюс ко всему.
← →
Anatoly Podgoretsky © (2011-05-02 13:59) [23]Если "if not ((InplaceEditor <> nil) and" не создается то и код установки кодовой страницы никогда не будет выполнен.
То что автор партизан сомнений нет
← →
sniknik © (2011-05-02 14:06) [24]> И не надо запусать InplaceEditor
ну и вообще то по коду, если он не создан, то код выполнится. т.е. главное все таки условие выше.
> значение которое выдает "больной"
хотя, мало ли, может кто после InitSysLocale где нибудь явно SysLocale.FarEast:= true; прописал...
← →
sniknik © (2011-05-02 14:09) [25]> Если "if not ((InplaceEditor <> nil) and" не создается то и код установки кодовой страницы никогда не будет выполнен.
наоборот InplaceEditor <> nil будет фалсе, т.к. не создан и равен nil, "and" с фалсе со следующим тоже = фалсе, а not за скобками его "перевернет" в труе.
← →
Anatoly Podgoretsky © (2011-05-02 14:50) [26]
> if not ((InplaceEditor <> nil) and
> (HWND(Message.WParam) = InplaceEditor.Handle)) then
> ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
>
Не будет создан. Надо специально переводить его в режим редактирования и только тогда для редактора будет назначен язык по умолчанию.
← →
Savek (2011-05-03 09:17) [27]
> Дмитрий Белькевич (02.05.11 12:39) [19]
> Ничего лучшего, как поправить сырцы не придумали
если не секрет как поправили?
← →
Дмитрий Белькевич (2011-05-03 09:45) [28]
> в оригинале D7 так
Так - то же самое, что и в XDBGrid.
Только что в XDBGrid в двух местах - еще и в самом редакторе.
> если не секрет как поправили?
А там же - смотри код в [19]. Прибил нафиг переключение. Не знаю, насколько это правильно, но самопереключающаяся раскладка - это совсем плохо.
← →
sniknik © (2011-05-03 10:09) [29]> Не знаю, насколько это правильно
правильнее думаю переменную от которой зависит (и не только это) явно пере прописать, раз оно у вас чем то "сбивается".
и раз оно
> Так - то же самое, что и в XDBGrid.
чем генофонд править (а лучше найти, и "покарать ан..." того кто уже "правил" и намудрил с этой переменной, ну и убрать эту хрень), а то дождетесь что "карать" будет вас.
← →
Savek (2011-05-03 16:23) [30]
> правильнее думаю переменную от которой зависит (и не только
> это) явно пере прописать, раз оно у вас чем то "сбивается".
> и раз оно
а существует логическое объяснение - зачем оригиналу может понадобиться переключение раскладки? Зачем это изначально реализовано?
← →
sniknik © (2011-05-03 16:40) [31]а читать совсем совсем не умеешь? или не хочешь? до разжёвывания...
[20]
← →
Anatoly Podgoretsky © (2011-05-03 16:49) [32]> sniknik (03.05.2011 16:40:31) [31]
А у кого ни будь еще подобное наблюдается?
← →
sniknik © (2011-05-03 17:18) [33]> А у кого ни будь еще подобное наблюдается?
ну, я таких не знаю/не нашел.
но наверное у злостных "правщиков" генофонда... (иначе зависело бы от того где выполняется, т.к. в нормальном виде переменная устанавливается из флагов системы. а тут, единожды скомпилированный, везде... явно константа)
← →
Savek (2011-05-04 12:05) [34]
> вот и выяснили... не запускай прогу на вин3.1! :)
т.е. ты хочешь сказать, что под вин3.1 переключение раскладки клавиатуры при потере фокуса сеткой это нормальное поведение программы?
← →
Savek (2011-05-04 12:24) [35]обнаружил что с 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;
← →
sniknik © (2011-05-04 19:30) [36]> т.е. ты хочешь сказать, что под вин3.1 переключение раскладки клавиатуры при потере фокуса сеткой это нормальное поведение программы?
а разве нет? при включенном флаге "не поддержки" локальных символов, после того как дали хоть что то вводить, вернуть раскладку назад (тогда она вроде была одна на все приложения как в doc), очень правильно.
> его делали "правщики генофонда"
ты "глазки то разуй", прочитай то что сам же приводишь
> procedure TCustomDBGridEh.WMKillFocus(var Message: TWMKillFocus);
где тут правка генофонда? нормальный, честный компонент... не оскорбляй людей. пользуешься их трудом да еще и на них наговариваешь...
а защищаются они от таких... ну что ж молодцы. может сталкивались с теми кто кто этом флаг начал в других целях использовать... (вот если сами SysUtils в генофонде переписали, а после такие коментарии ставят... вот это было бы весело. а так просто не разобрались/не захотели что к чему, да и все)
← →
Savek (2011-05-05 10:21) [37]Ладно, убедил. Буду разъяснять юзерам, что какой-то злыдень попортил флаги на всех машинах в отдельно взятом здании, а сама программа ведёт себя правильно.
← →
sniknik © (2011-05-05 11:35) [38]> попортил флаги на всех машинах в отдельно взятом здании
при чем тут флаги на машинах? в системе этот флаг не используется с вин 3.1, и как смотреть что именно в системе (убедится), я показывал, но ты смотреть не хочешь... хочешь "бла бла шоу".
проблема у тебя в том, что где то в генофонде (т.к. твой "код" пример, без кода, значит генофонд/подключаемые модули) в коде явно, независимо от параметра системы эта настройка переопределена.
> а сама программа ведёт себя правильно.
программу пишешь ты, значит она по определению неверна... я бы проверив флаг/вдруг это именно от системы, и нет "злодейского кода" (ну а вдруг? мало ли пишут, что не используется, мсдн тоже может ошибаться), просто вернул бы его взад, и все.
← →
Anatoly Podgoretsky © (2011-05-05 11:52) [39]Microsoft обратно не примет.
← →
sniknik © (2011-05-05 13:00) [40]> Microsoft обратно не примет.
тоже сомневаюсь, но окончательный вывод делал бы после проверки... не микрософт, как вдруг какой нибудь Фленов "шутки шутит", и в какой нибудь используемой на компах сторонней программе в системные настройки пишет... ну, а чего? не используется же, давным давно, тогда дай ка под свои нужды приспособлю...
ну типа того.
← →
NVK © (2011-08-11 13:05) [41]проблема описана вполне реальная. Поясню: вот уже лет 9 пользуемся на конторе своей прогой, писаной еще в дельфях 6, потом перешли на 7, сейчас уже откомпилирована на 2010. проблемы начались, когда сменила систему на winServer2008 rus (лицензионная, локализованная). здесь же стоит и дельфя! В силу ряда причин пришлось указать по умолчанию язык = английский. Прогу время от времени приходится сопровождать. Собственно, о чем я: при переходе между гридами (или из textEdit - Grid) и обратно - сбрасывается раскладка клавиатуры на английскую! в массе мест это не актуально, а там, где очень нужно русский шрифт спас вариант следующего типа:
LoadKeyBoardlayout("00000419",KLF_ACTIVATE) - ""00000419" - русский, "00000409" - английский
← →
GMasta (2011-09-01 19:57) [42]Сам столкнулся с данной проблемой и нагуглил вот что:
Лечение "прыгающей раскладки"
В юникодовских делфях иногда встречается косяк "прыгающей раскладки" при переходе между контролами..лечить методом Application.NonBiDiKeyboard:="00000419"; приведет к тормозам с получением фокуса контролом...а вот если в dpr добавить PInteger(@Screen.DefaultKbLayout)^:=-1; то не прыгает..
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.004 c