Противный сканер ...
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 8029
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
Противный сканер ...
Привет всем !
Столкнулся с интересной проблемой, точнее задачей.
Есть сканер штрих-кодов, которым в поля формы считывают различные штрих-коды, в т.ч. и символьные.
Все бы ничего, но сканер включен в разрыв клавиатуры и поток символов в поле зависит от текущей раскладки клавиатуры. Т.е. если включена RUS то вместо считанного английского "QWERTY" в поле попадает "ЙЦУКЕН" и т.д.
Это не есть хорошо. Можно принудительно включать английскую раскладку при выборе поля, но это раздражает оператора, т.к. он часть полей набирает по русски. Вопрос: существет ли алгоритм транскрипции русских букв в латинские в соответсвии с надписями на кнопках клавиатуры ? Я понимаю, что тупо написать его не сложно - но может быть есть общее решение ? Заранее спасибо !
Столкнулся с интересной проблемой, точнее задачей.
Есть сканер штрих-кодов, которым в поля формы считывают различные штрих-коды, в т.ч. и символьные.
Все бы ничего, но сканер включен в разрыв клавиатуры и поток символов в поле зависит от текущей раскладки клавиатуры. Т.е. если включена RUS то вместо считанного английского "QWERTY" в поле попадает "ЙЦУКЕН" и т.д.
Это не есть хорошо. Можно принудительно включать английскую раскладку при выборе поля, но это раздражает оператора, т.к. он часть полей набирает по русски. Вопрос: существет ли алгоритм транскрипции русских букв в латинские в соответсвии с надписями на кнопках клавиатуры ? Я понимаю, что тупо написать его не сложно - но может быть есть общее решение ? Заранее спасибо !
Make Clarion Great Again ! 
-
- ✯ Ветеран ✯
- Сообщения: 5159
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Противный сканер ...
Мое мнение. Либо тупо поставить соответствие между символами ('q' = 'й'), либо принудительно включать нужную раскладку при выборе поля формы (т.е. если поле должно быть латинским - то включать английскую, и наоборот). Есть winapi функция ActivateKeyboardLayout. Пример использования ее должен лежать на clarionlife.
We are hard at work… for you. 

- Игорь Столяров
- Ветеран движения
- Сообщения: 8029
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
Re: Противный сканер ...
Уф ! Да проблем с переключением раскладки клавиатуры нет. Если посмотреть мое первое сообщение - то там написано, почему этот способ не решает всех проблем. К тому же нужно учитывать, что в момент считывания штрих--кода раскладка клавиатуры может быть произвольной. Видимо действительно ничего не остается как вешать на Accept поля функцию поиска и замены русских символов на латинские. Сделаем - это не есть вопрос. Хотя если честно, мне не совсем понятен принцип такой работы. По идее сканер должен позвращать скан-коды считанных символов, и в них русская "й" и английская "q" - это разные символы. В каком месте происходит перекодировка - непонятно ...kreator писал(а):Мое мнение. Есть winapi функция ActivateKeyboardLayout.

Make Clarion Great Again ! 
Re: Противный сканер ...
Смею предположить, что если бы сканер(клавиатура) возвращали бы код именно символов, то в каждой стране бы было по своему вендору клавиатур, а так- просто наклеечки на кнопки шлёп- и ОС сама определяет символы.
Как вариант отловить факт, что в поле текст ввел сканер(а соответственно, что это английские буквы), а не пользователь, можно по скорости ввода- подозреваю, что сканер "набирает" за полу-секунду. Но это так себе решение, если честно(вдруг появятся скорострельные люди). По-грамотному, имхо, было бы сделать все коды в единой раскладке (en), это ж все-таки коды.
Как вариант отловить факт, что в поле текст ввел сканер(а соответственно, что это английские буквы), а не пользователь, можно по скорости ввода- подозреваю, что сканер "набирает" за полу-секунду. Но это так себе решение, если честно(вдруг появятся скорострельные люди). По-грамотному, имхо, было бы сделать все коды в единой раскладке (en), это ж все-таки коды.
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Противный сканер ...
Аппарат (сканер): ничего не подозревает о том, что он посылает низкоуровненые сканкоды символов в какой-то разрыв какой-то клавиатуры в какой-то там ещё раскладке...
а драйвер клавиатуры ничего не подозревает, что какой-то там сканер может вместо пользователя пожелать переключение раскладки, чтобы сканкоды с клавы интерпретировались только как аглицкие, либо там китайские символы.
Только программист знает, что в этом поле символы должны быть в какой-то определённой раскладке (в аглицкой - к примеру).
Поэтому только он и может/должен об этом позаботиться.
Выхода только 2 (либо/либо):
1) в этом поле перекодировка (можно вводить невидимым цветом шрифта - чтоб не пугать пользователя, а после перекодировки - сделанной при надобности - высвечивать в STRING видимого цвета)
2) при Event:Selected этого поля - переключать клаву насильно в латиницу (как было сказано kreator'ом выше), запоминая предыдущее состояние;
а потом при обработке Event:Accepted - возвращать клаву насильно в кириллицу, если запомненное состояние = кириллица.
(WinAPI-функции: LoadKeyboardLayout, ActivateKeyboardLayout)
(Ну на случай кликанья мышкой нужно запоминать какое поле было SELECTED ранее, и если новое EVENT:SELECTED пришло без EVENT:ACCEPTED этого сканерного поля - тоже возвращать клаву в прежнюю /запомненную/ раскладку.)
а драйвер клавиатуры ничего не подозревает, что какой-то там сканер может вместо пользователя пожелать переключение раскладки, чтобы сканкоды с клавы интерпретировались только как аглицкие, либо там китайские символы.
Только программист знает, что в этом поле символы должны быть в какой-то определённой раскладке (в аглицкой - к примеру).
Поэтому только он и может/должен об этом позаботиться.
Выхода только 2 (либо/либо):
1) в этом поле перекодировка (можно вводить невидимым цветом шрифта - чтоб не пугать пользователя, а после перекодировки - сделанной при надобности - высвечивать в STRING видимого цвета)
2) при Event:Selected этого поля - переключать клаву насильно в латиницу (как было сказано kreator'ом выше), запоминая предыдущее состояние;
а потом при обработке Event:Accepted - возвращать клаву насильно в кириллицу, если запомненное состояние = кириллица.
(WinAPI-функции: LoadKeyboardLayout, ActivateKeyboardLayout)
(Ну на случай кликанья мышкой нужно запоминать какое поле было SELECTED ранее, и если новое EVENT:SELECTED пришло без EVENT:ACCEPTED этого сканерного поля - тоже возвращать клаву в прежнюю /запомненную/ раскладку.)
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Re: Противный сканер ...
еще можно сконвертировать строку не переключая раскладки, для чего воспользоваться функцией WINAPI VkKeyScan для конвертации символа в код виртуальной клавиатуры, а затем получить заново сивол используя ф-ию ToAsciiEx передавая в качестве параметра dwhkl код раскладки полученный из упомянутой Вами ф-ии LoadKeyboardLayout.WadimZapara писал(а): ...
2) при Event:Selected этого поля - переключать клаву насильно в латиницу (как было сказано kreator'ом выше), запоминая предыдущее состояние;
а потом при обработке Event:Accepted - возвращать клаву насильно в кириллицу, если запомненное состояние = кириллица.
(WinAPI-функции: LoadKeyboardLayout, ActivateKeyboardLayout)
-
- ✯ Ветеран ✯
- Сообщения: 5159
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Противный сканер ...
Попробовал на своем сканере. Использую кодировку EAN-128. Для последовательностей, к примеру, 'qwertyuiop' и 'йцукенгшщз' штрихкод будет одинаковым. И это, видимо, заложено изначально туда, и никак не зависит ни от сканера, ни от типа его подключения. Поэтому есть две мысли.
1. Попробовать найти тип штрихкодирования, который бы учитывал символы (в частности unicode кодировку).
2. А автоматическое распознавание слова - вообще говоря нетривиальная задача. Мне, например, неясен критерий, как определять раскладку в слове. Маленький пример. Есть программа Punto switcher, автоматически переключает раскладку клавиатуры и, ко всему прочему, исправляет слова, набранные ошибочно. Я ее пользую постоянно. Так вот. Данная программа ошибается очень часто при попытке определить кодировку слова. Хорошо, что есть возможность отмены принудительной конвертации. Поэтому, может быть, вообще отказаться от штрихкодирования символов, заменить их цифровыми последовательностями. А?
1. Попробовать найти тип штрихкодирования, который бы учитывал символы (в частности unicode кодировку).
2. А автоматическое распознавание слова - вообще говоря нетривиальная задача. Мне, например, неясен критерий, как определять раскладку в слове. Маленький пример. Есть программа Punto switcher, автоматически переключает раскладку клавиатуры и, ко всему прочему, исправляет слова, набранные ошибочно. Я ее пользую постоянно. Так вот. Данная программа ошибается очень часто при попытке определить кодировку слова. Хорошо, что есть возможность отмены принудительной конвертации. Поэтому, может быть, вообще отказаться от штрихкодирования символов, заменить их цифровыми последовательностями. А?
We are hard at work… for you. 

- Игорь Столяров
- Ветеран движения
- Сообщения: 8029
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 96 раз
Re: Противный сканер ...
Гм. Как говорил Рокфеллер - если бы можно было прожить жизнь заново - то он бы все сделал сосвсем по другому, без всех этих проблем ...
Если бы я мог определять каким кодом и как кодировать серийные номера товаров - то проблем бы наверно и не было. Но приходится воспринимать их такими, какие они есть.
В общем-то проблему уже решил применением двух методов:
1. При выборе поля для ввода (считывания сканером штрих-кода) по SELECT - запоминаем текущую раскладку, переключаем на ENG, при потере полем фокуса - восстанавливаем текущую раскладку (если она была изменена).
2. Введенный в это поле код пропускаем по ACCEPT через элементарную процедуру перекодировки.
EncodeEN PROCEDURE (Str_)
Loc:Count LONG
Loc:Size LONG
Loc:Pos LONG
Loc:EN STRING('qwertyuiop[]asdfghjkl;''zxcvbnm,./QWERTYUIOP[]ASDFGHJKL;''ZXCVBNM,./') !
CODE
Loc:Size = Len(Clip(Str_))
Loop Loc:Count = 1 to Loc:Size by 1
Loc:Pos = InString(Str_[Loc:Count],'щЎєъхэу°∙чї·Ї√тряЁюыфц¤ ўёьшЄ№с■.╔╓╙╩┼═├╪┘╟╒┌╘█┬└╧╨╬╦─╞▌▀╫╤╠╚╥▄┴▐.')
If Loc:Pos then Str_[Loc:Count] = Loc:En[Loc:Pos].
end
Вот и все. Работает - проблем нет ...

В общем-то проблему уже решил применением двух методов:
1. При выборе поля для ввода (считывания сканером штрих-кода) по SELECT - запоминаем текущую раскладку, переключаем на ENG, при потере полем фокуса - восстанавливаем текущую раскладку (если она была изменена).
2. Введенный в это поле код пропускаем по ACCEPT через элементарную процедуру перекодировки.
EncodeEN PROCEDURE (Str_)
Loc:Count LONG
Loc:Size LONG
Loc:Pos LONG
Loc:EN STRING('qwertyuiop[]asdfghjkl;''zxcvbnm,./QWERTYUIOP[]ASDFGHJKL;''ZXCVBNM,./') !
CODE
Loc:Size = Len(Clip(Str_))
Loop Loc:Count = 1 to Loc:Size by 1
Loc:Pos = InString(Str_[Loc:Count],'щЎєъхэу°∙чї·Ї√тряЁюыфц¤ ўёьшЄ№с■.╔╓╙╩┼═├╪┘╟╒┌╘█┬└╧╨╬╦─╞▌▀╫╤╠╚╥▄┴▐.')
If Loc:Pos then Str_[Loc:Count] = Loc:En[Loc:Pos].
end
Вот и все. Работает - проблем нет ...

Make Clarion Great Again ! 