![]() |
| ||
|
|
Новости |
Поиск |
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. Кто нибудь сталкивался? Баг не смертельный, но в большом проекте напрягает..
sniknik (2011-05-02 13:55:00) [21]> И не надо запусать InplaceEditor
так он у него в "примере" и не создается никогда, в принципе, грид пустой ни к чему не подключенный, я почему в [9] и просил (одно из) чтобы был еще и заполненный, проверить с ним.
а вот теперь бы еще не помешало значение которое выдает "больной" по GetSystemMetrics(SM_DBCSENABLED), плюс ко всему.
Anatoly Podgoretsky (2011-05-02 13:47:00) [22]> sniknik (02.05.2011 13:37:20) [20]
И не надо запусать InplaceEditor
sniknik (2011-05-02 13:37:00) [23]> саппорт сказал - что и в оригинале так же, мы токо скопипастили.
в оригинале 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! :)
> Оригинал, впрочем не смотрел.
а посмотри
Дмитрий Белькевич (2011-05-02 12:39:00) [24]Скорее всего знаю этот баг. Он у нас на другом гриде проявляется, который писали из дбгрида.
У нас в этом месте:
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 11:06:00) [25]какие исследования, кто тебя просил их делать? тебе вроде как наоборот сказали, что твои выводы нафиг не нужны, если спрашиваешь. нужна только исходная информация, столько, чтобы хватило сделать свои... не одно действие.
(это как показать запись 1го промаха футболиста и сказать - вот правда плохо играет? надо его уволить, из-за него команда проигрывает...??? - а покажи ка другие моменты с его участием... и тут пошла "пурга", - я не судья, знаний мало, в футболе не разбираюсь...)
тебе что несколько доп компонентов на форму кинуть/одну строчку кода дописать знаний не хватает? тогда извини программирование не для тебя.
> но в большом проекте напрягает..
откуда взялся большой проект? может лучше обратится к тому кто его написал? пусть исправит.
Savek (2011-05-02 09:56:00) [26]На фундаментальное исследование у меня не хватает знаний, а тему создал всего лишь в надежде, что кто-то сталкивался с подобной проблемой и знает решение.
sniknik (2011-05-01 12:12:00) [27]> ничего не гарантирует.
+ ничего не проясняет. т.к. настолько "минималистский", что предлагает единственное действие, но выводы делаются совершенно однозначные, с указанием на "виновного" см. [9].
p.s. не люблю "авторских" выводов, вместо информации... в 99% случаях они либо врут("шутят"), либо ошибаются. в общем если ты сам знаешь "от чего", то зачем спрашивать, решить ты тогда тоже можешь сам (найти причину это 80% работы/знаний).
p.p.s. то, что автор вместо того чтобы положить еще несколько компонент, и сделать пару действий начинает доказывать, что он прав, только еще больше убеждает, что это "шутник".
Savek (2011-05-01 10:44:00) [28]
> ничего не гарантирует. может ты исковеркал генофонд, может
> еще чего...
генофонд не трогал - век воли не видать!
> вот у меня нет такой проблемы.
выложи куда нибудь архив с проектом и exe файлом
> и ты темнишь, не говоришь на скольких машинах и с какими
> осями и настройками-дополнениями тестировал...
оси в первом посте , машин две, сервиспаки сейчас не скажу, в понедельник буду в офисе отпишусь
KilkennyCat (2011-05-01 05:05:00) [29]
> если карма не позволяет скачать проект с депозита выкладываю
> код unit1.pas
а толку? то, что ты кинул пару стандартных компонент и все - ничего не гарантирует. может ты исковеркал генофонд, может еще чего...
вот у меня нет такой проблемы.
и ты темнишь, не говоришь на скольких машинах и с какими осями и настройками-дополнениями тестировал...
MsGuns (2011-04-29 14:32:00) [30]Барабашка
Savek (2011-04-29 13:46:00) [31]
> почему сетка? почему не кнопка? почему при потере фокуса
> а не при клике например? и т.д.
проблема проявилась в большом проекте, который обсуждать здесь нет смысла, а странное поведение удалось смоделировать на простом примере.
> И к бабке не ходить, что у него где-то мухляж с переключением
> раскладки, а при обработке событий перемещения фокуса из/в
> грид этот код дергается.
если карма не позволяет скачать проект с депозита выкладываю код 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 11:49:00) [32]И к бабке не ходить, что у него где-то мухляж с переключением раскладки, а при обработке событий перемещения фокуса из/в грид этот код дергается.
KilkennyCat (2011-04-29 00:33:00) [33]
> покупать 2010й ради проверки это как то слишком
ради этого не надо. да и работал я год на 2010-ой, небыло таких проблем
sniknik (2011-04-28 17:26:00) [34]> Т.е сетка теряя фокус переключает раскладку на ту которая по умочанию, если она отличалась и на этом "успокаивается".
почему сетка? почему не кнопка? почему при потере фокуса а не при клике например? и т.д.
если рядом с кнопкой положить к примеру едит/спидбатон (не берет фокуса)/и еще один с "ручной"(кодом) сменой фокуса/что то другое типа мемо и т.д., + переключение клавишами по табу, + не пустой грид, а отображающий данные (там инплейс едиты еще формируются) и т.д. ... в разных вариантах проверить в общем.
а то как то маловато данных для анализа. (может это вообще шутка такая, и код у кнопки как раз переключает раскладку. покупать 2010й ради проверки это как то слишком)
Anatoly Podgoretsky (2011-04-28 16:34:00) [35]
> Но в пределах одного приложения самопроизвольной
> смены раскладки быть не должно...
В нормальном не должно
oldman (2011-04-28 15:01:00) [36]
> Anatoly Podgoretsky © (28.04.11 14:19) [6]
Но в пределах одного приложения самопроизвольной
смены раскладки быть не должно...
> кликаем кнопку - вуаля! Опять русская раскладка!
А что в коде клика?
Anatoly Podgoretsky (2011-04-28 14:19:00) [37]> Savek (28.04.2011 12:50:05) [5]
В Виндоус каждое приложение независимо друг от друга, это не ДОС где одна
раскладка на все.
Чего проверять то, когда это не зависит от языка программирования и
поведение является нормальным для ОС, начиная как минимум с ХР
Или ты про что?
Savek (2011-04-28 12:50:00) [38]
> Зачем язык-то? Не язык надо, а, собственно, раскладку.
дествительно "помогло", только теперь раскладка скачет на английскую
> эксперимент описан не до конца... какая раскладка, когда
> взад в дбгрид фокус?
когда взад остаётся в русской.
Т.е сетка теряя фокус переключает раскладку на ту которая по умочанию, если она отличалась и на этом "успокаивается" .
Самому кажется бредом. У кого есть D2010 попробуйте смоделировать ситуацию
Styx (2011-04-28 11:09:00) [39]
> В региональных настройках установи язык по умолчанию английский
Зачем язык-то? Не язык надо, а, собственно, раскладку.
KilkennyCat (2011-04-28 09:48:00) [40]эксперимент описан не до конца... какая раскладка, когда взад в дбгрид фокус?