none
Programm aus einer Methode heraus anhalten / stoppen RRS feed

  • Frage


  • Moin,

    eigentlich sollte ich mich heute mit dem textlichen Inhalt meiner Diplomarbeit beschäftigen, aber proggn macht einfach mehr Spaß ^^

    Ich habe ein Programm mit mehreren Methoden.

     

    private void button_apply_settings
    {
      control_textbox_of_input(); // soll Eingaben in allen Textboxen auf NUR Zahlen überprüfen
    
      // übernimm alle Werte für die weitere Verarbeitung
    }
    
    private void control_textbox_of_input()
    {
      int input; // only for tryparse procedure
      bool iresult1 = Int32.TryParse(tb_IlluminateTime.Text, out input);
      bool iresult2 = Int32.TryParse(tb_PictureTime.Text, out input);
      bool iresult3 = Int32.TryParse(tb_TriggerDelay.Text, out input);
      bool iresult4 = Int32.TryParse(tb_TriggerPulsWidth.Text, out input);
      bool iresult5 = Int32.TryParse(tb_VdDelay.Text, out input);
    
      if ((iresult1 != true) && (iresult2) && (iresult3) && (iresult4) && (iresult5))
                {
                    ErrorMessage_InputNumber04();
                }
    }
    


    control_textbox_of_input() überprüft also meine angegebenen Textboxen auf "NUR" Zahlen mit Int32.Parse ... steht in einer der TBs ein buchstabe oder ein anderes Zeichen, erhalte ich die Fehlermeldung ErrorMessage_InputNumber04() ... soweit, so gut :)

    Leider läuft mein Programm dann weiter.....Weshalb ist mir im Grunde schon klar. Ich sage in der Methode apply_button_settings(), dass die Eingaben überprüft werden sollen und im Zweifelsfall eine Fehlermeldung kommt. Von Abbruch ist da noch nirgens die Rede. Deshalb arbeitet er auch den weiteren Code einfach ab.

    Mein Problem ist, dass ich nicht weiß wie ich das Programm bei falscher Eingabe über die Methode hinaus anhalten kann. Ein "return;" mit in der if-Schleife hinter der ErrorMessage reicht nicht aus. Damit beendet er nur die Methode control_textbox_ofinput(). Ich würde gerne ein Flag setzen, und diese mit an die andere Methode übergeben, so dass ich eine Abfrage machen kann.

    Kann mir da jemand helfen. Oder gibt es eine elegantere Lösung?

     

    viele Grüße,

    Eathen

     

    Montag, 28. November 2011 11:42

Antworten

  • Hallo Eathen,

    wir können einfach einmal ein kleines Beispiel zusammen basteln:

    a) Erstell eine neue Windows Forms Applikation

    b) In das Form ziehst Du eine Textbox. (textBox1 heisst die dann ... wir lassen es jetzt einfach dabei!)

    c) In das Form ziehst Du nun noch einen Button. Auch den lässt Du einfach auf dem Standard Namen.

    d) nun machst Du einen Doppelclick auf den Button. Es sollte sich nun ein neues Fenster mit Code öffnen und Du bist mitten in einer Methode Button1_Click.

    e) Nun brauchen wir etwa, was bei dem Click auf den Button passieren soll (Jetzt kommt etwas Unsinn, aber das kann halt sonst was sein!). Ich würde einfach mal sagen, wir wollen eine MessageBox öffnen mit "Hurra!". Also können wir einfügen:
    MessageBox.Show("Hurra!");

    Soweit so gut - das kannst Du schon einmal testen. Nun wollen wir mal annehmen, das Hurra! darf nur erscheinen, wenn in der Textbox eine Zahl steht. Die Kontrolle ist jetzt sehr einfach, weil nur eine TextBox im Formular ist, aber wir schreiben eine neue Methode. Der Code kommt direkt über das "private void button1_click(object sender, EventArgs e)":
            private bool ValidateInput()
            {
                bool allSuccessfullParsed = true; // Eine lokale Variable, die wir auf false setzen, wenn eine EIngabe nicht geparst werden konnte.
                int number; // Eine Variable, in die wir die Eingabe "parsen" können.
                if (Int32.TryParse(textBox1.Text, out number))
                {
                    // Parsen erfolgreich! Wir machen mal den Hintergrund grün
                    textBox1.BackColor = Color.LightGreen;
                }
                else
                {
                    textBox1.BackColor = Color.Yellow;
                    allSuccessfullParsed = false;
                }

                return allSuccessfullParsed; // Rückgabe des Ergebnisses
            }

    Ok, was haben wir da erzeugt:
    a) Eine Methode - diese muss sich innerhalb der geschweiften Klammern einer Klasse befinden. Diese ist als "private" gekennzeichnet, was bedeutet, dass diese nur aus unserer Klasse heraus aufgerufen werden kann. Und "bool" ist der Rückgabewert.
    b) In der Methode definieren wir eine lokale Variable. Diese gibt an, ob wir bisher alles richtig verifizieren konnten. Da wir am Anfang sind, ist natürlich noch keine Verifizierung fehlgeschlagen und wir setzen die Variable gleich auf true.
    c) Nun kommt die Kontrolle. Dies kann alles mögliche enthalten. In diesem Fall wird einfach nur geschaut, ob die Eingabe in eine Zahl umgewandelt werden kann. Evtl. wichtig zu erwähnen: Dieses out Schlüsselwort besagt, dass die Funktion einen Wert in die angegebene Variable schreiben konnte. Und rückgabe ist hier auch ein Bool-Wert, der angibt, ob es erfolgreich war.
    d) Wenn es erfolgreich war, dann zeigen wir das, indem wir die Hintergrundfarbe verändern. Ebenso bei einem Fehler. Bei einem Fehler setzen wir aber auch noch allSuccessfullParsed auf false!
    e) Solche Blöcke kann man nun belibig viele haben.
    f) Am Ende geben wir mit dem return Befehl zurück, ob wir alles erfolgreich validieren konnten.

    Nun müssen wir nur noch den Button Click anpassen:
            private void button1_Click(object sender, EventArgs e)
            {
                if (!ValidateInput())
                {
                    MessageBox.Show("Bitte Kontrolliere alle Angaben in den gelben Feldern!");
                    return;
                }

                MessageBox.Show("Hurra!");
            }

    Was haben wir hier?
    a) Im if rufen wir ValidateInput auf. Die Methode gibt uns zurück, ob es erfolgreich war (true) oder fehlgeschlagen ist (false). Da wir aber nun etwas machen wollen, wenn false zurück kommt, müssen wir das noch mit dem NOT operator (!) versehen.
    b) Wenn nun die Validierung fehlgeschlagen ist, dann sagen wir dem User erst einmal, was Sache ist. Danach brechen wir die weitere Abarbeitung ab, indem wir mit return die Funktion beenden. Hinter return steht diesmal nichts, denn unsere Button1_Click Methode hat als Rückgabewert void, was als "Nichts" zu übersetzen wäre. Also geben wir auch nichts zurück - und hinter return kommt also nichts.

    Damit hätten wir ein kleines Beispiel, das Du etwas testen könntest ....

    Vielleicht hilft Dir dies etwas beim Verständnis der Abläufe und gibt Dir ein kleines Spiel-Projekt, das Du weiter ausbauen und testen könntest.

    Jetzt kommt nur noch eine weitere Sache hinzu - da weiss ich aber nicht, ob ich die jetzt erwähnen soll, oder ob ich Dich damit nur verwirre:
    Die einzelnen Frameworks haben schon ein paar Dinge eingebaut zur validierung von Eingaben. So kannst Du in den Eigenschaften vom Button "CausesValidation" finden. Und es gibt events für die Validierung. Aber das kannst Du am Anfang gerne noch ignorieren, wenn es Dir darum gehtm einen Einstieg in C# zu finden. Sobald Du aber C# soweit verstanden hast, sollten wir uns vielleicht auch noch einmal über diese Möglichkeiten unterhalten. (Dann sind Deine Entwicklungen deutlich sauberer und einfacher zu Pflegen und vor allem wirst Du dann teilweise deutlich weniger Arbeit haben.)

    Mit den besten Grüßen,

    Konrad

     

    • Als Antwort markiert Eathen Montag, 5. Dezember 2011 16:12
    Freitag, 2. Dezember 2011 10:02

Alle Antworten

  • Hi,

    auf Grund einer Falscheingabe das Program stoppen halte ich für einen falschen Weg.

    Du hast eine Windows Forms Applikation. n der Applikation wird ja meist eine Aktion ausgelöst, also z.B. ein Klick auf einen OK Button.

    Im Handler kannst Du dann etwas haben wie:
    if (!Validate())
    {
        // Show some message
        return;
    }

    // Do the work

    Sprich: Es geht nicht weiter, wenn die Eingaben nicht stimmen.

    Bezüglich deines Codes bedeutet das, dass Deine Methode control_textbox_of_input() ein bool zurückgeben sollte und Du abhängig vom returncode dann eben keine Aktion durchführst.

    Mit den besten Grüßen,

    Konrad

    Montag, 28. November 2011 11:48
  • Hallo Eathen,

    Hat Dir die Antwort geholfen?

    Grüße,
    Robert

    Freitag, 2. Dezember 2011 09:14
    Moderator
  • Moin Robert, ich glaube ich weiß was er meint, konnte es aber noch nicht umsetzen ^^ Ich muss nochmal genau nachlesen, wie das mit dem übergeben einer boolvariable von einer Methode zur nächsten geht. Grüße, Eathen.
    Freitag, 2. Dezember 2011 09:19
  • Hallo Eathen,

    wir können einfach einmal ein kleines Beispiel zusammen basteln:

    a) Erstell eine neue Windows Forms Applikation

    b) In das Form ziehst Du eine Textbox. (textBox1 heisst die dann ... wir lassen es jetzt einfach dabei!)

    c) In das Form ziehst Du nun noch einen Button. Auch den lässt Du einfach auf dem Standard Namen.

    d) nun machst Du einen Doppelclick auf den Button. Es sollte sich nun ein neues Fenster mit Code öffnen und Du bist mitten in einer Methode Button1_Click.

    e) Nun brauchen wir etwa, was bei dem Click auf den Button passieren soll (Jetzt kommt etwas Unsinn, aber das kann halt sonst was sein!). Ich würde einfach mal sagen, wir wollen eine MessageBox öffnen mit "Hurra!". Also können wir einfügen:
    MessageBox.Show("Hurra!");

    Soweit so gut - das kannst Du schon einmal testen. Nun wollen wir mal annehmen, das Hurra! darf nur erscheinen, wenn in der Textbox eine Zahl steht. Die Kontrolle ist jetzt sehr einfach, weil nur eine TextBox im Formular ist, aber wir schreiben eine neue Methode. Der Code kommt direkt über das "private void button1_click(object sender, EventArgs e)":
            private bool ValidateInput()
            {
                bool allSuccessfullParsed = true; // Eine lokale Variable, die wir auf false setzen, wenn eine EIngabe nicht geparst werden konnte.
                int number; // Eine Variable, in die wir die Eingabe "parsen" können.
                if (Int32.TryParse(textBox1.Text, out number))
                {
                    // Parsen erfolgreich! Wir machen mal den Hintergrund grün
                    textBox1.BackColor = Color.LightGreen;
                }
                else
                {
                    textBox1.BackColor = Color.Yellow;
                    allSuccessfullParsed = false;
                }

                return allSuccessfullParsed; // Rückgabe des Ergebnisses
            }

    Ok, was haben wir da erzeugt:
    a) Eine Methode - diese muss sich innerhalb der geschweiften Klammern einer Klasse befinden. Diese ist als "private" gekennzeichnet, was bedeutet, dass diese nur aus unserer Klasse heraus aufgerufen werden kann. Und "bool" ist der Rückgabewert.
    b) In der Methode definieren wir eine lokale Variable. Diese gibt an, ob wir bisher alles richtig verifizieren konnten. Da wir am Anfang sind, ist natürlich noch keine Verifizierung fehlgeschlagen und wir setzen die Variable gleich auf true.
    c) Nun kommt die Kontrolle. Dies kann alles mögliche enthalten. In diesem Fall wird einfach nur geschaut, ob die Eingabe in eine Zahl umgewandelt werden kann. Evtl. wichtig zu erwähnen: Dieses out Schlüsselwort besagt, dass die Funktion einen Wert in die angegebene Variable schreiben konnte. Und rückgabe ist hier auch ein Bool-Wert, der angibt, ob es erfolgreich war.
    d) Wenn es erfolgreich war, dann zeigen wir das, indem wir die Hintergrundfarbe verändern. Ebenso bei einem Fehler. Bei einem Fehler setzen wir aber auch noch allSuccessfullParsed auf false!
    e) Solche Blöcke kann man nun belibig viele haben.
    f) Am Ende geben wir mit dem return Befehl zurück, ob wir alles erfolgreich validieren konnten.

    Nun müssen wir nur noch den Button Click anpassen:
            private void button1_Click(object sender, EventArgs e)
            {
                if (!ValidateInput())
                {
                    MessageBox.Show("Bitte Kontrolliere alle Angaben in den gelben Feldern!");
                    return;
                }

                MessageBox.Show("Hurra!");
            }

    Was haben wir hier?
    a) Im if rufen wir ValidateInput auf. Die Methode gibt uns zurück, ob es erfolgreich war (true) oder fehlgeschlagen ist (false). Da wir aber nun etwas machen wollen, wenn false zurück kommt, müssen wir das noch mit dem NOT operator (!) versehen.
    b) Wenn nun die Validierung fehlgeschlagen ist, dann sagen wir dem User erst einmal, was Sache ist. Danach brechen wir die weitere Abarbeitung ab, indem wir mit return die Funktion beenden. Hinter return steht diesmal nichts, denn unsere Button1_Click Methode hat als Rückgabewert void, was als "Nichts" zu übersetzen wäre. Also geben wir auch nichts zurück - und hinter return kommt also nichts.

    Damit hätten wir ein kleines Beispiel, das Du etwas testen könntest ....

    Vielleicht hilft Dir dies etwas beim Verständnis der Abläufe und gibt Dir ein kleines Spiel-Projekt, das Du weiter ausbauen und testen könntest.

    Jetzt kommt nur noch eine weitere Sache hinzu - da weiss ich aber nicht, ob ich die jetzt erwähnen soll, oder ob ich Dich damit nur verwirre:
    Die einzelnen Frameworks haben schon ein paar Dinge eingebaut zur validierung von Eingaben. So kannst Du in den Eigenschaften vom Button "CausesValidation" finden. Und es gibt events für die Validierung. Aber das kannst Du am Anfang gerne noch ignorieren, wenn es Dir darum gehtm einen Einstieg in C# zu finden. Sobald Du aber C# soweit verstanden hast, sollten wir uns vielleicht auch noch einmal über diese Möglichkeiten unterhalten. (Dann sind Deine Entwicklungen deutlich sauberer und einfacher zu Pflegen und vor allem wirst Du dann teilweise deutlich weniger Arbeit haben.)

    Mit den besten Grüßen,

    Konrad

     

    • Als Antwort markiert Eathen Montag, 5. Dezember 2011 16:12
    Freitag, 2. Dezember 2011 10:02
  • Hi Konrad,

    vielen, vielen Dank für deine Mühe. Das ist wirklich ein sehr anschauliches Beispiel.

    Die if (!Validate) Variante habe ich in mein Programm eingebaut und es funktioniert.

    Nun stellt sich mir noch folgende stilistische Frage:

    In meinem Form habe ich nun mehr als eine Textbox. Sagen wir mal ich habe 3 Textboxen und einen Button. In die Textboxen dürfen nur Zahlen eingetragen werden und mit dem Klick auf den Button, werden diese in die vorgesehenen Variablen übernommen. Um sofort nach der Eingabe den Inhalt zu überprüfen, wird die if(!Validate) Methode schon beim verlassen der textbox aufgerufen. Nun könnte der Benutzer aber den Wert darin stehen lassen und mit dem Cursor durch Tabstops auf dem Button landen, also ihn selektieren ohne auszulösen. Bis dato erhält er zwar nach jedem Sprung von einer Textbox zur nächsten eine Fehlermeldung, der Wert steht aber immer noch darin. Um ihn also die letztendliche Übernahme durch den Click auf den button zu untersagen, wird auch beim Auslösen des Buttons, die Eingabe nochmals überprüft.

    Und jetzt die Frage: Ist die damit verbundene Mehrfachabfrage meines Textboxinhalts programmiertechnisch vertretbar, oder sollte so etwas nur einmal überprüft werden?

    Dann wäre mir momentan nur die Möglichkeit bekannt, keine direkte Abfrage nach dem Verlassen der Textbox durchzuführen, sondern lediglich bei der Betätigung des Buttons.

     

    Die Variante direkt über die CausesValidation eine Überprüfung durchzuführen würde mich auch interessieren, da ich meinen Code doch einfach für die Nachwelt halten will. Ich werde wohl nicht der letzte sein, der sich mit diesem Programm dann beschäftigen wird. Meine C# Kenntnisse begrenzen sich zeitlich zwar auf effektiv 4 Monate, dennoch lernt man nie aus ^^

    Ich freue mich auf deine Antwort.

    Eathen.

    Montag, 5. Dezember 2011 16:24