Avatar billede trumf Nybegynder
09. oktober 2005 - 01:08 Der er 32 kommentarer og
1 løsning

eventhandler til stregkodescanner

Hejsa E

Jeg sidder og skal lave en lille app. til en stregkodescanner og har læst lidt om emnet rundt omkring. Jeg har fundet noget om det her:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ccl/html/P_Microsoft_PointOfService_Scanner_ScanDataLabel.asp
men der står intet om hvor man får fat i namespacet dertil.
Jeg har fundet ud af, at jeg skal bruge Scanner.DataEvent som fanger hver gang der laves en scanning.
Scanner.DataEvent ligger i Microsoft.PointOfService.BaseServiceObjects.ScannerBase.ScanDataEvent, som findes i dll'en Microsoft.PointOfService.dll
Microsoft.PointOfService.dll er en del af POS.NET som jeg har fundet frem til er et framework til andre computere som kasseapperater osv.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ccl/html/H_home.asp

POS.NET er åbenbart det samme som WEPOS http://www.microsoft.com/windows/embedded/wepos/default.mspx

Det korte og det lange er, at jeg ikke kan finde ud af hvordan jeg får fat i den dll, så jeg kan kode noget af det her. kan nogen hjælpe med det (jeg antager at den er gratis til udviklere) ellers må nogen kunne finde ud af at hjælpe mig med at skrive sådan en eventhandler selv.

På forhånd tak.
Avatar billede ksoren Nybegynder
09. oktober 2005 - 01:27 #1
Avatar billede trumf Nybegynder
09. oktober 2005 - 17:03 #2
Super!

Kender du noget til Scanner.DataEvent for jeg er helt blank.
Jeg kunne godt bruge en hånd til at komme i gang :)
Avatar billede prec Nybegynder
10. oktober 2005 - 16:12 #3
De fleste scannere følger der et SDK med til, hvilket mærke er din scanner?
Avatar billede prec Nybegynder
10. oktober 2005 - 16:17 #4
Men hvis du endelig vil bruge POS, så ser det umiddelbart ud til at du bare skal fange Scanner.DataEvent eventet og når det så bliver skudt afsted, læser du fra Scanner.ScanData som er en byte[]

Ganske simpelt
Avatar billede trumf Nybegynder
17. oktober 2005 - 22:12 #5
Ja, sorry, men jeg har ikke fået nogle mails om at her var sket noget, så det er lidt svært at følge med i Eksperten....

Der er et SDK (mærket er Symbol), men det er ikke helt godt skrevet og det er til compact framework. Jeg har læst flere dårlige beskrivelser af det.

Jeg er helt blank mht at fange den dataevent, så måske et lille eksempel på hvordan man skriver sådan en :) Jeg skal nok selv skrive koden til hvad det skal gøre, men hvordan laves sådan en funktion ?

Jeg forestiller mig til at jeg i min MDI parent laver noget med:

using ???
...
...
public void ScanDataEvent()
{
  DataEvent de = new Scanner.DataEvent();
  string scan = de.ScanData.ToString();
  ....
}

Hvordan læser jeg den byte ?
Avatar billede prec Nybegynder
18. oktober 2005 - 15:36 #6
Følgende skal være i en formens constructor eller lign.

// Scanner objectet initialiseres
Scanner scanner = new Scanner();
// Her tilføjer du en eventhandler til scannerens dataevent, funktionen OnScan bliver kørt når et scan finder sted.
scanner.DataEvent += new DataEventHandler(OnScan);

Dette skrives self uden for constructoren, da det er en ny funktion

protected void OnScan(object sender, DataEventArgs e)
{
    string barcode = "";

    byte[] data = ((Scanner)sender).ScanData;
    foreach(byte b in data)
          barcode += Convert.ToChar(b);
}

Så skulle variablen string i OnScan til sidst gerne indeholde den indscannede stregkode, der skal lige gøres opmærksom på at intet af dette er testet, så jeg tager forbehold for tastefejl eller lign.
Avatar billede prec Nybegynder
18. oktober 2005 - 15:37 #7
Jeg er på mit arbejde selv ved at lave et lign. projekt, eller det vil sige, vi er ved at overveje hvilke scanner enheder vi skal bruge.

Har du evt et sted hvor jeg kan læse om de scanner enheder i har brugt, og kan du evt oplyse hvad i har givet for dem stykket?

De billigeste vi har kunne finde indtil videre der kører pocket pc 2003, koster ca. 16500 stykket, hvilket er rimelig pebret.
Avatar billede trumf Nybegynder
18. oktober 2005 - 21:01 #8
Jeg bruger symbol LS2208 (http://www.symbol.com/products/barcode_scanners/barcode_hh_ls2200.html) Det er ikke til PPC men til alm stationær med USB
Jeg har læst en del om scannere, og skal også selv bruge nogle til PPC senere. Mit valg er faldet på symbol, men jeg skal ærlig talt ikke kunne soge om det er det bedste. Det er dog det mærke der er mest tilgængeligt her i landet i form af variationer og udbud, og så har de overkommelige priser.

Her er forskellige scannere til mobile enheder. Læg specielt mærke til den der er mindre end en papirclips http://www.symbol.com/products/oem/oem_scan_engine_data_sheets.html

Her er en rimelig billig stregkodelæser til PDA. Den koster under 2500, så det skulle da være muligt at lave en PDA med scanner for under 6000,-
http://www.pdashoppen.dk/products/productinfo.aspx?ExtProductID=IS5300-464

Jeg prøver lige at lege med den kode du foreslår :)
Avatar billede trumf Nybegynder
18. oktober 2005 - 21:06 #9
Avatar billede prec Nybegynder
18. oktober 2005 - 21:06 #10
Tja der er desværre ikke noget jeg kan bruge der.

Jeg arbejder i en stor transport virksomhed. Vi skal købe ca 100 enheder til vores trucks, som skal være både robuste og nemme at bruge på et lager.

Vi har kig på nogen fra Psion og Handheld Products.

Men anyway, hjalp det jeg skrev?
Avatar billede prec Nybegynder
18. oktober 2005 - 21:08 #11
Avatar billede trumf Nybegynder
18. oktober 2005 - 21:26 #12
Jeg har ikke prøvet det endnu, skulle lige godkende en anmeldelse på min vinguide og så kom der folk på vinchatten...
Avatar billede trumf Nybegynder
18. oktober 2005 - 22:35 #13
Jeg er ikke sikker på at koden er det rigtige sted og at jeg bruger det rigtige namespace, for der kommer røde streger under det med scandataevent

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using Microsoft.PointOfService.BaseServiceObjects;
using Microsoft.PointOfService.BasicServiceObjects;

namespace VinGuideDataSharing
{
    /// <summary>
    /// Summary description for MainForm.
    /// </summary>
    public class MainForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.MainMenu mainMenu1;
        private System.Windows.Forms.MenuItem menuItem1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
       
        private System.ComponentModel.Container components = null;
        private System.Windows.Forms.MenuItem menuItem3;
        ....

        public MainForm()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            Functions fcn = new Functions();
            Constants cnt = new Constants();

            SearchForm SearchForm = new SearchForm();
            SearchForm.MdiParent = this;
            SearchForm.Show();
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool 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()...
        #endregion

        Scanner myScanner = new Scanner();
        myScanner.DataEvent += new DataEventHandler(OnDataEvent); 

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new MainForm());
        }

        private void mnuClose_Click(object sender, System.EventArgs e)...
        private void mnuSync_Click(object sender, System.EventArgs e)...
        private void menuItem1_Click(object sender, System.EventArgs e)...
        private void mnuOmProg_Click(object sender, System.EventArgs e)...
        private void MainForm_Closed(object sender, System.EventArgs e)...
        private void mnuSearch_Click(object sender, System.EventArgs e)...
    }
}
Avatar billede trumf Nybegynder
18. oktober 2005 - 22:38 #14
myScanner.DataEvent += new DataEventHandler(OnDataEvent);
                    --    ----------------            -
Invalid token '+=' in class, struct, or interface member declaration
Class, struct, or interface method must have a return type
Identifier expected
Avatar billede trumf Nybegynder
18. oktober 2005 - 22:39 #15
hov...  -- skal være under += den lange under dataeventhandler og den sidste under den sidste parantes!
Avatar billede trumf Nybegynder
18. oktober 2005 - 22:41 #16
Det er helt sikkert noget af det rigtige, men der mangler åbenbart lige noget...
http://www.eggheadcafe.com/ng/microsoft.public.windows.embedded.pointofservice/Jul2005/post23140878.asp
Avatar billede prec Nybegynder
19. oktober 2005 - 09:34 #17
Ud fra det link du skrev der kan det se ud til at stregkoden skal oversættes med ASCII encoding. Jeg skriver lige en ny OnScan funktion.

protected void OnScan(object sender, DataEventArgs e)
{
    System.Text.Encoding ascii = System.Text.Encoding.ASCII;
    string barcode = ascii.GetString(((Scanner)sender).ScanData);
}

Hvis det ikke var her du var gået i stå, så beskriv lige hvad du mangler.
Avatar billede prec Nybegynder
19. oktober 2005 - 09:36 #18
Eller for at gøre det endnu simplere:

protected void OnScan(object sender, DataEventArgs e)
{
    string barcode = System.Text.Encoding.ASCII.GetString(((Scanner)sender).ScanData);
}
Avatar billede prec Nybegynder
19. oktober 2005 - 15:54 #19
Jeg læste lige det kode du havde skrevet lidt nærmere igenne, du har placeret den kode jeg fortalte dig, uden for en funktion... det kan man ikke.

Placer
Scanner myScanner = new Scanner();
myScanner.DataEvent += new DataEventHandler(OnScan);


public MainForm() funktionen.


og så skal dette her stå uden for funktion:

protected void OnScan(object sender, DataEventArgs e)
{
    string barcode = System.Text.Encoding.ASCII.GetString(((Scanner)sender).ScanData);
}

Du er vist ikke så meget inde i programmering? ;)
Avatar billede trumf Nybegynder
19. oktober 2005 - 18:58 #20
Nej, jeg er webprogrammør, så alt det her med namespaces og assemblys er nyt for mig.
En eventhandler er noget man lægger i <body> ;-)

Jeg har nu lagt det ind i mainform funktionen og får nu nogle andre fejl.
Jeg har lavet en reference til Microsoft.PointOfService.dll og Microsoft.PointOfService.ControlBase.dll
Jeg har lavet en "using Microsoft.PointOfService.BaseServiceObjects;"

Jeg får fejlen:
The type or namespace name 'DataEventArgs' could not be found (are you missing a using directive or an assembly reference?)

Der er streg under "DataEventArgs" i funktionen:
protected void OnScan(object sender, DataEventArgs e)
{
    string barcode = System.Text.Encoding.ASCII.GetString(((Scanner)sender).ScanData);
}

-----------------------------------------------------------------------------------------
her er det hele samlet:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using Microsoft.PointOfService.BaseServiceObjects;

namespace VinGuideDataSharing
{
    /// <summary>
    /// Summary description for MainForm.
    /// </summary>
    public class MainForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.MainMenu mainMenu1;
        private System.Windows.Forms.MenuItem menuItem1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
       
        private System.ComponentModel.Container components = null;
        private System.Windows.Forms.MenuItem menuItem3;
        ....

        public MainForm()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            Functions fcn = new Functions();
            Constants cnt = new Constants();

            SearchForm SearchForm = new SearchForm();
            SearchForm.MdiParent = this;
            SearchForm.Show();

        Scanner myScanner = new Scanner();
        myScanner.DataEvent += new DataEventHandler(OnScan);
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool 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()...
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new MainForm());
        }

    protected void OnScan(object sender, DataEventArgs e)
    {
        string barcode = System.Text.Encoding.ASCII.GetString(((Scanner)sender).ScanData);
    }

        private void mnuClose_Click(object sender, System.EventArgs e)...
        private void mnuSync_Click(object sender, System.EventArgs e)...
        private void menuItem1_Click(object sender, System.EventArgs e)...
        private void mnuOmProg_Click(object sender, System.EventArgs e)...
        private void MainForm_Closed(object sender, System.EventArgs e)...
        private void mnuSearch_Click(object sender, System.EventArgs e)...
    }
}
Avatar billede trumf Nybegynder
19. oktober 2005 - 19:06 #21
Hvis jeg laver en:
using Microsoft.PointOfService.BaseServiceObjects.ScannerBase.ScanDataEvent;

får jeg fejlen:
'Microsoft.PointOfService.BaseServiceObjects.ScannerBase.ScanDataEvent' is inaccessible due to its protection level

er det ikke lige det der står noget om her:
http://www.eggheadcafe.com/ng/microsoft.public.windows.embedded.pointofservice/Jul2005/post23140878.asp
Det er bare lidt for indviklet til mig!
Avatar billede prec Nybegynder
19. oktober 2005 - 19:21 #22
For at finde det namespace du skal importere for at bruge DataEventArgs, skal du blot slå op på msdn og finde det.

Nu har jeg gjort det for dig:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ccl/html/T_Microsoft_PointOfService_DataEventHandler.asp

Som der står øverst på siden ligger dette object under Namespace: Microsoft.PointOfService

Så using Microsoft.PointOfService skulle være alt du behøver.
Avatar billede prec Nybegynder
19. oktober 2005 - 19:23 #23
det var self DataEventArgs jeg skulle finde:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ccl/html/T_Microsoft_PointOfService_DataEventArgs.asp

Men det er stadig i namespacet Microsoft.PointOfService
Avatar billede trumf Nybegynder
19. oktober 2005 - 19:34 #24
OK cool :)

Får fejlen:
Cannot create an instance of the abstract class or interface 'Microsoft.PointOfService.Scanner'

Der er streg under new
Scanner myScanner = new Scanner();
Avatar billede prec Nybegynder
19. oktober 2005 - 19:35 #25
okay, jeg må nok hellere lige downloade det POS og prøve at lave et demo program til dig, kigger lige på det.
Avatar billede trumf Nybegynder
19. oktober 2005 - 19:36 #26
Så går jeg igang med at se om jeg kan finde sådan en stregkodescanner der er billigere end 16500,-
Avatar billede prec Nybegynder
19. oktober 2005 - 19:55 #27
Okay, det der skal gøres er simpelthen at man skal oprette sin egen klasse der benytter ScannerBase.

Jeg har lavet en meget simpel implementering af den, jeg skriver den i næsten kommentar.

Du skal bare tilføje den some en ny fil i dit projekt, og så oprette et object af typen MyScanner i din form, så skulle du kunne få adgang til events og data osv, som beskrevet tidligere.
Avatar billede prec Nybegynder
19. oktober 2005 - 19:55 #28
using System;
using System.Collections;
using System.Text;
using Microsoft.PointOfService;
using Microsoft.PointOfService.BaseServiceObjects;
using Microsoft.PointOfService.BasicServiceObjects;

namespace VinGuideDataSharing
{
    public class MyScanner : ScannerBase
    {
        public MyScanner()
        {
        }

        public override string CheckHealth(HealthCheckLevel level)
        {
            return level.ToString();
        }

        public override string CheckHealthText
        {
            get { return this.CheckHealthText; }
        }

        public override DirectIOData DirectIO(int command, int data, object obj)
        {
            return new DirectIOData(data, obj);
        }
    }
}
Avatar billede trumf Nybegynder
19. oktober 2005 - 20:33 #29
Jeg fandt et par links til dig, men der er ikke mange der giver priser, så man skal nok skrive først.
http://www.delfi.com/dk/ListCatalog.asp?page_id=183
http://www.scan-it.dk/default.asp?Action=Details&Item=204
Jeg kan desuden anbefale NPT www.npt.dk som jeg har handlet med. De er ret gode når det kommer til pris og service.
Hvis du kontakter dem, så spørg efter Jørgen Barkholt, han er OK.
Avatar billede trumf Nybegynder
19. oktober 2005 - 20:34 #30
Husk desuden, at når man skal have 100 så koster ting ikke det samme som når man skal have 1 ;-)
Avatar billede trumf Nybegynder
19. oktober 2005 - 21:23 #31
OK nu kommer der ingen fejl men den fanger dog ikke scanner eventet....

Jeg tror jeg skal omprogrammere scanneren, så den simulerer com porten i stedet for et keypress... noget jeg læste om et andet sted.

Du har hjulpet rigtigt meget, så jeg har oprettet et spm mere du kan svare på her http://exp.dk/spm/657539 så kan du og ksoren dele dette spm, da han jo også svarede "rigtigt"
Tak til Jer begge :)
Avatar billede prec Nybegynder
19. oktober 2005 - 23:47 #32
Jeg har nu allerede kigget på hvad delfi og scan-it kan tilbyde, vi har masser af kontakter, så det behøver du ikke hjælpe med, men ting koster jo det ting gør, de scannere vi har kig på koster oprindeligt 21000 ex moms, og vi får dem til 16.5 pga antallet.

Men her er et svar, glad for at hjælpe.
Avatar billede trumf Nybegynder
17. november 2005 - 08:53 #33
Så lukker vi!
Takker til jer begge :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester