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

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

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

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

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

Сообщение Владимир »

Всем доброго. Работа со сканером штрих-кода (код- matrix).
В строке от сканера присутствуют заглавные и строчные символы, однако по FormKeyDown скан-коды для любого символа одинаковы.
С цифрами проблем нет.
Скан-коды меньше 30 превращаются в нечто непонятное...
Последний раз редактировалось Владимир 25.06.2023 14:40:16, всего редактировалось 1 раз.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

FormKeyPress(Sender: TObject; var Key: Char; Shift: TShiftState);
По описаниям должна давать символ с регистром. Попробуйте.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 565
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

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

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

В общем оба варианта вам подойдут на самом деле.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

WAYFARER писал(а):...отлавливать состояние TShiftState и считывать текущую раскладку клавиатуры.
Поскольку у топикстартера не клавиатура, а сканер, то большой вопрос, будет ли работать TShiftState, поэтому я не стал о нем писать.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 565
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

Снег Север писал(а):Поскольку у топикстартера не клавиатура, а сканер, то большой вопрос, будет ли работать TShiftState, поэтому я не стал о нем писать.
Должно работать.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

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

Сообщение WAYFARER »

Наводит на мысль что сканер тупо не отправляет BS. Сканер в режиме клавиатуры отправляет уже декодированные данные. Подозреваю, что происходит это так - сканер считывает 32 символа, обрабатывает bs, смещаясь на 1 символ назад и отправляет готовый результат длиной 31.
Проверить не сложно. Сгенерируйте код с числовой последовательностью и в середину засуньте BS, если при сканировании последовательности нарушится, то все работает именно так как я предположил.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

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 

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

Сообщение WAYFARER »

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

Добавлено спустя 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.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Мысль.

Добавлено спустя 9 минут 42 секунды:
Экспериментировать в терминальном текстовом режиме? Это плохо
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 565
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

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

Сообщение Владимир »

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

Сообщение WAYFARER »

Владимир писал(а):А в какое, пардон, место коды сканера будут приходить?
А в чем принциальная разница? Работайте точно так же как работали с событиями. получайте и передавайте дальше куда надо.
В данном примере мы напрямую читаем буфер клавиатуры без всяких gtk/qt и прочего.
Скорее всего в вашей утиллите на С используется тот же самый метод.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

WAYFARER писал(а):В данном примере мы напрямую читаем буфер клавиатуры без всяких gtk/qt и прочего.
Я не отметил, что сканер USB. Тем не менее, Ваш пример написал в консоли на ТурбоПаскале.
Вывод всех кодов символов посылки со сканера правильный, исключая 08, вместо него два кода - 0 и 66.
Разбираться далее нет сил и времени. Спасибо.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

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