OPOS UPOS
От: shico Великобритания
Дата: 08.05.07 11:50
Оценка:
Добрый день!

Возникла задача закидывать некоторые данные в баркод, с возможностью их последующего считывания инфракрасным сканером.

3-х часов рисерч в интернете дал следующие результаты. Имеется несколько платных .NET компонентов, которые генерируют баркод. Самому генерировать нужную картинку тоже в принципе можно научиться, прочесть спецификацию и помучавшись некоторое число человеко-часов.

Как достучаться из .NET-а до инфракрасного сканера (barcode reader) вообще не ясно. Microsoft выпустила управляемые сборки для этого дела, но они доступны только в Windows Embedded for Point of Service (специальной редакции для кассовых апартов и прочего в этом роде). В общем чегой-то я ничего не нашел

Вопрос такой, кто-нить сталкивался с подобной задачей. Если да, как решали? С генерацией баркода более менее ясно, а вот как потом его считывали?

Заранее спасибо.
Re: OPOS UPOS
От: HowardLovekraft  
Дата: 08.05.07 12:18
Оценка:
Здравствуйте, shico, Вы писали:

S>Возникла задача закидывать некоторые данные в баркод, с возможностью их последующего считывания инфракрасным сканером.


Что такое "инфракрасный сканер"?
Если имеется ввиду обычный сканер штрихкода — примеров чтения валом. Тянуть ради него OPOS извращение еще то.
Re: OPOS UPOS
От: Norad  
Дата: 08.05.07 12:24
Оценка: +1
Здравствуйте, shico, Вы писали:

S>Добрый день!


S>Возникла задача закидывать некоторые данные в баркод, с возможностью их последующего считывания инфракрасным сканером.


S>3-х часов рисерч в интернете дал следующие результаты. Имеется несколько платных .NET компонентов, которые генерируют баркод. Самому генерировать нужную картинку тоже в принципе можно научиться, прочесть спецификацию и помучавшись некоторое число человеко-часов.


А можно просто, установить шрифт (штрихкода), о писать его как обычный текст.
Re[2]: OPOS UPOS
От: shico Великобритания
Дата: 08.05.07 12:26
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, shico, Вы писали:


S>>Возникла задача закидывать некоторые данные в баркод, с возможностью их последующего считывания инфракрасным сканером.


HL>Что такое "инфракрасный сканер"?

HL>Если имеется ввиду обычный сканер штрихкода — примеров чтения валом. Тянуть ради него OPOS извращение еще то.

Именно обычный сканер штрих-кода. Поскуольку в данном вопросе совершенно не сведущ, и где-то, когда-то краем уха слышал про OPOS, решил копать в этом направлении

Подскажите пожалуйста, если знаете, как-таки читать и где искать этот загадочный "валом"?
Re[2]: OPOS UPOS
От: shico Великобритания
Дата: 08.05.07 12:30
Оценка:
Здравствуйте, Norad, Вы писали:

N>А можно просто, установить шрифт (штрихкода), о писать его как обычный текст.


Согласен. По поводу генерации особо трудностей нет. В частности на codeproject есть пару хороших статей описывающих этот процесс, именно через запись соответствующими фонтами.

Меня больше волнует как считать то, что я негенерирую А-то вставил сканер в юсб порт, он попиликал, добавился в систему как нова клавиатура и успокоился. Правда если поводить по штрихкодам всяким, радостно пикает, но как получить то, что он считал совершенно не понимаю. Куда копать?
Спасибо.
Re[3]: OPOS UPOS
От: HowardLovekraft  
Дата: 08.05.07 12:39
Оценка: 2 (1)
S>Именно обычный сканер штрих-кода

Сканер в общем случае передает такую последовательность:

<префикс1> <префикс2> ... <префиксN> <данные> <суффикс1> <суффикс2> <суффиксN>


Префиксы и суффиксы, их количество и значения, настраиваются на самом сканере.
В зависимости от интерфейса сканера:

1. В разрыв клавиатуры. Самое простое. Каждый принятый сканером символ — нажатие клавиши.
2. USB-сканер. Устанавливается в системе как HID-устройство. Далее — см. 1
3. RS-сканер. Открываем порт, вешаемся на событие получения одного из суффиксов (как правило, в нормальной ситуации он — единственный). Получичили суффикс — считали все, что находится в бефере порта. Если на сканере запрограммирована передеча префиксов, их нужно отбросить.

По п.3 задача сводится к чтению данных из COM-порта.
Re[3]: OPOS UPOS
От: TK Лес кывт.рф
Дата: 08.05.07 12:51
Оценка: 2 (1)
Здравствуйте, shico, Вы писали:

S>Меня больше волнует как считать то, что я негенерирую А-то вставил сканер в юсб порт, он попиликал, добавился в систему как нова клавиатура и успокоился. Правда если поводить по штрихкодам всяким, радостно пикает, но как получить то, что он считал совершенно не понимаю. Куда копать?


Есть сканеры которые вставляются в разрыв обычной клавиатуры — они работают без проблем. В любом случае, если сканер подключился как клавиатура то, стоит посмотреть на клавиатурные сообещения которые идут при сканировании. посмотреть можно через Spy++
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[4]: OPOS UPOS
От: shico Великобритания
Дата: 08.05.07 12:51
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

S>>Именно обычный сканер штрих-кода


HL>Сканер в общем случае передает такую последовательность:


HL>
HL><префикс1> <префикс2> ... <префиксN> <данные> <суффикс1> <суффикс2> <суффиксN>
HL>


HL>Префиксы и суффиксы, их количество и значения, настраиваются на самом сканере.

HL>В зависимости от интерфейса сканера:

HL>1. В разрыв клавиатуры. Самое простое. Каждый принятый сканером символ — нажатие клавиши.

HL>2. USB-сканер. Устанавливается в системе как HID-устройство. Далее — см. 1
HL>3. RS-сканер. Открываем порт, вешаемся на событие получения одного из суффиксов (как правило, в нормальной ситуации он — единственный). Получичили суффикс — считали все, что находится в бефере порта. Если на сканере запрограммирована передеча префиксов, их нужно отбросить.

У меня п.2. При втыкании сканера в USB, он определяется именно как HID (Human Interface Device) — устройство. Следовательно надо переходить к п.1. Это что? KeyPress event-ы ловить? А в Web приложении как быть? Я вообще себе это дело представлял как какой-нить activeX, COM, .NET assembly (не важно), который пасет сканер, и как только тот что-то считывывает возвращает мне массив данных.

Что-то не понял Можно с этого места (п.1) поподробнее, если не трудно, или отправьте читать на соответствующий ресурс, буду премного благодарен
Re[5]: OPOS UPOS
От: HowardLovekraft  
Дата: 08.05.07 13:03
Оценка: 3 (1)
Здравствуйте, shico, Вы писали:

S>У меня п.2


Да, именно, ловить нажатие клавиш.

Если в момент чтения штрихкода на экране в фокусе окно, которое и без этого ловит нажатие клавиш, например, TextBox, он сам отобразит считанные данные (правда, обычно фильтруют непечатаемые символы).

Если в фокусе окно, которое по умолчанию не обрабатывает KeyPress — просто добавь обработчик этого события.

Природа окна (форма .NET, форма VCL, MFC-окно) значения не имеет.
Re[6]: OPOS UPOS
От: shico Великобритания
Дата: 08.05.07 13:23
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, shico, Вы писали:


S>>У меня п.2


HL>Да, именно, ловить нажатие клавиш.


HL>Если в момент чтения штрихкода на экране в фокусе окно, которое и без этого ловит нажатие клавиш, например, TextBox, он сам отобразит считанные данные (правда, обычно фильтруют непечатаемые символы).


HL>Если в фокусе окно, которое по умолчанию не обрабатывает KeyPress — просто добавь обработчик этого события.


HL>Природа окна (форма .NET, форма VCL, MFC-окно) значения не имеет.


Так просто? С ума сойти, а я уже пригтовился проводить бессонные ночи над документацией OPOS. Попробовал, понравилось и главное Enter сам жмет. Красота.
Спасибо большое за ответ.

Теперь, позвольте вернуться к нашим бар..кодам Я так понял существует много стандартов, различной емкости. Мне надо выбрать любой подходящий мне и нарисовать баркод согласно его спецификации. Так?
Мне нужно хранить в баркоде строчку (255 символов максимум), идентифицирующую таблицу базы + интовое значение соответствующее номеру рекорда.
Итого 255*2 + 4 = 514 байт.
Какой стандарт посоветуете?
Re[7]: OPOS UPOS
От: HowardLovekraft  
Дата: 08.05.07 13:38
Оценка:
Здравствуйте, shico, Вы писали:

S>Спасибо большое за ответ.


Пожалуйста.

S>Мне нужно хранить в баркоде строчку (255 символов максимум), идентифицирующую таблицу базы + интовое значение соответствующее номеру рекорда.

S>Итого 255*2 + 4 = 514 байт.
S>Какой стандарт посоветуете?

Советую пересмотреть концепцию.
Вообще имеет смысл подробней изложить задачу. Кодировать 514 байт в штрихкоде... как-то чересчур.

Проше кодировать простеньким коротким штрихкодом, и где-то хранить соответствие штрихкодов и объектов.
Тогда требуемая разрядность определяется через макисмально-возможное количество кодируемых объектов.
Re[8]: OPOS UPOS
От: shico Великобритания
Дата: 08.05.07 15:35
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Советую пересмотреть концепцию.

HL>Вообще имеет смысл подробней изложить задачу. Кодировать 514 байт в штрихкоде... как-то чересчур.

HL>Проше кодировать простеньким коротким штрихкодом, и где-то хранить соответствие штрихкодов и объектов.

HL>Тогда требуемая разрядность определяется через макисмально-возможное количество кодируемых объектов.

Задача следующая: Есть набор плоских баз-данных специализированного формата (химия). Они лежат на диске, и пути до них известны. Каждая база содержит в себе набор таблиц, а те в свою очередь набор рекордов. Собственно пишется пользовательский веб-интерфейс для отображения этих баз. Одна из фич создание репорта, в который необходимо добавлять баркод, сканируя который, юзер впоследствии сможет сразу перескочить на нужную базу и рекорд. Поэтому в баркоде должны бать закодированы минимум путь до базы и номер рекорда (откруются нужные таблицы и перейдут на соответствующий рекорд), т.е. информацию вроде этой:

\data\example.db?RecId=100

Я поэксперементровал с разными баркодами и получилось, что 1-мерных баркодов (оптимальным окзался Code 128A) будет маловато, поскольку если путь до базы будет слишком длиный, то баркод получится огромный и сканер его не может считать.

Стал смотреть в сторону PDF417, выяснилось что наш сканер его не читает

Баркоды пока генерировал на бесплатном сервисе
http://www.tec-it.com/asp/main/startfr.asp?mainmenu=Software&amp;sbmenu=Online&amp;redirect=demo/playground.asp&amp;LN=1

Теперь не знаю что и делать, либо сканер новый покупать и заставлять всех юзеров покупать его-же, либо кодировать только номер рекорда, а базу пусть вручную выбирают (хотя смысла в этом большого нет, проще ручками вбить айдишник)
Re[2]: OPOS UPOS
От: _d_m_  
Дата: 10.05.07 00:44
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, shico, Вы писали:


S>>Возникла задача закидывать некоторые данные в баркод, с возможностью их последующего считывания инфракрасным сканером.


HL>Что такое "инфракрасный сканер"?

HL>Если имеется ввиду обычный сканер штрихкода — примеров чтения валом. Тянуть ради него OPOS извращение еще то.

OPOS то что надо.
Re: OPOS UPOS
От: _d_m_  
Дата: 10.05.07 05:46
Оценка: 3 (1)
Здравствуйте, shico, Вы писали:

S>Добрый день!


S>Возникла задача закидывать некоторые данные в баркод, с возможностью их последующего считывания инфракрасным сканером.


Для считывания ШК используется видимый диапазон излучения.

S>3-х часов рисерч в интернете дал следующие результаты. Имеется несколько платных .NET компонентов, которые генерируют баркод. Самому генерировать нужную картинку тоже в принципе можно научиться, прочесть спецификацию и помучавшись некоторое число человеко-часов.


Смотря какого формата строки ты хочешь кодировать. Для EAN13, Code-39 полно бесплатных шрифтов.

S>Как достучаться из .NET-а до инфракрасного сканера (barcode reader) вообще не ясно. Microsoft выпустила управляемые сборки для этого дела, но они доступны только в Windows Embedded for Point of Service (специальной редакции для кассовых апартов и прочего в этом роде). В общем чегой-то я ничего не нашел


WEPOS необязательна. Можно качнуть отдельно POS for .Net и установить на обычную WinXP. Сейчас собираемся переходить на эту технологию.

S>Вопрос такой, кто-нить сталкивался с подобной задачей. Если да, как решали? С генерацией баркода более менее ясно, а вот как потом его считывали?


Качаешь OPOS CCO — Common Control Objects здесь, тебе нужен только OPOSScanner.ocx . С некоторыми драйверами сканеров он поставляется. Только может быть более старой версии, поэтому для более нового потребуется перерегистрация:
resgsvr32 OPOSScanner.ocx

В примере я просто добалял Reference на COM класс "OPOS Scanner Control ..." и на "Opos Constants", сам же я использую собственоручно сгенерированные враперы. На вышеприведенном сайте есть враперы, но только для версии 1.6 — старые. Но я думаю тебе будет достаточно — как в примере. Будут вопросы — пиши. А теперь сам пример:

Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using OposScanner_1_11_Lib;
using OPOSCONSTANTSLib;


namespace Test1
{
    public partial class Form1 : Form
    {
        OPOSScanner s;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                this.s = new OPOSScannerClass();
                this.s.ErrorEvent += new _IOPOSScannerEvents_ErrorEventEventHandler(s_ErrorEvent);
                this.s.DataEvent += new _IOPOSScannerEvents_DataEventEventHandler(s_DataEvent);

                ResultCodeH.Check(this.s.Open("OPOS_Device_Name - как ты его там назвал при конфигурировании"));
                ResultCodeH.Check(this.s.ClaimDevice(7000));

                this.s.DeviceEnabled = true;
                ResultCodeH.Check(this.s.ResultCode);

                this.s.AutoDisable = true;
                ResultCodeH.Check(this.s.ResultCode);

                this.s.DataEventEnabled = true;
                ResultCodeH.Check(this.s.ResultCode);
            }
            catch( Exception _e )
            {
                // придумай что-нибудь сам
            }
        }

        void s_DataEvent(int Status)
        {
            this.label1.Text = this.s.ScanData;

            this.s.DeviceEnabled = true;
            this.s.DataEventEnabled = true;
        }

        void s_ErrorEvent(int ResultCode, int ResultCodeExtended, int ErrorLocus, ref int pErrorResponse)
        {
            pErrorResponse = (int)OPOS_Constants.OPOS_ER_CLEAR;
            this.label1.Text = ResultCodeH.Message(ResultCode);

            this.s.DeviceEnabled = true;
            this.s.DataEventEnabled = true;
        }
    }
}

OPOSHelpers.cs
using System;

namespace Test1
{
    #region class ResultCodeH
    //CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    public class ResultCodeH
    {
        #region Константы
        /////////////////////////////////////////////////////////////////////
        // OPOS "ResultCode" Property Constants
        /////////////////////////////////////////////////////////////////////
        public const int OPOS_SUCCESS = 0;
        public const int OPOS_E_CLOSED        = 101;
        public const int OPOS_E_CLAIMED       = 102;
        public const int OPOS_E_NOTCLAIMED    = 103;
        public const int OPOS_E_NOSERVICE     = 104;
        public const int OPOS_E_DISABLED      = 105;
        public const int OPOS_E_ILLEGAL       = 106;
        public const int OPOS_E_NOHARDWARE    = 107;
        public const int OPOS_E_OFFLINE       = 108;
        public const int OPOS_E_NOEXIST       = 109;
        public const int OPOS_E_EXISTS        = 110;
        public const int OPOS_E_FAILURE       = 111;
        public const int OPOS_E_TIMEOUT       = 112;
        public const int OPOS_E_BUSY          = 113;
        public const int OPOS_E_EXTENDED      = 114;

        public const int OPOS_OR_ALREADYOPEN  = 301;
        public const int OPOS_OR_REGBADNAME   = 302;
        public const int OPOS_OR_REGPROGID    = 303;
        public const int OPOS_OR_CREATE       = 304;
        public const int OPOS_OR_BADIF        = 305;
        public const int OPOS_OR_FAILEDOPEN   = 306;
        public const int OPOS_OR_BADVERSION   = 307;
        public const int OPOS_ORS_NOPORT      = 401;
        public const int OPOS_ORS_NOTSUPPORTED= 402;
        public const int OPOS_ORS_CONFIG      = 403;
        #endregion

        #region Message
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        public static string Message(int _ResultCode)
        {
            switch( _ResultCode )
            {
                case OPOS_SUCCESS:
                    return "OPOS - Успешно";
                case OPOS_E_CLOSED:
                    return "OPOS - Объект закрыт";
                case OPOS_E_CLAIMED:
                    return "OPOS - Объект кем-то захвачен";
                case OPOS_E_NOTCLAIMED:
                    return "OPOS - Объект не захвачен";
                case OPOS_E_NOSERVICE:
                    return "OPOS - Сервис не поддерживается";
                case OPOS_E_DISABLED:
                    return "OPOS - Объект отключен";
                case OPOS_E_ILLEGAL:
                    return "OPOS - Недопустимо";
                case OPOS_E_NOHARDWARE:
                    return "OPOS - Оборудование отсутствует";
                case OPOS_E_OFFLINE:
                    return "OPOS - Питание выключено";
                case OPOS_E_NOEXIST:
                    return "OPOS - Объект не существует";
                case OPOS_E_EXISTS:
                    return "OPOS - Объект уже существует";
                case OPOS_E_FAILURE:
                    return "OPOS - Общий сбой";
                case OPOS_E_TIMEOUT:
                    return "OPOS - Время ожидания истекло";
                case OPOS_E_BUSY:
                    return "OPOS - Устройство занято";
                case OPOS_E_EXTENDED:
                    return "OPOS - Расширенная ошибка";
                case OPOS_OR_ALREADYOPEN:
                    return "OPOS - Объект уже открыт";
                case OPOS_OR_REGBADNAME:
                    return "OPOS - В реестре нет устройства с таким именем";
                case OPOS_OR_REGPROGID:
                    return "OPOS - Ошибка конфигурации устройства в реестре";
                case OPOS_OR_CREATE:
                    return "OPOS - Невозможно создать сервисный объект";
                case OPOS_OR_BADIF:
                    return "OPOS - Сервисный объект не поддерживает все необходимые методы или свойства";
                case OPOS_OR_FAILEDOPEN:
                    return "OPOS - Неизвестная ошибка открытия";
                case OPOS_OR_BADVERSION:
                    return "OPOS - Неверная версия сервисного объекта";
                case OPOS_ORS_NOPORT:
                    return "OPOS - Ошибка доступа к порту В/В";
                case OPOS_ORS_NOTSUPPORTED:
                    return "OPOS - Сервисный объект не поддерживает указанное устройство";
                case OPOS_ORS_CONFIG:
                    return "OPOS - Ошибка чтения конфигурации из реестра";
                default:
                    return "OPOS - Неизвестный код возврата";
            }
        }
        #endregion

        #region Check
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        public static void Check(int _ResultCode)
        {
            if( _ResultCode != OPOS_SUCCESS )
                throw new Exception(ResultCodeH.Message(_ResultCode));
        }
        #endregion
    }
    #endregion
    
    #region class StatusUpdateH
    //CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    public class StatusUpdateH
    {
        public const int OPOS_SUE_POWER_ONLINE                     = 2001; // (added in 1.3)
        public const int OPOS_SUE_POWER_OFF                        = 2002; // (added in 1.3)
        public const int OPOS_SUE_POWER_OFFLINE                    = 2003; // (added in 1.3)
        public const int OPOS_SUE_POWER_OFF_OFFLINE                = 2004; // (added in 1.3)

        public const int OPOS_SUE_UF_PROGRESS                      = 2100; // (added in 1.9)
        public const int OPOS_SUE_UF_COMPLETE                      = 2200; // (added in 1.9)
        public const int OPOS_SUE_UF_COMPLETE_DEV_NOT_RESTORED    = 2205; // (added in 1.9)
        public const int OPOS_SUE_UF_FAILED_DEV_OK                 = 2201; // (added in 1.9)
        public const int OPOS_SUE_UF_FAILED_DEV_UNRECOVERABLE      = 2202; // (added in 1.9)
        public const int OPOS_SUE_UF_FAILED_DEV_NEEDS_FIRMWARE     = 2203; // (added in 1.9)
        public const int OPOS_SUE_UF_FAILED_DEV_UNKNOWN            = 2204; // (added in 1.9)

        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        public static string Message(int _StatusUpdateCode)
        {
            switch( _StatusUpdateCode )
            {
                case OPOS_SUE_POWER_ONLINE:
                    return "Питание включено";
                case OPOS_SUE_POWER_OFF:
                    return "Питание выключено";
                case OPOS_SUE_POWER_OFFLINE:
                    return "Устройство в режиме энергосбережения";
                case OPOS_SUE_POWER_OFF_OFFLINE:
                    return "Устройство выключено или в режиме энергосбережения";
                case OPOS_SUE_UF_PROGRESS:
                    return "Update firmware progress";
                case OPOS_SUE_UF_COMPLETE:
                    return "Update firmware complete";
                case OPOS_SUE_UF_COMPLETE_DEV_NOT_RESTORED:
                    return "Update firmware complete, device not restored";
                case OPOS_SUE_UF_FAILED_DEV_OK:
                    return "Update firmware failed, device OK";
                case OPOS_SUE_UF_FAILED_DEV_UNRECOVERABLE:
                    return "Update firmware failed, device unrecoverable";
                case OPOS_SUE_UF_FAILED_DEV_NEEDS_FIRMWARE:
                    return "Update firmware failed, device needs firmware";
                case OPOS_SUE_UF_FAILED_DEV_UNKNOWN:
                    return "Update firmware failed, device status unknown";
                default:
                    return "Неизвестный статус код";
            }
        }
    }
    #endregion

    #region class PowerStateH
    //CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    public class PowerStateH
    {
        public const int OPOS_PS_UNKNOWN      = 2000;
        public const int OPOS_PS_ONLINE       = 2001;
        public const int OPOS_PS_OFF          = 2002;
        public const int OPOS_PS_OFFLINE      = 2003;
        public const int OPOS_PS_OFF_OFFLINE  = 2004;

        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        public static string Message(int _PowerStateCode)
        {
            switch( _PowerStateCode )
            {
                case OPOS_PS_UNKNOWN:
                    return "Неизвестно";
                case OPOS_PS_ONLINE:
                    return "Питание включено";
                case OPOS_PS_OFF:
                    return "Питание выключено";
                case OPOS_PS_OFFLINE:
                    return "Режим энергосбережения";
                case OPOS_PS_OFF_OFFLINE:
                    return "Питание выключено или режим энергосбережения";
                default:
                    return "Неизвестный код состояния питания";
            }
        }
    }
    #endregion
} // namespace

Form1.Designer.cs
namespace Test1
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        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);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(32, 32);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(35, 13);
            this.label1.TabIndex = 0;
            this.label1.Text = "label1";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(365, 299);
            this.Controls.Add(this.label1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Label label1;
    }
}

Program.cs
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Test1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Re[2]: OPOS UPOS
От: shico Великобритания
Дата: 10.05.07 09:52
Оценка:
Спасибо за подробный ответ!
Тут походу пьесы возник еще один вопрос . Вы случайно не знаете бесплатных компонентов для генерации баркодов? Или где можно бесплатно взять шрифты для кода 128? А-то всюду гед смотрю все платное
Re[3]: OPOS UPOS
От: _d_m_  
Дата: 11.05.07 08:30
Оценка:
Здравствуйте, shico, Вы писали:

S>Спасибо за подробный ответ!

S>Тут походу пьесы возник еще один вопрос . Вы случайно не знаете бесплатных компонентов для генерации баркодов? Или где можно бесплатно взять шрифты для кода 128? А-то всюду гед смотрю все платное

Для Code-128 ничего бесплатного не встречал.
Re[3]: OPOS UPOS
От: HowardLovekraft  
Дата: 11.05.07 08:51
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>OPOS то что надо.


Угу. Особенно для USB-сканера.
Re[9]: OPOS UPOS
От: HowardLovekraft  
Дата: 11.05.07 08:55
Оценка:
Здравствуйте, shico, Вы писали:

S>Задача следующая


Ч.т.д.
Храни соответствие штрихкода нужной базе и записи в ней. Хранить, ессно, придется тоже в базе.
Требуемая разрядность штрихкода — длина макс. количества баз и длина макс. количества записей.

По поводу бесплатных библиотек для рисования ШК — на torry.net было несколько для Delphi.
Для одного типа штрихкода переписать на шарпе будет не сложно.
Re[2]: OPOS UPOS
От: StriderMan  
Дата: 05.06.07 07:46
Оценка:
___> void s_DataEvent(int Status)
___> {
___> this.label1.Text = this.s.ScanData;

___> this.s.DeviceEnabled = true;

___> this.s.DataEventEnabled = true;
___> }


Использую MSROPOS (OPOS ридер маг. карт). После возникновения события считывания карточки флаг DataEventEnabled сбрасывается в false. Пробовал, как вы написали, выставлять в обработчике DataEventEnabled = true — после обработчика все равно сбрасывается. Пишу на D7. Как можно решить проблему? Спасибо.
Re[3]: OPOS UPOS
От: _d_m_  
Дата: 06.06.07 12:45
Оценка:
Здравствуйте, StriderMan, Вы писали:

___>> void s_DataEvent(int Status)

___>> {
___>> this.label1.Text = this.s.ScanData;

___>> this.s.DeviceEnabled = true;

___>> this.s.DataEventEnabled = true;
___>> }


SM>Использую MSROPOS (OPOS ридер маг. карт). После возникновения события считывания карточки флаг DataEventEnabled сбрасывается в false. Пробовал, как вы написали, выставлять в обработчике DataEventEnabled = true — после обработчика все равно сбрасывается. Пишу на D7. Как можно решить проблему? Спасибо.


Не понял в чем проблема . Работаю и с MSR и использую точно такую же схему. Вот выдержка из стандарта OPOS:

The MSR Control follows the general input model for event-driven input:

· When input is received by the Control, it enqueues a DataEvent.

· If the AutoDisable property is TRUE, then the control automatically disables itself when a DataEvent is enqueued.

· An enqueued DataEvent can be delivered to the application when the DataEventEnabled property is TRUE. Just before delivering this event, the Control copies the data into properties, and disables further data events by setting the DataEventEnabled property to FALSE. This causes subsequent input data to be enqueued by the Control while the application processes the current input and associated properties. When the application has finished the current input and is ready for more data, it reenables events by setting DataEventEnabled to TRUE.

· An ErrorEvent (or events) are enqueued if the Control encounters an error while gathering or processing input, and is delivered to the application when the DataEventEnabled property is TRUE.

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.