Вопрос по FormKeyDown [РЕШЕНО]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Вопрос по FormKeyDown [РЕШЕНО]

Сообщение Владимир » 31.05.2023 11:31:32

Всем доброго. Работа со сканером штрих-кода (код- matrix).
В строке от сканера присутствуют заглавные и строчные символы, однако по FormKeyDown скан-коды для любого символа одинаковы.
С цифрами проблем нет.
Скан-коды меньше 30 превращаются в нечто непонятное...
Последний раз редактировалось Владимир 25.06.2023 15:40:16, всего редактировалось 1 раз.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Вопрос по FormKeyDown

Сообщение Снег Север » 31.05.2023 13:11:15

FormKeyPress(Sender: TObject; var Key: Char; Shift: TShiftState);
По описаниям должна давать символ с регистром. Попробуйте.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3039
Зарегистрирован: 27.11.2007 16:14:47

Re: Вопрос по FormKeyDown

Сообщение WAYFARER » 31.05.2023 17:23:06

OnKeyDown / OnKeyUp грубо говоря ловят нажатия клавиш. То есть мы получаем коды нажатых клавиш, но ничего не знаем ни о языковой раскладке, ни о регистре. Соответственно в вашем случае нужно так же отлавливать состояние TShiftState и считывать текущую раскладку клавиатуры.

А вот в случае с onKeyPress вы получите распознанные символы с учетом регистра и раскладки и спецсимволы тоже можно обработать (if Key = #08)

В общем оба варианта вам подойдут на самом деле.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Вопрос по FormKeyDown

Сообщение Снег Север » 31.05.2023 17:35:55

WAYFARER писал(а):...отлавливать состояние TShiftState и считывать текущую раскладку клавиатуры.

Поскольку у топикстартера не клавиатура, а сканер, то большой вопрос, будет ли работать TShiftState, поэтому я не стал о нем писать.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3039
Зарегистрирован: 27.11.2007 16:14:47

Re: Вопрос по FormKeyDown

Сообщение WAYFARER » 31.05.2023 22:18:01

Снег Север писал(а):Поскольку у топикстартера не клавиатура, а сканер, то большой вопрос, будет ли работать TShiftState, поэтому я не стал о нем писать.

Должно работать.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Вопрос по FormKeyDown

Сообщение Владимир » 01.06.2023 09:40:00

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;

При сканировании получаю 31 символ (цифры и буквы) без 08, но при нажатии BackSpace честно получаю 08
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Вопрос по FormKeyDown

Сообщение WAYFARER » 01.06.2023 11:02:40

Наводит на мысль что сканер тупо не отправляет BS. Сканер в режиме клавиатуры отправляет уже декодированные данные. Подозреваю, что происходит это так - сканер считывает 32 символа, обрабатывает bs, смещаясь на 1 символ назад и отправляет готовый результат длиной 31.
Проверить не сложно. Сгенерируйте код с числовой последовательностью и в середину засуньте BS, если при сканировании последовательности нарушится, то все работает именно так как я предположил.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Вопрос по FormKeyDown

Сообщение Владимир » 01.06.2023 12:06:37

WAYFARER писал(а): все работает именно так как я предположил

Есть утилита на с, которая считывает данные сканера и пишет рез-ты в файл (последовательность байтов). Там честно 32 и код 08 присутствует!
В целом стоит задача принять со сканера байты и передать их дальше.

Добавлено спустя 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


Добавлено спустя 20 минут 17 секунд:
Вот полный вывод последнего куска (в предыдущем игнорировался код 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

Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Вопрос по FormKeyDown

Сообщение WAYFARER » 01.06.2023 14:10:25

Владимир писал(а):Есть утилита на с, которая считывает данные сканера и пишет рез-ты в файл (последовательность байтов).

А как в ней взаимодействие со сканеров реализовано?

Добавлено спустя 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.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Вопрос по FormKeyDown

Сообщение Владимир » 01.06.2023 15:51:18

Мысль.

Добавлено спустя 9 минут 42 секунды:
Экспериментировать в терминальном текстовом режиме? Это плохо
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Вопрос по FormKeyDown

Сообщение WAYFARER » 01.06.2023 16:46:26

Владимир писал(а):Экспериментировать в терминальном текстовом режиме? Это плохо

не обязательно в текстовом. Это ленивый я максимально быстро пример накидал.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Вопрос по FormKeyDown

Сообщение Владимир » 01.06.2023 16:50:09

А в какое, пардон, место коды сканера будут приходить?
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Вопрос по FormKeyDown

Сообщение WAYFARER » 02.06.2023 09:27:34

Владимир писал(а):А в какое, пардон, место коды сканера будут приходить?

А в чем принциальная разница? Работайте точно так же как работали с событиями. получайте и передавайте дальше куда надо.
В данном примере мы напрямую читаем буфер клавиатуры без всяких gtk/qt и прочего.
Скорее всего в вашей утиллите на С используется тот же самый метод.
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 537
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Вопрос по FormKeyDown

Сообщение Владимир » 03.06.2023 21:55:27

WAYFARER писал(а):В данном примере мы напрямую читаем буфер клавиатуры без всяких gtk/qt и прочего.

Я не отметил, что сканер USB. Тем не менее, Ваш пример написал в консоли на ТурбоПаскале.
Вывод всех кодов символов посылки со сканера правильный, исключая 08, вместо него два кода - 0 и 66.
Разбираться далее нет сил и времени. Спасибо.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Вопрос по FormKeyDown

Сообщение Сквозняк » 04.06.2023 08:29:47

В цикле сканирования клавиш должна быть пауза, хотя бы миллесекунда, иначе такой код грузит ядро процессора под сотку.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

Рейтинг@Mail.ru