buttons disabled lassen, bis Datei geladen ist

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von dickmann_hh.

    buttons disabled lassen, bis Datei geladen ist

    Hallo VB-Experte,

    beim Thema Programmieren bin ich eine Niete, trotzdem will ich mich versuchen.

    Zu diesem Zweck habe ich mir ein Projekt ausgedacht, bei dem mittels eines Buttons ("loadList") eine csv-Datei als Frageliste geladen wird (Name der Datei in String "fileName" gespeichert) und die Inhalte in x * 1 Array ("questionList") abgelegt werden.
    Danach soll Quiz mittels eines Buttons ("startQuiz") gestartet werden, indem die erste Spalte abgefragt und der Benutzer kann seine Eingabe machen.
    Diese wird dann gegen den Wert in der zweiten Spalte der entsprechenden Zeile verglichen und ausgewertet mit Button "checkAnswer".
    Am Ende, wenn Button "endQuiz" gedruckt worden ist, gibt es eine Logdatei mit den Abfragen und Antworten.

    soweit klappt es wunderbar.

    nun geht es an erste OPTIIMIERUNG <X
    ich möchte, dass ganz am Anfang, wenn die Anwendung gestartet wird und noch keine Frageliste geladen ist, nur der Button zum Laden er Frageliste aktiv ist. Alle anderen sollen inaktiv sein.
    erst, wenn die Frageliste geladen ist, soll zuerst der startQuiz-Button aktiv sein.

    wie stelle ich das an? wenn ich so mache:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. if fileName ="" then
    3. loadList.enabled=true
    4. startQuiz.enabled=false
    5. checkAnswer.enabled=false
    6. endQuiz.enabled=false
    7. else
    8. loadList.enabled=false
    9. startQuiz.enabled=true
    10. checkAnswer.enabled=false
    11. endQuiz.enabled=false
    12. end if
    13. end Sub

    dann bleiben die drei Buttons ja immer inaktiv.

    Vielen Dank für Eure Hilfe.
    @dickmann_hh Willkommen im Forum.
    In der Form_Load kann man getrost annehmen, dass fileName Empty ist, dass er also stets in den If-Zweig geht.
    checkAnswer.Enabled und endQuiz.Enabled sind immer False, haben mit dem If also nix zu tun.
    Mach Dir eine Prozedur, der Du ein Boolean Flag übergibst und wo Du alle beteiligten Controls enablest.
    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!

    dickmann_hh schrieb:

    oder?
    Nein, eine Sub. ;)
    Die rufst Du immer da auf, wo sich am Zustand der GUI / Daten etrwas ändert oder ändern soll.
    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!
    ...ah, ok.
    Anfang stand ich auf dem Schlauch, nun habe ich es aber verstanden.

    ich habe es wie folgt gelöst (die anderen Buttons habe ich weggelassen, damit es kürzer wird):

    VB.NET-Quellcode

    1. public class form1
    2. dim fileLoaded as Boolean = false 'globale Variable, mit false initialisieren
    3. public sub checkFileLoaded(byval fileLoaded as Boolean)
    4. if fileLoaded = false then
    5. loadList.enabled=true
    6. startQuiz.enabled=false
    7. else
    8. loadList.enabled=true 'kann jetzt noch eine andere Frageliste laden. später nicht mehr, wenn Quiz gestartet ist
    9. startQuiz.enabled=true
    10. end if
    11. end sub
    12. end class


    später, wenn eine Datei geladen ist, dann setze ich fileLoaded auf true und rufe die Sub checkFileLoaded auf mit fileLoaded als Argument, um den Quizstart zu ermöglichen.

    funktioniert wunderbar, vielen Dank für den Denkanstoß!!

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

    Die Zeilen#6 und #9 sind gleich. Entweder ist das falsch oder Z#6 kann vor das If und Z#9 weg.
    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.
    Eigentlich kann die ganze IF weg.

    VB.NET-Quellcode

    1. public class form1
    2. dim fileLoaded as Boolean = false 'globale Variable, mit false initialisieren
    3. public sub checkFileLoaded(byval fileLoaded as Boolean)
    4. loadList.enabled=true
    5. startQuiz.enabled= fileLoaded
    6. end sub
    7. end class


    Es sei denn da ist was falsch gewesen
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    ..stimmt..da kann man durchaus aufräumen und die gleichen Zuweisungen nur einmal vor dem If machen.
    vielen Dank!! wieder eine Zeile weniger :)

    @xChRoNiKx: da hast auc recht. ich wäre auch dafür, soviel wie möglich mit Argumenten zu arbeiten statt immer wieder neu zu deklarieren.
    danke!
    allerdings gibt es bei mir später noch ein paar andere Buttons, die ich unterschiedlich enablen oder disablen möchte. diese habe ich nur nicht mitaufgeführt. vollständig wäre:

    VB.NET-Quellcode

    1. public class form1
    2. dim fileLoaded as Boolean = false 'globale Variable, mit false initialisieren
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. checkFileLoaded(fileLoaded)
    5. End Sub
    6. public sub checkFileLoaded(byval fileLoaded as Boolean)
    7. loadList.enabled=true 'eine Frageliste kann geladen werden, wenn Quiz noch nicht gestartet ist
    8. if fileLoaded = false then
    9. startQuiz.enabled=false
    10. checkAnswer.enabled=false
    11. endQuiz.enabled=false
    12. else
    13. startQuiz.enabled=true
    14. checkAnswer.enabled=false
    15. endQuiz.enabled=false
    16. end if
    17. end sub
    18. end class

    oder habe ich Dich falsch verstanden?

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

    dickmann_hh schrieb:

    oder habe ich Dich falsch verstanden?
    Ja.

    VB.NET-Quellcode

    1. public sub checkFileLoaded(byval fileLoaded as Boolean)
    2. loadList.enabled = true 'eine Frageliste kann geladen werden, wenn Quiz noch nicht gestartet ist
    3. endQuiz.enabled = false
    4. startQuiz.enabled = fileLoaded
    5. checkAnswer.enabled = fileLoaded
    6. end sub

    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!
    Z#13/#17 und #14/#18 sind schon wieder gleich.
    Statt immer den Funktionsparameter fileLoaded mit IF auszuwerten, nimm ihn gleich eben als Argument, wie @xChRoNiKx doch schon schrieb. z.B. eben startQuiz.enabled = fileLoaded
    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.

    dickmann_hh schrieb:

    ... erst, wenn die Frageliste geladen ist, ...

    Das schreit doch förmlich nach einem Event.
    ach Leute....jetzt habe ich's verstanden! danke für Eure Geduld!
    jetzt beziehe ich mich immer auf das fileLoaded (ggf. mit Not) und alle anderen statisch mit True oder False, wenn sie nicht von fileLoaded abhängen.
    dann komme ich auch ohne IF aus und spare ein paar Zeilen.

    @FormFollowsFunction: ja, auf das Event bin ich auch schon gestoßen, aber ich habe das Thema noch nicht verstanden.
    ich werde es mal bei einem der nächsten Optimierungsschritte näher anschauen.

    NOchmals vielen Dank!

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

    Hier mal ne ganz einfache Variante zur Veranschaulichung:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. LoadFile()
    3. End Sub
    4. Public Event FileLoaded()
    5. Private Sub LoadFile()
    6. ' Code to load file
    7. RaiseEvent FileLoaded()
    8. End Sub
    9. Private Sub FileAllreadyLoaded() Handles Me.FileLoaded
    10. MyButton.Enabled = True
    11. End Sub

    FormFollowsFunction schrieb:

    Das schreit doch förmlich nach einem Event.
    Das ist Ansichtssache. Wann nutzt man eine "normale" Sub, wann ein Event? Ich würd immer dann nur ein Event verwenden, wenn nicht sicher ist, dass sich jemand für das Vorkommnis interessiert. Oder wenn die Weiterverarbeitung außerhalb der Klasse erfolgt, in der etwas passiert. Aber hier ist es klassenintern und klar geregelt, wann was passieren soll. Da wäre m.E. ein Event Overkill. Aber hey: Ansichtssache.
    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.
    genau so habe ich auch nun gemacht: die buttons defaultmäßig inaktiv. wenn Datei geladen ist, dann setze ich sie auf True bzw. aktiv.
    Vielen Dank für Eure Inputs.

    die Sache mit Event brauche ich im nächsten Schritt.
    Aber dazu in einem separates Thread...

    wie schließe ich dieses Thema ab?

    dickmann_hh schrieb:

    wie schließe ich dieses Thema ab?
    Oben neben dem Titel ist ein abgerundetes Quadrat, da doppelklickst Du drauf.
    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!