Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2019, 09:57   #1
Alexcrool
 
Регистрация: 26.05.2016
Сообщений: 8
По умолчанию Сканер штрих-кодов USB

Здравствуйте!
Вопрос заезженный, давний, по любому есть решения, но никто не хочет делится. Вопрос как корректно считать данные со сканера и не ввести пользователя в ужас?
Поскольку сканер у меня простой, USB, в windows определяется как клавиатура, то код полученный с него вставляется в контрол у которого имеется фокус. Естественно, что это не то что нужно конечному пользователю.
Для получения "кода" со сканера написал такой код. Он работает от времени получения сообщения (Msg.time) и если оно короче 35, то идет накопление символов в спец переменную ScanMedKod.
Код:
privat
    tLastKey : DWORD;
    s1: char;
    ScanMedKod,s2: string;
    ScanReading: boolean;
....
procedure TdmApteka_f.aeAptekaMessage(var Msg: tagMSG; var Handled: Boolean);
begin
  if Msg.message = WM_KEYUP then
    begin
      case Msg.wParam  of
        48..57,65..90: begin //0..9,a..z
          if (Msg.time-tLastKey) > 35
            then
              begin
                s1 := chr(Msg.wParam); s2:='';
              end
            else
              begin
                s2 := s2+chr(Msg.wParam);
                ScanReading := true;
              end;
          tLastKey := Msg.time;
        end;
        VK_F8: begin
          if ScanReading then s2 := s2+#13; Handled := true;
        end
      end;
    end;
  if (ScanReading) then
    begin
      if ((Msg.time-tLastKey) > 100) then
        if (s2.Length > 1) then
          begin
            ScanMedKod := s1+s2;
            s1 := #0; s2 := ''; ScanReading := false;
          end;
    end;
end;
У меня возникла проблема в том, что для начала отслеживания поступления сообщий именно от сканера нужна разница между первым сообщением и следующим. Т.е. первый символ всегда пролетает в приложение, иногда и два. Тем самым затирая или вставляясь в контрол в котором стоит фокус. Этого делать нельзя. Может кто-нибудь подсказать как провернуть финт ушами, что бы лишние символы не проскакивали в приложение? может я что-то не учел.
Думал вызывать отмену изменений у текущего контрола, что бы после получения кода со сканера, если вдруг что-то попало в него, приложение отменяло ввод и возвращало пользователю то значение, которое у него было изначально. Но думаю такое решение не совсем адекватное.
Может у кого есть свой рабочий пример считывания штрих-кода?
Alexcrool вне форума Ответить с цитированием
Старый 08.07.2019, 07:26   #2
Alexcrool
 
Регистрация: 26.05.2016
Сообщений: 8
По умолчанию Решение

Покопавшись в Msg поглубже придумал финт ушами:

Код:
  case Msg.message of
    WM_KEYDOWN, WM_KEYUP: begin
      if Msg.message = WM_KEYDOWN then
        Handled := (Msg.lParam <> 1) and (Msg.wParam in [48..57,65..90]);
      if Msg.message = WM_KEYUP then
        case Msg.wParam  of
          48..57,65..90: begin //'0'..'9','A'..'Z'
            if (Msg.time-tLastKey) <= 30
              then
                begin
                  s2 := s2+chr(Msg.wParam);
                  ScanReading := true;
                end
              else
                begin
                  s2 := '';
                  keybd_event(Msg.wParam, 0, 0, 0);
                end;
          end;
          VK_F8: if ScanReading then s2 := s2+#13;
        end;
      tLastKey := Msg.time;
    end;
  end;
  if (ScanReading) and ((Msg.time-tLastKey) > 100) then
    if s2.Length >= 13 then  //Штрих-код (EAN13)
      begin
         ScanMedKod := s2;
         s2 := ''; ScanReading := false;
      end;
Код вполне рабочий, но еть одно "но". будут проблемы если установлен Punto Switcher (программа для автом. смены раскладки клавиатуры)

Последний раз редактировалось Alexcrool; 08.07.2019 в 07:29.
Alexcrool вне форума Ответить с цитированием
Старый 09.07.2019, 02:48   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Alexcrool Посмотреть сообщение
Код вполне рабочий, но еть одно "но". будут проблемы если установлен Punto Switcher
А это проблема Администратора, а не программиста. Какой на хрен ПунтоСвитчер на компе, который работает со сканером штрих кодов? Какая зараза его туда поставила!
northener вне форума Ответить с цитированием
Старый 09.07.2019, 05:40   #4
Alexcrool
 
Регистрация: 26.05.2016
Сообщений: 8
По умолчанию

Это мое замечание, потому как я им пользуюсь и при разработке кода для сканера у меня он перестал работать. Вот и я отписал. Врятли, конечно, кто-то будет ставить пунто на склад.
Alexcrool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сканер штрих-кодов и эксель Анурофф Microsoft Office Excel 3 10.08.2017 09:37
Сканер штрих кода и поиск Незнайка11 Microsoft Office Access 5 08.02.2014 20:34
сканер штрих-кодов через com порт Dmitriy90 C++ Builder 3 18.07.2012 15:35
Распознавание штрих-кодов vlad00777 Мультимедиа в Delphi 1 23.08.2010 21:45
Сканер штрих кодов asale Microsoft Office Excel 7 30.11.2008 19:57