Пишем под ТСД. Подключение сканера штрихкода, как компонент формы

в 15:21, , рубрики: .net, smart device

Ни для кого не секрет, что промышленное ПО для терминалов сбора данных (ТСД) пишется для автоматизации бизнес процессов, в особенности — складских. Большая часть задач, которые необходимо решить с помощью ТСД, связана со штрихкодированием, благо сканер штрихкода в девайс встроен.
В этом статье пойдет речь о том, как начать писать программы для терминалов сбора данных, и как подключить и использовать сканер штрихкода.

Пишем под ТСД. Подключение сканера штрихкода, как компонент формы


Немного теории по сканерам штрихкода.

Есть три типа сканеров:

  • Светодиодные — считывание производится аналоговой интегральной микросхемой, состоящей из чувствительных фотодиодов. Штрихкод подносить практически вплотную.
  • Лазерный — прямое линейное считывание разверткой лазерного луча. Считывают на среднем расстоянии, но очень хрупки.
  • Имэйджеры — моментальный снимок, и дальнейший разбор изображение, часто сопровождаются той же лазерной полосой, но исключительно с целью прицеливаний. Очень дорогие.

Мой подопытный образец Motorola MC3190 обладает лазерным сканером штрихкода. (В ближайшее время планирую плотно заняться Datalogic c имэйджером).

Кому интересно, можете ознакомиться со спецификацией

На девайсе установлена Windows CE, соответственно и писать будет необходимо под нее. И если Вы никогда не пробовали писать под ТСД, конечно же начать стоит с Hello World. Чтобы запустить приложение, написанное на C# на сем устройстве, необходимо установить на него .NET 3.5 Compact. А так же иметь под рукой Visual Studio 2008, так как во всех последующих релизах вариант проекта Smart Device отсутствует (мелкомягкие любят навязывать свои новые технологии, которые, к сожалению, не всегда совместимы с ранними версиями их же операционной системы).

Пишем под ТСД. Подключение сканера штрихкода, как компонент формы

Итак, создав простенькое приложение, можно попробовать его сразу же запустить. Если устройство подключено к компьютеру, то студия сразу же предложит выполнить запуск непосредственно на нем, с возможностью отладки, разумеется. Подождав несколько минут можно увидеть запуск формочки на устройстве.

Пишем под ТСД. Подключение сканера штрихкода, как компонент формы
Пишем под ТСД. Подключение сканера штрихкода, как компонент формы

Вот теперь можно приступать к самому интересному.

Для того, чтобы использовать объектную модель, уже реализованную в C#, Motorola подготовила целый ряд библиотек. Фактически с помощью них можно творить все, что нам вздумается. Называется это чудо Symbol. В нашем случае будет использована Symbol.Barcode. К сожалению в данный момент официальный сайт библиотеки symbol.com перенаправляет нас на motorolasolutions.com, сообщая о том, что технология устарела. Но я в свое время сделал копии всех Reference с примерами:

cloud.mail.ru/public/6716403f96ac%2FSymbolReference.7z
cloud.mail.ru/public/c48120476007%2FSymbolExample.7z

В примерах, те, кому интересно, конечно могут покопаться, но я могу сразу предупредить, что есть статьи, в которых описано все гораздо проще и удобнее, на мой взгляд лучшая среди них: kbss.ru/blog/dotnetcf/178.html. Но тем не менее я считаю, что каждый раз подключать таким образом сканер штрихкода не очень удобно, особенно если приложение планируется многооконным. К тому же в некоторых случаях могут возникнуть проблемы со считыванием, при возвращении фокуса в родительское окно, от дочернего.

Из всего что можно найти в интернете, главное осознать то, что самым удобным способом обработки штрихкодов является модель, построенная на событиях:
1. Сработал сканер штрихкода.
2. Распознал штрихкод корректно.
3. Мы вызываем событие обработки этого штрихкода у себя в программе, уже разобранного и удобного для восприятия.

Компоненты формы — паттерн, позволяющий добавлять свои контролы в конструктор форм студии. Этим и воспользуемся. И не только потому, что это упростит разработку форм, а еще и потому, что в дальнейшем компоненту можно будет доработать так, чтобы она поддерживала сканеры не только от Motorol`ы.

Пишем под ТСД. Подключение сканера штрихкода, как компонент формы

Затем надо описать класс компоненты.

public partial class BarcodeReader : Component
    {
        private Symbol.Barcode.BarcodeReader barcodeReader = null;

        public delegate void OnReadBarcodeReaderEventHandler(string Text);
        public event OnReadBarcodeReaderEventHandler OnRead;

        public BarcodeReader()
        {
            InitializeComponent();
            InitializeBarcodeReader();
        }

        public BarcodeReader(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
            InitializeBarcodeReader();
        }

        private void InitializeBarcodeReader()
        {
            this.barcodeReader = new Symbol.Barcode.BarcodeReader();
            this.barcodeReader.ListChanged += new System.ComponentModel.ListChangedEventHandler(BarcodeReader_ListChanged);
            this.barcodeReader.Start();

            this.components.Add(this.barcodeReader);
        }

        void BarcodeReader_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
        {
            if (this.barcodeReader.ReaderData.Result == Symbol.Results.SUCCESS)
            {
                OnRead(this.barcodeReader.ReaderData.Text);
            }
        }
    }

На что здесь надо обратить внимание:
1. Любое событие, которые добавляется в компоненте, становится доступно в конструкторе формы.
2. На основании IContainer container в конструкторе форм реализован механизм высвобождения памяти, в том числе и unmanage объектов. Соответственно грех этим не воспользоваться. Добавляем в контейнер объект считывателя штрихкода, и память высвободится рекурсивно, при закрытии формы, в которой содержится описываемая здесь компонента.
//
О том, как это происходит можно понять открыв designer любой из форм, созданной в конструкторе, и посмотрев на перегрузку:

        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

//
3. Чуть-чуть переопределяем событие считывания, избавив себя от обработки считанных с ошибками данных.

Дальше дело за малым: перетащить компоненту на форму:

Пишем под ТСД. Подключение сканера штрихкода, как компонент формы

И добавить событие обработки штрихкода:

Пишем под ТСД. Подключение сканера штрихкода, как компонент формы
Убедиться в работе более чем достаточно следующего кода:

  private void barcodeReader1_OnRead(string Text)
        {
            MessageBox.Show(Text);
        }

Получилось несколько сумбурно, и очень много скриншотов. Повторив вышеперечисленные шаги вы освоите сразу три вещи:

1. Создавать и запускать в режиме отладки программы под терминалы сбора данных.
2. Разберетесь как работать со сканером штрихкода.
3. Научитесь создавать компоненты форм.

Я надеюсь эта статья поможет тем, кто только начал разбираться с программированием под ТСД, и несколько упростит этим людям жизнь.

Автор: ZEEGIN

Источник