Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
GruppenSeparatoren werden im DMC nicht erkannt
moser69
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Schlesien

Themenstarter:

GruppenSeparatoren werden im DMC nicht erkannt

beantworten | zitieren | melden

Hallo Zusammen
ich eine GUI geschrieben wo als Eingangsdaten der Inhalt eine DMC übernommen werden soll. Leider werden die GS nicht erkannt … oder vom Scanner nicht übertragen (Cognex DM8050). Die Cognex Leute finden keine Lösung … :-(
Vielleicht liegt das aber auch an meiner Applikation …
!!! Und jetzt kommts: wenn ich den DMC in Notepad++ einscanne - sehe ich alles, inkl. GS, RS und EOT. Wenn ich jetzt diesen "Text" vom Notepad++ in meine GUI kopiere - funktioniert alles.
Als Eingangsfeld für die Scanner Daten nutze ich eine einfache TextBox … hier habe ich auch schon versucht einige Eigenschaften zu verändern - muss aber zugeben dass ich nicht alle kenne …
Programmiert habe ich in VS 2017 / C# / .NET FW 4.00

Ich würde mich über jeden Tipp / Lösung seeeehr freuen ! :-)

Gruß,
moser
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4131

beantworten | zitieren | melden

In welchem Format scannst du denn die Daten? Könntest du mal einen Beispieltext zeigen?
private Nachricht | Beiträge des Benutzers
moser69
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Schlesien

Themenstarter:

beantworten | zitieren | melden

Hallo
so sieht der code aus - allerdings die GruppenSepparatoren (die Kästchen hier) sind erst in Notepad++ sichtbar.
[)>0613V6439559581P285164571630000P1009170332320P0021P1006273801122P0031P1006262629132P00S96189060002B10ZREFLASH11Z31627909012Z10521825605137

Gruß,
moser
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4131

beantworten | zitieren | melden

Da es sich bei GS, RS und EOT um nicht druckbare Steuerzeichen (s. z.B. How do I put GS / RS / EOT into a PDF417 barcode?) handelt, können diese in einer Standard-TextBox nicht angezeigt werden.
Notepad++ benutzt anscheinend intern eine andere TextBox-Implementierung, welche eben auch Steuerzeichen sichtbar darstellt (ähnlich wie auch z.B. "MS Word" Tabs und Spaces optional anzeigen kann).

Scannst du den Code direkt in die TextBox oder benutzt du eine spezielle API dafür?
Wenn du den Text dann z.B. in eine Datei speicherst, siehst du dann mit einem Hexcode-Editor (oder z.B. Notepad++) dann die Steuerzeichen?

PS: Nur durch "Zitieren" deines Beitrags habe ich die Steuerzeichen gesehen, denn auch hier in der normalen Forenansicht werden diese nicht dargestellt. Selbst im Standard-Editor Notepad kann ich das herauskopierte Steuerzeichen zwar einfügen, aber es wird nicht dargestellt (aber beim Speichern ist das Steuerzeichen dann vorhanden)!

Edit: schau auch mal in Free Barcode Scanner ASCII String Decoder ;-)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
Taipi88
myCSharp.de - Member

Avatar #avatar-3220.jpg


Dabei seit:
Beiträge: 1044
Herkunft: Mainz

beantworten | zitieren | melden

Hi,

mal vom Grundsatz - ich persönlich als Nutzer erwarte eigentlich von einer Textbox nicht, dass diese irgendwelche Steuerzeichen darstellt - die sind ja für was anderes als zum Anzeigen gut.

Mit einem der vielen Key/Input-Ereignisse sollte man diese doch problemlos abfangen und verarbeiten können. Oder verstehe ich das Grundproblem nicht?

LG
private Nachricht | Beiträge des Benutzers
moser69
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Schlesien

Themenstarter:

beantworten | zitieren | melden

Ich scanne den DMC direkt in die TextBox - erwarte aber nicht, dass die Separattoren angezeigt werden. Ich habe eine Methode, die mir den DMC zerlegen soll und die einzelnenn Datensegmente anhand der GS ausliest. Diese Methode funktioniert mit einem anderen Scanner, den ich aber aus unterschiedlichen Gründen für meine Applikation nicht verwenden kann.
Ich habe einen Cognex DM8050, und mit dem habe ich das beschriebene Problem.
Leider konnten mir bis jetzt die Cognex Experten auch nicht weiter helfen.

Hier die Methode die ich nutze:

public static class DmcIdentifires
    {

        /// <summary>Extracts the element identified by the given identifier from the complete label String. The sections
        /// need to be divided by group separators</summary>
        /// <param name="identifier">The identifier of the section.</param>
        /// <param name="completeLabel">The complete label</param>
        /// <param name="index">The start index in the label of this identifier</param>
        /// <returns></returns>
        public static string GetContentForIdentifier(string completeLabel, string identifier)
        {
            // match [GS]1P (as look-around), then any code but GS or RS and then GS or RS, again as look-around
            // \p{P} contains punctuation 
            // [\w-[\x1d\x1e]] any word element but the GS or RS separators
            string regExPatternString = "(?≤\\x1d" + identifier + ")[\\u0020\\p{P}\\w-[\\x1d\\x1e]]{2,}((?=\\x1e)|(?=\\x1d))";
            var regex = new Regex(regExPatternString,
                RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
            var match = regex.Match(completeLabel);

            if (match == null || match.Length == 0)
            {
                return null;
            }
            else
            {
                return match.ToString();
            }
        }

    }
private Nachricht | Beiträge des Benutzers
Taipi88
myCSharp.de - Member

Avatar #avatar-3220.jpg


Dabei seit:
Beiträge: 1044
Herkunft: Mainz

beantworten | zitieren | melden

Hi,

was ich meinte ist in folgendem Artikel beschrieben:
https://docs.microsoft.com/de-de/dotnet/framework/winforms/how-to-handle-keyboard-input-at-the-form-level

LG
private Nachricht | Beiträge des Benutzers
moser69
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Schlesien

Themenstarter:

beantworten | zitieren | melden

Zitat von Th69
Wenn du den Text dann z.B. in eine Datei speicherst, siehst du dann mit einem Hexcode-Editor (oder z.B. Notepad++) dann die Steuerzeichen?
Wenn ich den Text von der TextBox (das was direkt vom Scanner kommt) in eine txt Datei speichere und die dann im Notepad++ öffne - sehe ich auch keine GS.

Vielleicht muss "nur" eine Eigenschaft der TextBox richtig gesetzt werden … ? :-(
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4131

beantworten | zitieren | melden

So eine Eigenschaft gibt es nicht.
Aber hänge dich mal an das KeyPress-Ereignis der TextBox (oder der Form, wie im Link von Taipi88 beschrieben).
Dort kannst du sie ja ebenfalls in eine Datei (oder z.B. als Hexwerte in die Debug-Ausgabe) schreiben lassen. Kommen die Steuerzeichen überhaupt an (werden also vom Scanner gesendet)?
private Nachricht | Beiträge des Benutzers
moser69
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Schlesien

Themenstarter:

beantworten | zitieren | melden

Zitat von Taipi88
Hi,

was ich meinte ist in folgendem Artikel beschrieben:
https://docs.microsoft.com/de-de/dotnet/framework/winforms/how-to-handle-keyboard-input-at-the-form-level

LG

Wenn ich versuche die Scanner Daten mit dem Ereignis PreviewKeyDown abzufangen - erkenne ich auch keine GS, … als ob sie vom Scanner gar nicht kommen.
Dann frage ich mich: was macht den Notepad++ dass ich sie sehen kann ?
Er musst sie irgendwie erkennen oder zumindest die Sacannerdaten mit den GS ergänzen … aber auch hier muss Notepad++ wissen wo sie hingehören …
Zu viele Sachen die ich nicht verstehe :-(
private Nachricht | Beiträge des Benutzers
moser69
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Schlesien

Themenstarter:

beantworten | zitieren | melden

Als Eingangsdaten für meine Methode zum Extrahieren des DMC nehme ich momentan den Text von meiner TextBox.
Wenn ich jetzt die Ereignisse Ereignis PreviewKeyDown oder KeyPress verwende, dann ist der Text noch null - so habe ich keine Eingangsdaten für meine Methode.

Wie kann ich dann anders die Daten vom Scanner anfangen ?
private Nachricht | Beiträge des Benutzers
MartinH
myCSharp.de - Member

Avatar #avatar-1761.gif


Dabei seit:
Beiträge: 183
Herkunft: Asperg

beantworten | zitieren | melden

Was sagt denn der debugger?
Welche Daten empfänst du denn?
Hast du dir die Rohdaten mal angeschaut (Empfangene Bytes)?
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4131

beantworten | zitieren | melden

Bei den KeyPress oder KeyDown-Ereignissen stehen die Daten in den übergebenen KeyPressEventArgs bzw. KeyEventArgs (bevor also das Zeichen dem TextBox-Text hinzugefügt wird) - dies sind aber Grundlagen.

Oder die Methode Form.WndProc überschreiben und nach passenden WM_CHAR oder WM_KEYDOWN-Nachrichten schauen (dafür sollte aber KeyPreview = true bei der Form gesetzt sein).
Alternativ gibt es auch noch die virtuelle Methode Control.ProcessKeyMessage dafür.
private Nachricht | Beiträge des Benutzers