Kurze Frage zu Programmierstil

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Kurze Frage zu Programmierstil

    Hallo Profis,
    ich bin zur Zeit an einem für mich größeren Programm dran, lese parallel ein Buch über VB 08 und lerne immer mehr. Es macht mir Spaß zu sehen, wie Funktionen in einander greifen, werte übergeben werden und ereignisbedingt zu programmieren. "Leider" komme ich jetzt immer öfter an stellen, für die ich 2 Lösungen hätte.
    Jetzt zum Beispiel habe ich 7 Textboxen und möchte vor der Ausführung des eigentlichen Prozesses schauen, ob diese Textboxen auch alle gefüllt sind. Grund: Wenn sie nicht alle gefüllt sind, kann es zu einem Fehler kommen.
    So, nun habe ich angefangen ne If Abfrage für das Problemchen zu schreiben. Dann ist mir aber eingefallen, das ich erst gestern noch einmal die Seiten über die Schleifen gelesen habe und Arrays näher kennen gelernt habe, schleifen waren mir natürlich schon vorher bekannt. Also habe ich die Idee mit If verworfen und mich mal ohne Hilfe des Buches sondern nur aus dem Kopf an das Array Zeugs probiert und siehe da... Beim ersten Versuch geklappt.

    Die eigentlich Frage ist nun, was besser ist, eine If abfrage oder das ganze über ein Array zu lösen.
    Die If Abfrage habe ich jetzt nicht, weil ich sie ja nicht fertig geschrieben habe. Die Arraylösung habe ich hier:

    VB.NET-Quellcode

    1. Dim textboxen() As TextBox = New TextBox() {txtbox_Name, txtbox_Webseite, txtbox_login, txtbox_email, txtbox_Passwort, txtbox_bemerkung, txtbox_login}
    2. For i As Long = 0 To 6
    3. If textboxen(i).Text = "" Then
    4. MsgBox("Alle Felder müssen ausgefüllt sein!", MsgBoxStyle.Critical, "Fehler")
    5. Exit Sub
    6. End If
    7. Next


    .... Der Code, der den Inhalt der Textboxen weiter verarbeitet.

    Was ist jetzt ein besserer 'Stil'? Weil funktionieren würde es ja auch mit der If Abfrage.
    Worin liegen die Vorteile der Versionen? Performance Unterschiede? Ich meine das ist jetzt noch was kleines, aber wenn das mal mit was größerem gemacht wird?
    Das ich mit der Arraylösung ggf. komfortabler noch auf die einzelnen Textboxen zugreifen könnte, ist mir schon klar, bräuchte ich aber in diesem fall nicht.

    Würde mich über Meinungen von euch freuen, da ich immer öfter an solche Stellen komme.

    Gruß Tim

    EDIT: Gerade noch gesehen, das Long ja eig. nicht nötig ist, kenne ja die Anzahl der indizes und diese ist ja nicht so hoch :D
    Generell würde ich mir bei solchen Sachen nicht so viel Sorgen machen. Es ist deine Entscheidung, wie du das machen willst. "Richtig" und "falsch" gibt's da denke ich nicht wirklich.
    Die Variante mit dem Array ist theoretisch ein wenig langsamer, da noch der Speicherplatz für die Referenzen reserviert werden muss, allerdings ist dieser Unterschied so klein, dass er meiner Meinung nach vernachlässigbar ist; auch, wenn du mit mehr Textboxen arbeitest. Eventuell wird das sogar vom Kompiler wegoptimiert. Mach es so, wie es für dich übersichtlicher ist.
    Danke haiyyu, so eine Antwort wollte ich hören :) Wenn die ArrayLösung nur wenig mehr Speicherplatz beansprucht, werde ich es so lassen, gefällt mir irgendwie besser.

    @Sat-71: Egal wie viele Textboxen nicht gefüllt sind, es kommt immer eine Meldung.
    Denn:

    VB.NET-Quellcode

    1. Exit Sub

    Er geht ja jeden Eintrag im Array Durch, also jede TextBox und wenn er dann eine Findet mit Text = "", dann wir der Sub verlassen... Sonst würde die Funktion danach ja auch noch kommen :D

    Zum eigentlichen Thema: In welchem Größenbereich Reden wir hier? Weil die MSGBox kommt schneller als ich daran denken kann, dass sie gleich kommt. Spürbar wird es erst etwas an der Geschwindigkeit ändern, wenn es um größere Mengen geht, oder?
    Danke für deine Meinung :thumbsup:

    Gruß Tim
    Hoppla, hab ich überlesen.


    Wir wäre es denn mit einer Alternativ-Lösung?

    VB.NET-Quellcode

    1. For Each Element As Control In Me.Controls
    2. If Element.Name.Contains("TextBox") Then
    3. If Element.Text = String.Empty then
    4. MsgBox("Füllen Sie alle Felder aus")
    5. Exit Sub
    6. End IF
    7. End If
    8. Next



    Mfg.
    SAR
    Alternativlösung sieht sauber aus, vielen Dank. "As Control" muss ich mir gleich merken!
    Jedoch gibt es da das Problem, dass ich jede Textbox mit txtbox_Name bezeichne. Bei "txtbox" würde er also auch die Falschen mit reinnehmen. Es würde dann funktionieren, wenn ich die entsprechenden TextBoxen extra benenne, z.B: "txtbox_xName", "txtbox_xLogin" usw.
    Ich lasse es mir mal durch den Kopf gehen, ich danke Dir.

    Gruß Tim
    Wo ich was reinschreiben muss und wie der Code funktioniert ist mir schon klar ;)
    Ich habe nur gesagt, dass bei mir alle Textboxen "txtbox_NAME" heißen und wenn ich das dann anpassen würde zu "txtbox", er mir auch falsche auslesen würde. Also müsste ich die betroffenen Boxen kennzeichnen, z.B. mit einem x nach dem "_".
    Wenn sich die zu prüfenden TextBoxen in einem eigenen Container befinden (z.B. einer GroupBox oder einem Panel), dann geht auch der "Einzeiler":

    VB.NET-Quellcode

    1. If GroupBox1.Controls.Cast(Of Control).Where(Function(c) c.Text.Equals(String.Empty)).Count() > 0 Then
    2. 'Eine der TextBoxen in der GroupBox ist leer
    3. Else
    4. 'alle sind gefüllt
    5. End If
    6. 'gleichwertige Alternative:
    7. If (From c In GroupBox1.Controls.Cast(Of Control)() Where c.Text.Equals(String.Empty)).Count() > 0 Then
    8. '...
    9. End If

    Dass an dem "c" kein "As Control" steht liegt am so genannten lokalen Typrückschluss (=Option Infer). Das geht auch zusammen mit Option Strict On - letztere Option sollte übrigens immer gesetzt sein. Wenn du dennoch alle TextBoxen einzeln beim Namen nennen musst, kannst du die Select Case-Anweisung missbrauchen:

    VB.NET-Quellcode

    1. Select Case String.Empty
    2. Case TextBox1.Text, TextBox2.Text
    3. MessageBox.Show("mindestens eine ist leer")
    4. Case Else
    5. MessageBox.Show("alle gefüllt")
    6. End Select
    Gruß
    hal2000

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