Autor Beitrag
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 21.12.11 21:35 
Hey Leute,

kann mir jemand helfen? Ich habe eine Methode ("LogIn") die eine TextBox sichtbar macht.
So und jetzt möchte ich, dass meine LogIn() Methode so lange wartet, bis in der TextBox Enter gedrückt wird und somit die Eingabe bestätigt wird.
Ich habe es mit dem KeyDown-Event probiert, aber ich schaffe es nicht, die LogIn() Methode anzuhalten ohne Multithreading zu benutzten oder das ganze hinzumurksen...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
               private void LogIn()
        {
            comStat = CommandStatus.LogIn;
            string _user, _pw;
            NewLine("     user: ");
            HiddenInputBox.Location = new Point(50, ComBox.Lines.Count() * 9);
            HiddenInputBox.Visible = true;
            HiddenInputBox.Focus();
            //warten...
            _user = HiddenInputBox.Text;
            HiddenInputBox.Clear();
            NewLine("     password: ");
            HiddenInputBox.Location = new Point(50, ComBox.Lines.Count() * 9);
            HiddenInputBox.Focus();
            _pw = HiddenInputBox.Text;
            comStat = CommandStatus.None;
        }

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private void InputBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode != Keys.Enter) return;
            switch (comStat)
            {
                case CommandStatus.LogIn:
                    //...
                    break;
            }
        }


Weis jemand eine Lösung? Ich habe nichts gegen Multi-threading, bloß sollte der Code dann vernünftig sein.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 21.12.11 21:54 
Einen zusätzlichen Thread brauchst du nicht, allerdings scheinst du ereignisorientierte Programmierung noch nicht so ganz verstanden zu haben ;)

Anstatt den ganzen Code in eine Methode zu packen, muss bei jedem Ereignis der jeweils nächste Schritt ausgeführt werden. Alles nach dem Warten-Kommentar muss also in den case-Zweig.

Um es etwas schöner zu machen, könntest du eine ApplyStatus-Methode implementieren, die den Status als Argument bekommt und die Benutzerschnitstelle entsprechend anpasst.

Um es ganz im Sinne der Objektorientierung umzusetzen, wäre der State-Pattern denkbar. Du schreibst dir für jeden Anzeigeschritt eine Klasse, die eine Methode implementiert, die das Formular vorbereitet und anschließend nachbereitet. Alle diese Klassen implementieren mit dieser Methode ein Interface. Die ermittelten Daten speicherst du in einer separaten Klasse. Also:

  • LoginData: Speichert die ermittelten Login-Daten
  • IUserInterfaceProvider: Interface mit den Methoden Prepare(LoginData, Form1) und HandleKeyDown(LoginData, KeyEventArgs), die ein neues IUserInterfaceProvider, zurückgeben kann, das dann den nächsten Schritt darstellt.
  • Form1 Erzeugt eine Instant von LoginData und dem ersten IUserInterfaceProvider, ruft dessen Methoden auf.

Andere Frage: Wieso machst du dir nicht ein Formular mit zwei TextBoxen, eine für den Benutzernamen und eine für das Passwort? Das wäre doch eher das, was ein Windows-Benutzer erwarten würde.

Für diesen Beitrag haben gedankt: C#
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 21.12.11 22:14 
Danke erst mal, ich werde es - aber erst morgen - mal ausprobieren.
Zu deiner Frage: Das Programm ist eigentlich auch nicht als normle WinForm gedacht, sondern als so eine Art Konsole. Könnte sein dass ich das mit der TextBox wieder ändere.
Trotzdem danke ich hab deine Idee verstanden.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 21.12.11 22:51 
user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
Das Programm ist eigentlich auch nicht als normle WinForm gedacht, sondern als so eine Art Konsole.

Wenn du eine richtige Konsolenanwendung erstellst, brauchst du keine Ereignisse zu verwenden und kannst so programmieren wie den Code aus dem ersten Beitrag. Für einfache Anwendungen ist das tatsächlich oft komfortabler und übersichtlicher.
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 29.12.11 17:49 
Also ich habs jetzt so gemacht, dass ich die Anmeldung (Name und Passwort) in einem Panel anzeigen lasse und bei drücken der Enter-Taste dann die Eingabe vergleiche. Funktioniert prima.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private void LoginBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode != Keys.Enter) return;
            ComRunBox.BackColor = Color.Navy;
            if (String.IsNullOrEmpty(UserBox.Text + PwBox.Text) || UserBox.Text.GetHashCode() != UserId || PwBox.Text.GetHashCode() != Pw)
            {
    //blabla
            }
      //blabla
        }

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler