FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9177
Вход
Переключение раскладки клавиатуры в Grid

Проблема: при вводе данных оператором в числовом поле точка (разделитель разрядов) на правой цифровой клавиатуре (ПЦК), при ее русской раскладке, не ставиться. Приходится переключаться, а это их (операторов) нервирует и тормозит работу.


 
Прислал: Каратаев   Категория: Разное


Переключение раскладки клавиатуры в Grid

Переключение раскладки клавиатуры в Grid
Проблема: при вводе данных оператором в числовом поле точка (разделитель разрядов)
на правой цифровой клавиатуре (ПЦК), при ее русской раскладке, не ставиться.
Приходится переключаться, а это их (операторов) нервирует и тормозит работу.
Причем столкнулся с тем, что на некоторых машинах наоборот - точка на ПЦК
не ставиться именно при английской раскладке... не стал вникать почему (ну
не ставиться да и бог с ней)
На конференции часто встречаются вопросы по этому поводу,
а тут и мне заказчики задали задачу: "А нельзя ли...?"
Ну, естественно можно. И сделал так:
(Сразу оговорюсь, что сам ничего не придумал, все взято из материалов конференции)
*=======================================================
* В программе перед открытием формы
PRIVATE cRasklad, cRaskladDef
store '00000409' TO cRasklad && раскладка клавиатуры в числовом поле = En
store '00000419' TO cRaskladDef && раскладка клавиатуры по умолчанию = Ru
* на самом же деле эти значения я храню в ini-файле и юзер может их настроить
* под свою машину
*
* Дальше открываем форму
DO Form Форма_с_Гридом
*=======================================================
* В событии AfterRowColChange для Grid пишу:
LPARAMETERS nColIndex
DO CASE
CASE TYPE(SYS(18)) = "N"
DO a_keyb WITH 0
OTHERWISE
DO a_keyb WITH 1
ENDCASE
*=======================================================
* Вот и все.
* Пардон, забыл про a_keyb.prg, вот он:
* (Это как раз то, что я и взял из материалов конференции)
********************************
* Файл a_keyb.prg
********************************
PARAMETERS tVid
DECLARE INTEGER GetKeyboardLayoutName IN win32api STRING cKeyboard
DECLARE INTEGER LoadKeyboardLayout IN win32api STRING cp1, INTEGER np2
cKeyboard = space(100)
GetKeyboardLayoutName(@cKeyboard)

DO CASE
CASE tVid = 0 && переключить для числ. поля
if m.cKeyboard # cRasklad
LoadKeyboardLayout( cRasklad, 1)
ENDIF
CASE tVid = 1 && вернуть по умолчанию
LoadKeyboardLayout( cRaskladDef, 1)
ENDCASE
Clear DLLs GetKeyboardLayoutName,LoadKeyboardLayout
return
*******************************************
И все. Никакого торможения работы в форме я не заметил.
К сожалению не нашел метод в Форме, который бы вроде
AfterRowColChange для Grid отслеживал изменения фокусировки
объектов Формы. А в каждом объекте писать проверку что то не
хочется.
Буду рад всем замечаниям и подсказкам. Раз проблема есть,
то совместными усилиями можем получить ее нормальное разрешение.
А все, что выше, - это лишь одна из попыток.

С уважением Каратаев ddw2@yandex.ru

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.875)
Дополнения пользователей
Переключение раскладки клавиатуры в Grid
[+][?]
Владимир Максимов
14.08.02 13:04:15

Лично я с той же целью создал класс на основе TextBox и делаю перехват нажатой клавиши в его
событии KeyPress, заменяя его на нужный символ.

Далее вставляю в соответсвующую колонку экземпляр этого класса.

Ну, а поскольку, как правило, эта проблема возникает при вводе денежных сумм, то во всех случаях
где требуется я использую этот класс.

А вообще-то, разные способы решения приведены здесь

http://nsvisual.com/fox2/sol/index.php?act=view&id=62

Данное решение - это адаптация одного из перечисленных там способов к конкретной задаче. Впрочем,
достаточно грамотно сделанное.

Хочу только заметить, что команда CLEAR DLLS с указанием конкретной библиотеки не сработает в
версиях младше 7. Т.е. из памяти будут очищены не конкретно эти 2 библиотеки, а вообще все ранее
определенные функции DLL (для проверки можно воспользоваться командой DISPLAY DLLS).
Александр
14.08.02 14:58:38

Конечно адаптация. Я ведь и оговорил, что все взял из материалов конференции.
А если колонки и все остальные свойства Grid определять программно, то для меня, например,
сложновато добавить свой TextBox, чтобы потом определить его в CurrentControl. Тут, мне кажется
проще одним махом.
Зато TextBox с перехватом KeyPress наверное незаменим в формах без Grid.
Alexander Zabotin
20.08.02 18:00:57

Ребята, а чем плох
on key label ',' keyboard '.' plain
?
Работает ведь...
Александр
21.08.02 05:57:33

Но ведь в других полях может быть и надо поставить именно запятую. Т.е. все-равно надо проверять
что это за поле - текстовое или числовое. Так, что думаю в общем случае простой on key label не
пойдет. Надо навешивать кучу условий.
Alexander Zabotin
21.08.02 12:34:46

Ну, тогда можно и так:
on key label ',' do hitchpress.prg

procedure hitchpress

Alexander Zabotin
21.08.02 12:38:33

Ну, тогда можно и так:
on key label ',' do hitchpress.prg

procedure hitchpress
 if type(sys('18')) == 'N'
  keyboard "." plain
 else
  keyboard "," plain
return

Все равно это по-моему проще, да и hitchpress.prg отдельным файлом - везде использовать можно...
Александр
26.08.02 07:09:07

А вот у меня, почему-то через on key label не работает. Вернее работает не так, как надо. Стоит
мне нажать точку на клаве, сразу целые числа обнуляются и остаются только десятичные!
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика