Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.pas
unit 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 обратно не примет.
тоже сомневаюсь, но окончательный вывод делал бы после проверки... не микрософт, как вдруг какой нибудь Фленов "шутки шутит", и в какой нибудь используемой на компах сторонней программе в системные настройки пишет... ну, а чего? не используется же, давным давно, тогда дай ка под свои нужды приспособлю...
ну типа того.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.006 c
2-1314555725
Mu
2011-08-28 22:22
2011.12.11
Функция и 2 массива.


15-1314217798
Юрий
2011-08-25 00:29
2011.12.11
С днем рождения ! 25 августа 2011 четверг


2-1313944939
анонимус
2011-08-21 20:42
2011.12.11
(Y:=0.3*R+0.59*G+0.11*B)


2-1314608210
Аркстант
2011-08-29 12:56
2011.12.11
Navigate2 в фрейме


15-1313756695
Медвежонок Пятачок
2011-08-19 16:24
2011.12.11
JavaScript (Sencha ExtJS)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский