Autor Beitrag
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: So 08.07.07 20:05 
Hallo Leute,

ich benutze einen Barcodescanner der direkt Tastatureingaben tätigt. Nun soll mein Programm ausschließlich über den Scanner arbeiten und habe mir deshalb zum Beispiel fürs speichern einen Barcode erstellt. Dieser heisst "...CONFIRM..."
Nun soll aber wenn dieser Barcode eingelesen wird das ganze nicht in das Textfeld geschrieben werden sondern ein Kommando erfolgen.

Das funktioniert auch. Nur schreibt er mir natürlich das "...CONFIRM..." mit rein.

Wie kann ich verhindern das er nur das nicht reinschreibt? Oder wie kann ich die Eingabe erstmal zwischenspeichern und dann wenn sie nicht eines der statischen Barcodes ist ausgeben?

(Habe versucht mit "e.Handled = true" im KeyPress Event das zu verhindern aber es verhindert nur dass das aktuelle Char nicht geschrieben wird..)

Nachfolgend mein Code:
KeyPreview der Form ist True und die Funktion "SetNextControlOnEnter" überschreibt das KeyPress Event der Form. GlobalConst ist meine Konstantenklasse.
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
       private string m_InputString;

        private Control GetNextEdit(Control aThisControl)
        {
            Control ctlNext = GetNextControl(aThisControl, true);

            if (ctlNext is MaskedTextBox)
                return ctlNext;
            else
                GetNextEdit(ctlNext);

            return null;
        }

        private void SetNextControlOnEnter(object sender, KeyPressEventArgs e)
        {
         if (e.KeyChar.ToString() == GlobalConst.ENTER)
          {
              if (VerifyInputString() == false)
              {
                  Control ctlNext = GetNextControl((Control)sender, true);
                  ctlNext = GetNextEdit(ctlNext);
                  if (ctlNext != null)
                      ctlNext.Focus();
              }
          }
            else
            {
                m_InputString += e.KeyChar.ToString();
            }
        }

        private Boolean VerifyInputString()
        {
            Boolean l_return = false;

            switch(m_InputString) 
            {
                case GlobalConst.CONFIRM:
                    MessageBox.Show("Bestätigen...");
                    l_return = true;
                    break;
                
                case GlobalConst.CANCEL:
                    MessageBox.Show("Abbrechen...");
                    l_return = true;
                    break;
                
                case GlobalConst.PREVIOUS:
                    MessageBox.Show("Zurück...");
                    l_return = true;
                    break;

                case GlobalConst.NEXT:
                    MessageBox.Show("Vor...");
                    l_return = true;
                    break;

                case GlobalConst.FIND:
                    MessageBox.Show("Finden...");
                    l_return = true;
                    break;

                case GlobalConst.CONFIG:
                    MessageBox.Show("Konfiguration...");
                    l_return = true;
                    break;
                default:
                    break;
            }
            m_InputString = "";

            return l_return;
        }
    }


Vielen Dank!

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Alpha_Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Di 10.07.07 07:51 
Eigener Lösungsvorschlag 1:
im KeyPress "e.Handled = true" und den eingegeben char in eine Klassenvariable. Ich filtere bei Enter den Befehl (z.B. "...CONFIRM...") mit Regex heraus führe ihn aus und schreibe den rest ins Control.
Vorteil: Der Benutzer sieht den Befehl nicht.
Nachteil: Der Benutzer sieht erst wenn er Enter drückt seine Eingaben.


Eigener Lösungsvorschlag 2:
Ich lasse alle Eingaben zu und filtere mit Regex nur bei Enter den Befehl heraus und lösche ihn aus dem Control.
Vorteil: Benutzer sieht sofort seine Eingaben kann wie gewohnt auch mit Tastatur arbeiten anstatt nur mit Scanner.
Nachteil: Benutzer sieht kurzzeitig den Befehl (1 - 2 sek.) -> kann auch verwirren.



Vielleicht hilft das ja dem ein oder anderen weiter.

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.