Werte vom Software Barcode Scanner können nicht ausgelesen werden

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Werte vom Software Barcode Scanner können nicht ausgelesen werden

    Huhu
    Ich benutze einen Software Barcodescanner (der die Kamera des Laptops nutzt) und einen USB Scanner, um in meinem DataSet Artikel nach EANCode zu finden.
    In meinem alten Programm habe ich das im KeyPress Event der Form erledigt:

    VB.NET-Quellcode

    1. If Integer.TryParse(e.KeyChar, number) Then
    2. Ean &= number.ToString

    Dies lieferte mir für beide Scanner nacheinander die Zahlen des Barcodes, welche dann eben den EAN Code ergeben. Mit Enter geht die Suche los.

    In meinem neuen Programm nutze ich nun nicht mehr das KeyPress Event (weils auf meinen UserControls nicht triggert), sondern helfe mir mit:

    VB.NET-Quellcode

    1. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    2. If _EANSearch Then
    3. If keyData.IsBetween(Keys.D0, Keys.D9) Then
    4. If IsWritableControlFocused() Then Return MyBase.ProcessCmdKey(msg, keyData)
    5. AddKeyValueToEAN(keyData)
    6. Return True
    7. ElseIf keyData = Keys.Enter Then
    8. StartEANSEarch()
    9. Return True
    10. End If
    11. End If
    12. Return MyBase.ProcessCmdKey(msg, keyData)
    13. End Function

    Das funktioniert ganz wunderbar mit meinem Bluetooth scanner. Aber nicht mit meinem Software Scanner.
    Dieser gibt mir als ​keyData ein ​Packet {231}.
    Ich befürchte, dass ich in diesem Fall den gesamten Barcode mit Suffix (Enter) quasi in einem in meiner Sub habe? Ich habe also keine Chance auf den Barcode zuzugreifen?

    DerSmurf schrieb:

    weils auf meinen UserControls nicht triggert
    Stichwort Root Cause Analysis. Warum triggert es nicht?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also ich glaube ja, du bist Lehrer von Beruf :o)
    Immer diese Hausaufgaben ...

    In meiner Welt hatte jemand auf StackOverFlow das gleiche Problem, und obiger Code wurde als Lösung präsentiert. Ich war fein damit und nutze es auf jeder meiner UserControls.
    Aber ich habe die Aufgabe verstanden :o)

    Ich werde Rückmeldung geben.

    edit: @VaporiZed alles was ich finde ist, dass das UserControl nunmal kein Keypress und KeyDown hat. Mir würde als Lösung jetzt nur einfallen evtl. das Keypress / Keydown der Mainform zu nehmen und zu prüfen, welches UC angezeigt wird.
    Das allerdings für alle UCs zu implementieren, wäre recht viel Code auf der MainForm und erscheint mir daher unsauber.
    Für eine UC die KeyEvents der Mainform abfangen und für alle anderen in der UC selbst, erscheint mir auch unsauber.
    Darf ich einen kleinen Hinweis bekommen?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DerSmurf“ ()

    DerSmurf schrieb:

    dass das UserControl nunmal kein Keypress und KeyDown hat.
    So was nenne ich nicht UserControl.
    Welche Basisklasse hat Dein "Ding"?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nein, ich bin kein Lehrer und meine Frage war keine Prüfungsfrage. Dass das UC kein KeyPress-, …-Event hat, ist falsch (formuliert), es reagiert einfach nicht, sobald es ein anderes fokussierbares Control enthält. Ok, da kann man wohl nach ersten Recherchen auch nix dagegen tun, außer die ProcessCmdKeys-Methode.
    Allerdings versteh ich das Prinzip nicht. Warum sollte überhaupt das UC darauf reagieren? Bei den Programmen, mit denen ich im Zusammenhang mit Warenscannung arbeite, muss ein Eingabe-Control fokussiert sein. Und das reagiert dann auf die Daten. Bei meinen Ergänzungsprogrammen ist es tw. so, dass auf einem Form mehrere Controls sind, die da was verarbeiten können. Und abhängig davon, in welchem Control sich der User/Fokus befindet, passiert was anderes mit den Daten.

    DerSmurf schrieb:

    Für eine UC die KeyEvents der Mainform abfangen und für alle anderen in der UC selbst
    Versteh ich leider inhaltlich nicht.

    btw:

    DerSmurf schrieb:

    Mit Enter geht die Suche los.
    Ein Scanner würde diesen Tastendruck gleich mitsenden, was bei Dir aber durch Integer.TryParse rausgefiltert wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Ich hatte des öfteren mit Barcode-Scannern zu tun, die habe ich alle von Tastatur auf RS232- bzw. USB-Eingang umprogrammiert und konnte das DataReceived-Event der RS232 nutzen, da konntest Du nebenbei mit Word einen Brief schreiben, der Barcode kam an, wo er hingehörte.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nuja, könnte bei Softwarescannern interessant werden. Da stellt sich die Frage, ob die so mit RS232-Modus eingestellt werden können.
    @DerSmurf: Verrätst Du uns, welchen Du da verwendest? Vielleicht können wir so das Problem lösen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich verwende datasymbol.com/barcode-scanner…ode-scanner-overview.html

    Mein kompletter Tastaturabfragecode sieht so aus (hatte ich im ersten Post als irrelevant weggelassen): Dieser funktioniert wie gesagt, mit dem Bluetooth scanner auch astrein.
    Und beide Scanner geben nach dem EAN Code natürlich auch Enter mit.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    2. If _EANSearch Then
    3. If keyData.IsBetween(Keys.D0, Keys.D9) Then
    4. If IsWritableControlFocused() Then Return MyBase.ProcessCmdKey(msg, keyData)
    5. AddKeyValueToEAN(keyData)
    6. Return True
    7. ElseIf keyData = Keys.Enter Then
    8. StartEANSEarch()
    9. Return True
    10. End If
    11. End If
    12. Return MyBase.ProcessCmdKey(msg, keyData)
    13. End Function
    14. Private Function IsWritableControlFocused() As Boolean
    15. If TBSuche.Focused Then Return True
    16. Return False
    17. End Function
    18. Private Sub AddKeyValueToEAN(keydata As Keys)
    19. Select Case keydata
    20. Case = Keys.D1 : _EANCode &= "1"
    21. Case = Keys.D2 : _EANCode &= "2"
    22. Case = Keys.D3 : _EANCode &= "3"
    23. Case = Keys.D4 : _EANCode &= "4"
    24. Case = Keys.D5 : _EANCode &= "5"
    25. Case = Keys.D6 : _EANCode &= "6"
    26. Case = Keys.D7 : _EANCode &= "7"
    27. Case = Keys.D8 : _EANCode &= "8"
    28. Case = Keys.D9 : _EANCode &= "9"
    29. Case = Keys.D0 : _EANCode &= "0"
    30. End Select
    31. End Sub
    32. Private Sub StartEANSEarch()
    33. Dim Dts = DirectCast(BSMain.DataSource, DtsDaten)
    34. Dim EANSearch As New EANSuche(_EANCode, Dts, _ListOfCompaniesToOrder)
    35. Dim item = EANSearch.ReturnItemByEAN
    36. If item.Found Then
    37. If _AutoIncrement Then IncreaseItemAmountByOne(item.Row)
    38. BSArtikel.Position = EANSearch.FindX(BSArtikel, item.Row)
    39. End If
    40. _EANCode = ""
    41. End Sub

    Das einzige writableControl auf dieser Form, ist eine Suchen Textbox, damit der User die Artikel BS filtern kann.
    Ansonsten ist die Verwendung so gedacht, dass einfach ein EAN Code gescannt wird, je nach Einstellung wird der Artikel dann ausgewählt, oder ausgewählt und die Bestellmenge um 1 erhöht.
    Der User scannt jetzt einfach weiter, oder den Artikel erneut um die Menge erneut um 1 zu erhöhen.
    Außerdem kann er über Buttons (Touch Tasten), die Bestellmenge manuell anpassen.
    Wichtig dabei war mir, dass einfach gescannt werden kann und nicht vorher irgendwas angeklickt werden muss.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DerSmurf“ ()

    Das genannte Programm ist in der Demoversion leider nicht für Tests zu gebrauchen.
    Tja, dann bleibt wohl doch nur: Merken, welches UC aktiv ist und vom MainForm die gefilterten ScanDaten dorthin schicken.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielleicht klappt es ja so: Das MainForm sammelt im KeyPress-Event die Daten und wenn das UC das Packet {231} empfängt, schickt es ne Nachricht per Event ans MainForm: "gib mir mal die empfangenen Daten". Es darf pro Scan natürlich nur einmal das UC-Event gefeuert werden, auch wenn mehrere Packets kommen. Also musst Du noch eine Wiederholung stoppen, z.B. indem erst dann das Event wieder scharf gestellt wird, wenn beim MainForm die Entertaste als Abschlussignal angekommen ist. Das führt natürlich dazu, dass Du nicht mehr nur mit Integer.Parse arbeiten kannst. Auch musst Du schauen, was in welcher Reihenfolge kommt. Erst alle UC-ProcessCmdKeys-Nachrichten? Oder erst die MainForm-KeyPreview-KeyPresses? Oder abwechselnd?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Vielleicht klappt es ja so: Das MainForm sammelt im KeyPress-Event die Daten und wenn das UC das Packet {231} empfängt, schickt es ne Nachricht per Event ans MainForm

    Aber warum so kompliziert?
    Wenn das Mainform eh die Keypress Daten abbonieren soll, kann ich sie doch auch gleich ans UC weiter geben?
    So in etwa:

    VB.NET-Quellcode

    1. 'MainformCode
    2. Private Sub frmHaupt_KeyPress(sender As Object, e As KeyPressEventArgs) Handles MyBase.KeyPress
    3. If TCHaupt.SelectedTab Is TPBestellung Then UcBestellung.Buttonpressed(e)
    4. End Sub
    5. 'UCCode
    6. Public Sub Buttonpressed(e As KeyPressEventArgs)
    7. If _EANSearch Then
    8. Dim number As Integer
    9. If Integer.TryParse(e.KeyChar, number) Then
    10. If Not IsWritableControlFocused() Then _EANCode &= number.ToString
    11. End If
    12. End If
    13. MessageBox.Show(_EANCode)
    14. End Sub
    15. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    16. If _EANSearch AndAlso keyData = Keys.Enter Then
    17. StartEANSEarch()
    18. Return True
    19. Else
    20. Return MyBase.ProcessCmdKey(msg, keyData)
    21. End If
    22. End Function

    Den Subnamen buttonpressed würde ich jetzt nochmal überdenken. Und ich habe auf meinem Programmier PC den Barcodescanner nicht, also kann gerade nicht testen.
    Aber das sollte funktionieren, denn wie gesagt, im alten Programm nutze ich das KeyPress Event und erhalte vom Software Scanner alle Zahlen nacheinander.

    Mein Problem mit dieser Lösung ist nur, dass ja die Mainform für das UC die Key Daten erhält Alle anderen Usercontrols machen das selbst (mit Protected Overrides Function ProcessCmdKey).
    Aber scheinbar gehts ja an dieser Stelle nur so.

    DerSmurf schrieb:

    warum so kompliziert?
    Weil Du auf

    VaporiZed schrieb:

    dann bleibt wohl doch nur: Merken, welches UC aktiv ist und vom MainForm die gefilterten ScanDaten dorthin schicken.
    nicht reagiert hast. Ich dachte, dass das nicht ginge. Aber warum reagieren einige UCs so und ein anderes so?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ah sorry. Den Teil von dir hatte ich anders verstanden.

    Es reagieren alle UCs gleich.
    Auf jeder UC habe ich zur Tastenabfrage die ProcessCmdKey Funktion.
    Ich habe mir gedacht, die UCs können ihre Tastendrücke ja damit selber handeln, hat das Mainform nix mit zu tun.
    Durch obige Änderung ändert sich das jetzt für eine UC. Alle holen ihre Daten selbst, außer die BestellUC, die bekommt sie (teilweise) von der Mainform.
    Das fühlt sich irgendwie unrichtig an.
    Und dieses KeyEvent auf der Mainform wird gefühlt 500mal am Tag sinnlos (weil andere UC ausgewählt) triggern.

    DerSmurf schrieb:

    Auf jeder UC habe ich zur Tastenabfrage die ProcessCmdKey Funktion.
    Die aber doch gar nicht wegen des SoftwareScanners funktioniert. Von daher sind doch alle UCs betroffen, oder?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nein.
    Den Scanner setze ich fast nur auf der UCBestellung ein. Er eignet sich wunderbar für meine selbsterstellten Regalschilder, ist aber unfassbar schlecht für eans auf Artikeln (wahrscheinlich weil auch meine Tabletkamera nicht die beste ist)
    Auf anderen UCs nutze ich die Tastaturüberwachung, um z.b. automatisch in Suchenfelder zu schreiben, ohne das Control jedes Mal auswählen zu müssen.
    Hi.

    Das mit dem aktivem Control (auch das geliebte UC) und dem Fokus auf UC´s sind immer die Stolpersteine.

    Es ist möglich ein Empfänger-Control extra dafür immer im Fokus zu halten, natürlich mit Zuschaltung und Abschaltung (Aktiv für Empfang).
    Diese kann ein separates Window sein, oder auf dem Hauptfenster festgetackert und allzeit bereit.

    Dann was dort hinein gescannt wird (Keypress) in dein UC weiterleiten, nur als Text.

    Sollten es mehr Barcodes sein, kann eine Sequenz abgebildet werden.
    EAN zuerst digital abhaken (Boolean >>> EAN_gescannt) dann erst auf zweiten Barcode warten und dann zweit_BC_gescannt abhaken,
    wenn beide dann wieder in den Ausgangszustand.

    Die Person muss sich an die Sequenz halten. Zwar doof, aber besser wartbar.
    Die Sequenz kann auch mit unterschiedlichen Barcodes automatisiert zugeordnet werden,
    wenn eine Barcode-Typenkennung implementiert wird.

    Also am besten die gescannten Sachen vorbereiten/vorsortieren/etc. (Pre-Process) und
    im Anschluss als Parameter-Wert an dein UC/UC-Methode weiterleiten.

    "Erinnert mich an damals, wo ich noch auf Türsteherei auf Lehramt gemacht habe.
    Vorsortieren hat echt geholfen, gab später weniger Ärger.
    Außerdem immer nur eine Tür auf einmal, sonst stimmt die Kasse nicht."

    c.u. Joshi aus HH
    Was mir noch einfällt: Pauschal das MainForm.Key…-Event abonnieren und im EventHandler die Daten ans betroffene UC weiterleiten, aber nur dann MainForm-KeyPreview auf True schalten, wenn das entsprechende UC angewählt wurde/aktiv ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.