Verbesserungs möglichkeit ?

  • VB.NET

Es gibt 36 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.

    Verbesserungs möglichkeit ?

    Hey ho,

    ich hab immer mal wieder sachen die recht gleich sind und frage mich gerade ob man sowas nicht besser lösen könnte.
    Hier ein Beispiel

    VB.NET-Quellcode

    1. Private Function Registriernummer() As Boolean
    2. HRAS = "R"c
    3. Label1.Text = "Registriernummer"
    4. Me.Visible = True
    5. While Me.Visible = True
    6. My.Application.DoEvents()
    7. End While
    8. If Form1.ComboBox12.Text <> "" Then
    9. Return True
    10. End If
    11. Return False
    12. End Function
    13. Private Function Hersteller() As Boolean
    14. HRAS = "H"c
    15. Label1.Text = "Hersteller"
    16. Me.Visible = True
    17. While Me.Visible = True
    18. My.Application.DoEvents()
    19. End While
    20. If Form1.ComboBox13.Text <> "" Then
    21. Return True
    22. End If
    23. Return False
    24. End Function
    25. Private Function Seriennummer() As Boolean
    26. HRAS = "S"c
    27. Label1.Text = "Seriennummer"
    28. Me.Visible = True
    29. While Me.Visible = True
    30. My.Application.DoEvents()
    31. End While
    32. If Form1.ComboBox14.Text <> "" Then
    33. Return True
    34. End If
    35. Return False
    36. End Function
    37. Private Function Auftragsnummer() As Boolean
    38. HRAS = "A"c
    39. Label1.Text = "Auftragsnummer"
    40. Me.Visible = True
    41. While Me.Visible = True
    42. My.Application.DoEvents()
    43. End While
    44. If Form1.ComboBox15.Text <> "" Then
    45. Return True
    46. End If
    47. Return False
    48. End Function


    Wäre für jeden Tipp dankbar ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Zim“ ()

    Pack Deine KeyWords in eine List(Of String) und gehe dann einfach die Liste durch. Bei einem neuen eintrag musst Du dann einfach nur die Liste erweitern.
    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!
    Naja ist nu nicht die Liste die du meintest :D

    VB.NET-Quellcode

    1. Dim List As New Hashtable
    2. Dim Combo As New HashSet(Of ComboBox)
    3. Private Function Art(ByVal Key As String) As Boolean
    4. HRAS = CChar(VB.Left(Key, 1))
    5. Label1.Text = Key
    6. Me.Visible = True
    7. While Me.Visible = True
    8. Threading.Thread.Sleep(100)
    9. My.Application.DoEvents()
    10. End While
    11. If Combo(CInt(List(Key))).Text <> "" Then
    12. Return True
    13. End If
    14. Dim i As Integer
    15. Integer.TryParse(Key, i)
    16. Return False
    17. End Function
    18. Private Sub FillHash()
    19. Combo.Add(Form1.ComboBox12)
    20. Combo.Add(Form1.ComboBox13)
    21. Combo.Add(Form1.ComboBox14)
    22. Combo.Add(Form1.ComboBox15)
    23. End Sub
    24. Private Sub FillList()
    25. List.Add("Regisriernummer", "0")
    26. List.Add("Hersteller", "1")
    27. List.Add("Seriennummer", "2")
    28. List.Add("Auftragsnummer", "3")
    29. End Sub

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

    Du solltest Application.DoEvents() vermeiden. In der Funktion Art(9 zum beispiel. Welchen Sinn hat es da überhaupt? Du führst eine simple If-Abfrage durch, die blockiert das GUI eigentlich nicht.
    Und noch zwei Tipps: Versuche von den alten VB6-Überbleibseln weg zu kommen (CInt usw.) und schalte Option Strict auf On.

    Viele Grüße, Phil.
    strict und explicit sind beide auf on ;)
    Und mit VB6 hab ich nie gearbeitet.
    Was soll man denn an stelle von CInt usw. nehmen?

    Das mit dem Do.events mache ich damit das Fenster reagiert. Wenn ich das weg mache kann ich ja keine Knöpfe usw. mehr betätigen.

    Zim schrieb:

    Wäre für jeden Tipp dankbar

    naja - erstmal vernünftig formatieren, oder stehen bei dir im Editor die Codeblöcke auch so ohne Einrückung?

    Und dann ühaupt erklären, was das soll, und in was für einer Klasse oder Modul diese Funktionen alle stehen, und was deren Funktion ist.
    Wieso gibt "RegistrierNummer" einen Bool zurück?
    ^^ das mit dem Formatieren kommt ja im Editor automatisch, liegt wohl am Copy Past :P

    Naja das ist aus ner Form. Da frag ich den Benutzer nach einem Hersteller, Registriernummer usw.
    Wenn keine Eingabe gemacht wurde kommt halt "false", daran erkenne ich dann einfach welche Eingabe gemacht wurde.
    Also ich paste immer im Quellcode-Editor des Forums ein, und geht fabelhaft (FireFox)

    VB.NET-Quellcode

    1. Private Function Registriernummer() As Boolean
    2. HRAS = "R"c
    3. Label1.Text = "Registriernummer"
    4. Me.Visible = True
    5. While Me.Visible = True
    6. My.Application.DoEvents()
    7. End While
    8. If Form1.ComboBox5.Text <> "" Then
    9. Return True
    10. End If
    11. Return False
    12. End Function
    13. Private Function Hersteller() As Boolean
    14. HRAS = "H"c
    15. Label1.Text = "Hersteller"
    16. Me.Visible = True
    17. While Me.Visible = True
    18. My.Application.DoEvents()
    19. End While
    20. If Form1.ComboBox6.Text <> "" Then
    21. Return True
    22. End If
    23. Return False
    24. End Function
    25. Private Function Seriennummer() As Boolean
    26. HRAS = "S"c
    27. Label1.Text = "Seriennummer"
    28. Me.Visible = True
    29. While Me.Visible = True
    30. My.Application.DoEvents()
    31. End While
    32. If Form1.ComboBox7.Text <> "" Then
    33. Return True
    34. End If
    35. Return False
    36. End Function
    37. Private Function Auftragsnummer() As Boolean
    38. HRAS = "A"c
    39. Label1.Text = "Auftragsnummer"
    40. Me.Visible = True
    41. While Me.Visible = True
    42. My.Application.DoEvents()
    43. End While
    44. If Form1.ComboBox8.Text <> "" Then
    45. Return True
    46. End If
    47. Return False
    48. End Function


    Und nochn Tipp: Versuchen, absolut exakt zu formulieren:

    Zim schrieb:

    Da frag ich den Benutzer nach einem Hersteller, Registriernummer usw.
    Wenn keine Eingabe gemacht wurde kommt halt "false",

    kann man nix mit anfangen. "fragen" und "halt kommen" - das gibts eiglich nicht im Computer.
    Ja gut ich hab das immer mit diesem VB umklammert.

    Naja, eigentlich ist es doch ohne bedeutung was das schlussendlich macht, es ist doch raus zu lesen was passiert. Und da sich das ja immer mehr oder weniger wiederholt hatte ich mir gedacht das es bestimmt schlauer zu lösen geht.

    Zim schrieb:

    es ist doch raus zu lesen was passiert.

    Sorry - absolut nicht.

    VB.NET-Quellcode

    1. While Me.Visible = True
    2. My.Application.DoEvents()
    3. End While
    muß man einfach als "schlimme Programmier-Sünde" bezeichnen - und ich hab keine Idee, was das soll.

    Ich denke fasst, du versuchst auf prozeduralem Weg etwas zu lösen, für das die Eventorientierte Denkweise erforderlich ist.

    Und da sich das ja immer mehr oder weniger wiederholt hatte ich mir gedacht das es bestimmt schlauer zu lösen geht.
    Das wiederum unterstütze ich vollundganz, das DRY-Prinzip ist vmtl. das wichtigste Programmierprinzip überhaupt.

    Eine Möglichkeit der Umstrukturierung wäre "Parametrisierung" - also dass man nur die veränderlichen Code-Teile als Paramter reingibt:

    VB.NET-Quellcode

    1. Private Function KeineAhnungWozu(ByVal text As String, _
    2. ByVal combo As ComboBox) As Boolean
    3. HRAS = text(0)
    4. Label1.Text = text
    5. Me.Visible = True
    6. '(das folgende glaubich einfach nicht)
    7. 'While Me.Visible = True
    8. ' My.Application.DoEvents()
    9. 'End While
    10. 'das folgende geht viel einfacher
    11. 'If combo.Text <> "" Then
    12. ' Return True
    13. 'End If
    14. 'Return False
    15. Return combo.Text <> "" 'nämlich so
    16. End Function


    Diese Methode könnte alle deine anneren ersetzen
    Ja ich komme aus dem Prozeduralem :P

    Ich hab halt ein Hauptfenster. So wenn ich da zb. auf einen Knopf drücke rufe ich eine Funktion auf und warte da auf eine Antwort. Diese Funktion ist halt diese: KeineAhnungWozu(). Die macht dann ein anderes Fenster sichtbar. Nachdem ich in diesem Fenster eine Eingabe gemacht habe und diese Kontrolliert habe mach ich das Fenster visible = false somit bricht die Schleife ab und er gibt einen Wert zurück.

    @Warfley
    Jop das tue ich :P
    CInt(), CStr(), ... kommen aus VB6
    in VB.Net gibt es jetzt dafür Convert.ToInt32(), Object.ToString() oder auch halt Integer.TryParse()
    ja, nur das mittm close hat ja garnix mit unserm Thema zu tun.

    Und zum beispiel die hashtable - hastedie von galileo? weil seit 2005 würdeman in deim Fall Dictionary(Of String, Integer) nehmen

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

    Mein ja nur :P
    Aber das für zu der nächsten frage :P
    Ich lade Bilder ein unter Form1_Load. So wenn ich das Fenster aber mit ShowDialog auf mache rennt er da ja immer durch. Der ist aber nicht zufällig so schlau und weiss das er gerade die selben Bilder wieder läd oder?
    Im einfachsten Fall fügt man Bilder den Ressourcen hinzu. Damit hat man sie global verfügbar, und also werden sie nur einmal geladen. Aber das ist statisch, also solche bilder zur laufzeit zu ändern ist nicht vorgesehen.

    So, du bist jetzt schon ein großer Programmierer, und kannst das Stichwort "Resource" selbst nachlesen. Meine Buchempfehlung kennsteja, aber mw probier auch Galileo oder gar google.