Вопрос по FormKeyDown [РЕШЕНО]
Модератор: Модераторы
Вопрос по FormKeyDown [РЕШЕНО]
Всем доброго. Работа со сканером штрих-кода (код- matrix).
В строке от сканера присутствуют заглавные и строчные символы, однако по FormKeyDown скан-коды для любого символа одинаковы.
С цифрами проблем нет.
Скан-коды меньше 30 превращаются в нечто непонятное...
В строке от сканера присутствуют заглавные и строчные символы, однако по FormKeyDown скан-коды для любого символа одинаковы.
С цифрами проблем нет.
Скан-коды меньше 30 превращаются в нечто непонятное...
Последний раз редактировалось Владимир 25.06.2023 14:40:16, всего редактировалось 1 раз.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
FormKeyPress(Sender: TObject; var Key: Char; Shift: TShiftState);
По описаниям должна давать символ с регистром. Попробуйте.
По описаниям должна давать символ с регистром. Попробуйте.
OnKeyDown / OnKeyUp грубо говоря ловят нажатия клавиш. То есть мы получаем коды нажатых клавиш, но ничего не знаем ни о языковой раскладке, ни о регистре. Соответственно в вашем случае нужно так же отлавливать состояние TShiftState и считывать текущую раскладку клавиатуры.
А вот в случае с onKeyPress вы получите распознанные символы с учетом регистра и раскладки и спецсимволы тоже можно обработать (if Key = #08)
В общем оба варианта вам подойдут на самом деле.
А вот в случае с onKeyPress вы получите распознанные символы с учетом регистра и раскладки и спецсимволы тоже можно обработать (if Key = #08)
В общем оба варианта вам подойдут на самом деле.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Поскольку у топикстартера не клавиатура, а сканер, то большой вопрос, будет ли работать TShiftState, поэтому я не стал о нем писать.WAYFARER писал(а):...отлавливать состояние TShiftState и считывать текущую раскладку клавиатуры.
Должно работать.Снег Север писал(а):Поскольку у топикстартера не клавиатура, а сканер, то большой вопрос, будет ли работать TShiftState, поэтому я не стал о нем писать.
Спасибо за ответ.WAYFARER писал(а):А вот в случае с onKeyPress вы получите распознанные символы с учетом регистра и раскладки и спецсимволы тоже можно обработать (if Key = #08)
Есть код matrix, 32 символа, в нем точно присутствует код 08.
Код: Выделить всё
procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
var
s:String;
begin
s:=Key;
case Key of
#00:s:='-00';
#01:s:='-01';
#02:s:='-02';
#03:s:='-03';
#04:s:='-04';
#05:s:='-05';
#06:s:='-06';
#07:s:='-07';
#08:s:='-08';
#09:s:='-09';
#10:s:='-10';
.....................
#254:s:='-254';
#255:s:='-255';
end;
inc(CntByte); //счетчик принятых байт
Memo1.Lines.add(IntToStr(CntByte)+' '+s);
end;
Наводит на мысль что сканер тупо не отправляет BS. Сканер в режиме клавиатуры отправляет уже декодированные данные. Подозреваю, что происходит это так - сканер считывает 32 символа, обрабатывает bs, смещаясь на 1 символ назад и отправляет готовый результат длиной 31.
Проверить не сложно. Сгенерируйте код с числовой последовательностью и в середину засуньте BS, если при сканировании последовательности нарушится, то все работает именно так как я предположил.
Проверить не сложно. Сгенерируйте код с числовой последовательностью и в середину засуньте BS, если при сканировании последовательности нарушится, то все работает именно так как я предположил.
Есть утилита на с, которая считывает данные сканера и пишет рез-ты в файл (последовательность байтов). Там честно 32 и код 08 присутствует!WAYFARER писал(а): все работает именно так как я предположил
В целом стоит задача принять со сканера байты и передать их дальше.
Добавлено спустя 9 минут 3 секунды:
Вот мой вывод по KeyDown все числовые символы совпадают с оригиналом, другие -по-разному
Код: Выделить всё
20 54 36
№ byt
21 82 shift (ssShift in Shift)
22 76 в оригинале 108
23 76 shift
24 89 121
25 119 в оригинале 08
26 57
27 51
28 90 shift
29 57
30 57
31 81 в оригинале 113
32 13 Вот полный вывод последнего куска (в предыдущем игнорировался код 16 )
Код: Выделить всё
№ byte
19 53
20 54
21 16 shift
22 82 shift
23 76
24 16 shift
25 76 shift в оригинале 108
26 89 в оригинале 121
27 119 в оригинале 08
28 57
29 51
30 16 shift
31 90 shift
32 57
33 57
34 81 в оригинале 113
35 13
А как в ней взаимодействие со сканеров реализовано?Владимир писал(а):Есть утилита на с, которая считывает данные сканера и пишет рез-ты в файл (последовательность байтов).
Добавлено спустя 28 минут 58 секунд:
А если вот так?
Код: Выделить всё
program test;
uses Crt,SysUtils;
var
key : char;
i: integer = 0;
s:string;
begin
repeat
key:=ReadKey;
case Key of
#08:s:='-08';
end;
inc(i);
writeln(Inttostr(i)+s);
until key=#27 {Esc}
end.
Мысль.
Добавлено спустя 9 минут 42 секунды:
Экспериментировать в терминальном текстовом режиме? Это плохо
Добавлено спустя 9 минут 42 секунды:
Экспериментировать в терминальном текстовом режиме? Это плохо
не обязательно в текстовом. Это ленивый я максимально быстро пример накидал.Владимир писал(а):Экспериментировать в терминальном текстовом режиме? Это плохо
А в какое, пардон, место коды сканера будут приходить?
А в чем принциальная разница? Работайте точно так же как работали с событиями. получайте и передавайте дальше куда надо.Владимир писал(а):А в какое, пардон, место коды сканера будут приходить?
В данном примере мы напрямую читаем буфер клавиатуры без всяких gtk/qt и прочего.
Скорее всего в вашей утиллите на С используется тот же самый метод.
Я не отметил, что сканер USB. Тем не менее, Ваш пример написал в консоли на ТурбоПаскале.WAYFARER писал(а):В данном примере мы напрямую читаем буфер клавиатуры без всяких gtk/qt и прочего.
Вывод всех кодов символов посылки со сканера правильный, исключая 08, вместо него два кода - 0 и 66.
Разбираться далее нет сил и времени. Спасибо.
В цикле сканирования клавиш должна быть пауза, хотя бы миллесекунда, иначе такой код грузит ядро процессора под сотку.
