#c# #windows-ce
#c# #windows-ce
Вопрос:
у меня есть этот код от Motorola, который может сканировать штрих-код в Windows-CE
это работает отлично, но как создать любой класс, с которым могут работать все мои формы
этот сканер?
класс scanner:
using System;
using System.Data;
using System.IO;
using System.Windows.Forms;
namespace MyScann
{
/// <summary>
/// Summary description for Scanner.
/// </summary>
public class Scanner
{
public static Symbol.Barcode.Reader SymbolReader = null;
public static Symbol.Barcode.ReaderData SymbolReaderData = null;
public static System.EventHandler SymbolEventHandler = null;
public static DataSet CodeDataSet;
//public static Utils.Sound ReadErrorSound;
public static bool ScannerEnabled = false;
public static void ActivateScanner()
{
// If we have both a reader and a reader-data Object
if ( Scanner.SymbolReader != null amp;amp;
Scanner.SymbolReaderData != null amp;amp;
! Scanner.SymbolReaderData.IsPending )
{
// Submit 'Read'
try
{
Scanner.SymbolReader.Actions.Read(Scanner.SymbolReaderData);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
if ( err.InnerException != null )
MessageBox.Show(err.InnerException.Message);
}
}
}
public static void DeactivateScanner()
{
// If we have both a reader and a reader-data Object
if ( Scanner.SymbolReader != null amp;amp;
Scanner.SymbolReaderData != null amp;amp;
Scanner.SymbolReaderData.IsPending )
{
// Submit 'CancelRead'
try
{
Scanner.SymbolReader.Actions.CancelRead(Scanner.SymbolReaderData);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
if ( err.InnerException != null )
MessageBox.Show(err.InnerException.Message);
}
}
}
/// <summary>
/// Initialize the reader.
/// </summary>
/// <returns>False if an error accurs</returns>
public static bool InitSymbolReader()
{
// If reader is already present then fail initialize
if ( SymbolReader != null )
{
return false;
}
// Create new reader, first available reader will be used.
SymbolReader = new Symbol.Barcode.Reader();
// Create reader data
SymbolReaderData = new Symbol.Barcode.ReaderData(
Symbol.Barcode.ReaderDataTypes.Text,
Symbol.Barcode.ReaderDataLengths.DefaultText);
// set scanner read error sound
//ReadErrorSound = new Utils.Sound(ErrorSound);
return true;
}
/// <summary>
/// Stop reading and disable/close reader
/// </summary>
public static void DeinitSymbolReader()
{
try
{
// If we have a reader
if ( SymbolReader != null )
{
// Disable the reader
SymbolReader.Actions.Disable();
// Free it up
SymbolReader.Dispose();
// Indicate we no longer have one
SymbolReader = null;
}
// If we have a reader data
if ( SymbolReaderData != null )
{
// Free it up
SymbolReaderData.Dispose();
// Indicate we no longer have one
SymbolReaderData = null;
}
}
catch {}
}
/// <summary>
/// Enable most barcode type with no limitation on length
/// </summary>
public static void OpenAllBarcodes()
{
SymbolReader.Decoders.CODABAR.Enabled = true;
SymbolReader.Decoders.CODABAR.MinimumLength = 0;
SymbolReader.Decoders.CODABAR.MaximumLength = 0;
SymbolReader.Decoders.CODE11.Enabled = true;
SymbolReader.Decoders.CODE11.MinimumLength = 0;
SymbolReader.Decoders.CODE11.MaximumLength = 0;
SymbolReader.Decoders.CODE39.Enabled = true;
SymbolReader.Decoders.CODE39.MinimumLength = 0;
SymbolReader.Decoders.CODE39.MaximumLength = 0;
SymbolReader.Decoders.CODE93.Enabled = true;
SymbolReader.Decoders.CODE93.MinimumLength = 0;
SymbolReader.Decoders.CODE93.MaximumLength = 0;
SymbolReader.Decoders.CODE128.Enabled = true;
SymbolReader.Decoders.CODE128.MinimumLength = 0;
SymbolReader.Decoders.CODE128.MaximumLength = 0;
SymbolReader.Decoders.DATAMATRIX.Enabled = true;
SymbolReader.Decoders.DATAMATRIX.MinimumLength = 0;
SymbolReader.Decoders.DATAMATRIX.MaximumLength = 0;
SymbolReader.Decoders.D2OF5.Enabled = true;
SymbolReader.Decoders.D2OF5.MinimumLength = 0;
SymbolReader.Decoders.D2OF5.MaximumLength = 0;
SymbolReader.Decoders.I2OF5.Enabled = true;
SymbolReader.Decoders.I2OF5.MinimumLength = 0;
SymbolReader.Decoders.I2OF5.MaximumLength = 0;
SymbolReader.Decoders.EAN13.Enabled = true;
SymbolReader.Decoders.EAN13.MinimumLength = 0;
SymbolReader.Decoders.EAN13.MaximumLength = 0;
SymbolReader.Decoders.EAN8.Enabled = true;
SymbolReader.Decoders.EAN8.MinimumLength = 0;
SymbolReader.Decoders.EAN8.MaximumLength = 0;
SymbolReader.Decoders.PDF417.Enabled = true;
SymbolReader.Decoders.PDF417.MinimumLength = 0;
SymbolReader.Decoders.PDF417.MaximumLength = 0;
SymbolReader.Decoders.UPCA.Enabled = true;
SymbolReader.Decoders.UPCA.MinimumLength = 0;
SymbolReader.Decoders.UPCA.MaximumLength = 0;
SymbolReader.Decoders.UPCE1.Enabled = true;
SymbolReader.Decoders.UPCE1.MinimumLength = 0;
SymbolReader.Decoders.UPCE1.MaximumLength =0;
SymbolReader.Decoders.UPCE0.Enabled = true;
SymbolReader.Decoders.UPCE0.MinimumLength = 0;
SymbolReader.Decoders.UPCE0.MaximumLength = 0;
SymbolReader.Parameters.CodeIdType = Symbol.Barcode.CodeIdTypes.None;
SymbolReader.Parameters.ScanType = Symbol.Barcode.ScanTypes.Background;
SymbolReader.Parameters.LocalFeedback = Symbol.Barcode.DisabledEnabled.Enabled;
Scanner.SymbolReader.Parameters.Feedback.Success.BeepTime = 0;
}
}
}
что я использую в своей форме:
public void InitScanner(byte BatteryLevel)
{
// Create event handler delegate
if (Scanner.SymbolEventHandler == null)
{
Scanner.SymbolEventHandler = new EventHandler(this.SymbolReader_ReadNotify);
// Enable reader, with wait cursor
Scanner.SymbolReader.Actions.Enable();
Scanner.OpenAllBarcodes();
Scanner.ScannerEnabled = true;
}
// If we have both a reader and a reader data
if ((Scanner.SymbolReader != null) amp;amp;
(Scanner.SymbolReaderData != null))
{
// Submit a read
Scanner.SymbolReader.ReadNotify = Scanner.SymbolEventHandler;
Scanner.SymbolReader.Actions.Read(Scanner.SymbolReaderData);
}
}
public void SymbolReader_ReadNotify(object sender, EventArgs e)
{
Symbol.Barcode.ReaderData TheReaderData = Scanner.SymbolReader.GetNextReaderData();
if (TheReaderData.Result == Symbol.Results.SUCCESS amp;amp; (txtBarcode.Focused == true))
{
if (txtBarcode.Focused == true)
{
txtBarcode.Text = TheReaderData.Text.ToString();
SymbolReader_CycleScannerReader();
return;
}
}
SymbolReader_CycleScannerReader();
}
public void SymbolReader_CycleScannerReader()
{
Scanner.SymbolReader.Actions.Read(Scanner.SymbolReaderData);
}
public void StartScanner()
{
bool flag = false;
try
{
Scanner.SymbolEventHandler = null;
Scanner.DeinitSymbolReader();
Scanner.ScannerEnabled = false;
if (!Scanner.ScannerEnabled)
{
Scanner.SymbolEventHandler = null;
Scanner.InitSymbolReader();
InitScanner(100);
flag = true;
}
}
catch
{
Scanner.SymbolEventHandler = null;
Scanner.InitSymbolReader();
InitScanner(100);
flag = true;
}
finally
{
if (!flag)
{
MessageBox.Show("Scanner Error");
}
}
}
public void CloseScanner()
{
Scanner.SymbolEventHandler = null;
Scanner.DeinitSymbolReader();
}
в public Main()
я использую StartScanner();
и когда программа завершается, я использую: CloseScanner();
я прочитал штрих-код на txtBarcode
в своей форме
заранее спасибо
Комментарии:
1. В чем проблема? Пожалуйста, объясните, что не работает с вашим текущим кодом.
2. он работает только в одной форме, как сделать что-то общее, что будет работать во всех формах ?.
Ответ №1:
Не давая ТОЧНОГО ответа, который придумал наш офис, вот псевдокод того, что мы сделали. Аналогично, портативные сканеры имеют встроенную возможность сканировать и распознавать различные форматы штрих-кодов. Итак, что мы сделали, так это вложили код сканирования в нашу форму … что-то вроде
public class OurForm : Form
{
protected MyScannerClass oScanner
public OurForm()
{
// create your class no matter what form uses it (subclass from this class)
oScanner = new MyScannerClass();
// Now, force registration of your "scanning" event to pass the incoming
// string to THIS form's NewScan event.
oScanner.OnYourScannerScanEvent = NewScan();
}
// Now, this being a VIRTUAL, you can OVERRIDE this on each specific form and
// parse / interpret the data as needed... based on the specific field user is in,
// type of code (Code39, PDF417 (2d barcode), etc)
protected void NewScan( string StringParameterFromScannerHandler, otherParm ofScanType )
{
// do whatever cleanup / pre-validation that may be common to ALL forms you use...
// THEN pass on to secondary method to actually be overridden specific to each form
FormSpecificHandler( StringParameterFromScannerHandler, ofScanType );
}
protected virtual void FormSpecificHandler(
string StringParameterFromScannerHandler,
otherParm ofScanType )
{
}
public class YourSubForm : OurForm
{
protected override void FormSpecificHandler(
string StringParameterFromScannerHandler,
otherParm ofScanType )
{
if( YourCurrentField == Something and ofScanType = PDF417 )
{
// do whatever with your scan results...
}
}
}