Bewertung Projekt Berechnung elektrischer Widerstand

  • VB.NET
  • .NET (FX) 4.0

Es gibt 104 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    @Amelie :( Projekt neu erestellt, gestartet und dies:

    Projekt richtig bereinigt (ValueTuple ersatzlos entfernt) und gezippt: Amelie -> 1031799 Byte => Rod -> 64746 Byte.
    Mach Dir eine Boolean Variable InitGui in der Form, die Du am Anfang und am Ende von Reset() auf True bzw. False setzt.
    In den betreffenden Prozeduren fügst Du dann am Anfang If InitGui Then Return und feddich:
    Combo1_Multiplikator_SelectedIndexChanged() und Combo1_Toleranz_SelectedIndexChanged().
    Den Button Widerstand berechnen kannst Du Dir schenken, wenn Du bei jedem SelectedIndexChanged Btn_berechnen_Click.PerformClick() aufrufst.
    Ggf. müsste dann das Fehlerhandling angepasst werden.
    Was mich wundert: Dim Prüfsumme As Double = CDbl(Hunderter & Zehner & Einer) mit Strict On compiliert.
    Korrekt wäre Dim Prüfsumme = 100 * Hunderter + 10 * Zehner + Einer.
    Gib Deiner Klasse UI_Resistor
    einen Konstruktor und eine Prozedur Reset mit:

    VB.NET-Quellcode

    1. Public Sub New()
    2. Reset()
    3. End Sub
    4. Friend Sub Reset()
    5. Me.Hunderter = 0
    6. Me.Zehner = 0
    7. Me.Einer = 0
    8. Me.ListIndexExponent = 0
    9. Me.ListIndexToleranz = 0
    10. End Sub
    Und entsprechend in der Klasse Frm_Resistor:

    VB.NET-Quellcode

    1. Private Sub Reset()
    2. Resistor.Reset()
    3. InitGui = True
    4. FuelleCmb_Multiplikator()
    5. FuelleCmb_Toleranz()
    6. FuelleCmb_Temperatur()
    7. FuelleCmb_Hunderter()
    8. FuelleCmb_Zehner()
    9. FuelleCmb_Einer()
    10. InitGui = False
    11. 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!
    Was macht das ​InitGui genau??

    ​wenn Du bei jedem SelectedIndexChanged
    Das hatte ich anfangs mal im ChangesEvent, weil ich die Werte direkt nach Auswahl anzeigen lassen wollte, hat mich dann aber gestört und mich so für den Button entschieden.

    Das andere habe ich entsprechend angepasst.
    Das mit der Prüfsumme.. . ???
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Was macht das ​InitGui genau??
    Es verhindert das Auftreten der von mir beschriebenen Exception.
    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!
    Nochmal zum Thema Klassen: Die »Innereien« einer Klasse(n)instanz sollten nicht von außen manipuliert werden. Noch besser wäre, dass sie von außen gar nicht erst maipulierbar sein sollten.
    Deine Frm_Resistor-Reset-Methode* fummelt aber in den Innereien von Resistor rum.

    VB.NET-Quellcode

    1. Resistor.Hunderter = 0 : Resistor.Zehner = 0 : Resistor.Einer = 0
    2. Resistor.ListIndexExponent = 0 : Resistor.ListIndexToleranz = 0

    Sowas gehört in die Resistorklasse als Sub namens Reset und die Frm_Resistor-Methode Reset ruft diese auf.

    * in meinem Sprachgebrauch ist Methode = Prozedur; Sub ist eine Methode ohne Rückgabewert, Function eine Methode mit einem (ggf. auch sehr komplexen) Rückgabewert. Ich geh meist noch weiter und verwende das Prinzip Query-Command-Separation: eine Function ermittelt einen Wert, setzt aber keine Werte anderer Klassen.
    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.

    Amelie schrieb:

    aber warum wurde das bei mir nicht angezeigt?
    Keine Ahnung, da hab ich mich auch schon drüber gewundert. Könnte vielleicht am Studio liegen. Bei mir läuft VS2019.
    Was mir nicht gefällt:
    Deine Misch-Benennung mit Großbuchstaben und Unterstrichen,
    Deine Variablen-Präfixe (z.B. strMeldung),
    Deine Aufzählungsoperatoren :.
    Der Rest ist persönlicher Stil.
    Was mir gefällt:
    Deine GUI, besonders die grafische Gestaltung.
    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!
    Widerstand_berechnen ist - aber das hatte ich schonmal geschrieben - vom Namen her eine Sub, da »Widerstand berechnen« fast schon eine Anweisung ist. Momentan ist sie aber eine Function, gibt also einen Wert (Widerstand) zurück. Das Problem: Diesen Rückgabewert verwendest Du überhaupt nicht. Daher kann diese Methode von einer Function in eine Sub umgewandelt werden.
    Das Prinzip der Eingabeprüfung würd ich an Deiner Stelle in diesem Zusammenhang ändern: Statt Sub Eingaben_Prüfen und Setzen von BerechnungIstOK käme mir sowas sinnvoller vor:

    VB.NET-Quellcode

    1. 'in Frm_Resistor
    2. Private Sub Btn_berechnen_Click(sender As Object, e As EventArgs) Handles Btn_berechnen.Click
    3. Try
    4. Resistor.BerechneWiderstand()
    5. Get_MinMax_Werte()
    6. TextAusgaben()
    7. Catch AEx As ArgumentException
    8. Timer1.Start()
    9. Lbl_fehlermeldung.Visible = True
    10. End Try
    11. End Sub

    VB.NET-Quellcode

    1. 'in UI_Resistor
    2. Friend Sub BerechneWiderstand()
    3. Dim Prüfsumme As Double = 100 * Hunderter + 10 * Zehner + Einer
    4. If Prüfsumme = 0 Then Throw New ArgumentException
    5. If Zehner < 1 AndAlso Einer >= 1 Then Throw New ArgumentException
    6. Exponent_umwandeln()
    7. Toleranz_bestimmen()
    8. Widerstand_berechnen(Hunderter, Zehner, Einer, Multiplikator, Toleranz)
    9. End Sub


    Naja, Deine Resistor-Function Get_MinMax_Werte läuft nach aufwendiger Tupelerzeugung aber ziemlich ins Leere:

    VB.NET-Quellcode

    1. Resistor.GetMinMax(Resistor.Widerstand)
    2. TextAusgaben()
    Die in Zeile#2 per Tupel zurückgegebenen Werte versanden, weil Du sie gar nicht nutzt. Stattdessen grapschst Du innerhalb von TextAusgaben wieder in die Resistorklasse rein und holst Dir die Werte. Dann besser so:

    VB.NET-Quellcode

    1. TextAusgaben(Resistor.GetMinMax(Resistor.Widerstand))
    2. '[…]
    3. Private Sub TextAusgaben(Werte As Tuple(Of Double, Double))
    4. lbl_widerstandswert.Text = Resistor.Widerstand.ToString("0.###") & Resistor.Maßeinheit
    5. lbl_widerstandstoleranz.Text = Resistor.Toleranzbeginn.ToString("0.###") & Resistor.Maßeinheit & " bis " & Resistor.Toleranzende.ToString("0.###") & Resistor.Maßeinheit
    6. lbl_toleranzwert.Text = Resistor.AktlToleranz.ToString("0.##") & " %"
    7. Lbl_Multiplikator.Text = Resistor.Multiplikator.ToString("#,##0.###")
    8. lbl_moeglichewerte.Text = Werte.Item1.ToString("0.###") & Resistor.Maßeinheit & " und " & Werte.Item2.ToString("0.###") & Resistor.Maßeinheit
    9. End Sub

    Zwar immer noch nicht sauber, aber wenigstens wird jetzt das Tupel genutzt.
    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.
    @VaporiZednull
    Habe das jetzt für die beiden so gemacht. Die Funktion in eine Sub umgewandelt. Müsste dann für Toleranzen & Multiplikator das auch umändern.
    Eine Frage zu dem Try / Catch.
    Ich dachte man solle so etwas vermeiden??

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Nö, man soll es nicht vermeiden, wenn es sinnvoll ist. Man soll nur nicht z.B. sowas machen:

    VB.NET-Quellcode

    1. Try
    2. '1000 Zeilen Code
    3. Catch Ex As Exception
    4. MessageBox.Show(Ex.ToString)
    5. End Try


    Man könnte es schon auch anders lösen, ohne ein öffnetliches Klassenfeld BerechnungIstOK und ohne Try-Catch, z.B.:
    • erweitertes Tupel als Rückgabewert von Eingaben_Prüfen, welches ALLE Widerstandswerte PLUS BerechnungIstOK wiedergibt
    • man kann auch mit Events arbeiten, sodass UI_Resistor ein Event feuert, welches frm_Resistor alle Werte mitteilt
    Warum heißt die Klasse eigentlich UI_Resistor? Resistor ist ok, aber das UI ist zumindest in der Bedeutung User Interface falsch.
    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.
    EDIT neuer Code ==> neue Probleme... zum ko....
    Was vorher noch in Friend Function GetMinMax richtig funktionierte ist nun wieder hinfällig.
    Also alles einstampfen und wieder von vorne. ;( ;(

    So altes gelöscht, fange komplett neu an. ;(



    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Amelie“ ()

    Moin moin

    Ich bekomme nach einigen Durchläufen immer mal wieder diesen Fehler:
    ​Ausnahme ausgelöst: "System.ArgumentException" in ResistorCalc.exe

    Nach neustart vom VS ist das erstmal weg.
    Wo kann ich mir nun anzeigen lassen, was da den Fehler macht?

    Habe erste seit kurzem VS2017
    Bilder
    • fehler-1.jpg

      193,49 kB, 817×396, 28 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Wennn ich den Code oben anschaue, hast du in Zeile 3 + 4 deine Exception hingeschrieben. Ich vermute das die Prüfsumme aus irgendwelchen Gründen 0 ergibt, oder Zehner und Einer haben die entsprechende Werte ausserhalb des gewünschten Bereiches.
    Bewertung Projekt Berechnung elektrischer Widerstand

    Ich empfehle, auch wenn es vielleicht ein kleiner Test sein soll, immer zu dem Exceptions ein Argument (Text oder ParameterName) hinzuschrieben. Dann weiss man auch gleich wo es geworfen worden ist.

    VB.NET-Quellcode

    1. If Prüfsumme = 0 Then Throw New ArgumentException(NameOf(Prüfsumme))


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Amelie schrieb:

    Wo kann ich mir nun anzeigen lassen, was da den Fehler macht?
    Probier mal so was:

    RodFromGermany schrieb:

    Was mich wundert: Dim Prüfsumme As Double = CDbl(Hunderter & Zehner & Einer) mit Strict On compiliert.
    Korrekt wäre Dim Prüfsumme = 100 * Hunderter + 10 * Zehner + Einer.
    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!
    Strict On habe ich immer an usw... siehe Bild.

    Die Prüfsumme hatte ich so gemacht:

    VB.NET-Quellcode

    1. Dim Prüfsumme As Double = 100 * Hunderter + 10 * Zehner + Einer
    2. If Prüfsumme = 0 Then Throw New ArgumentException


    Die Prüfung ist aber wohl hinfällig, weil die Ringauswahl wohl auch eine " 0 " zulässt.

    @exc-jdbi
    Der Code weiter oben ist hinfällig. Habe komplett neu angefangen. Danke ;)
    Bilder
    • Unbenannt-1.jpg

      437,6 kB, 1.312×860, 18 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @RodFromGermany & @VaporiZed

    So die neue Version ist fertig. Hoffe besser als die alte... Bin gespannt.

    EDIT: 08:19
    Erklärung


    1.) Man kann Farbringe eingeben welcher man von einem Widerstand abliest und das Prog errechnet den Widerstand.

    2.) Man gibt einen Zahlen-Wert ein und das Prog gibt 2 Widerstände heraus, welche einen möglichen Einsatz leisten.
    Beispiel:
    Ich gebe einen errechneten Wert von 34 Ohm mit 5% Toleranz ein. Das Prog wirft dann 32,3 - 35,7 als Toleranzen aus und dann 33 und 36 Ohm aus der E-24 Reihe aus.


    Edit 11:50 Update der Zipdatei
    Dateien
    • ResistorCalc.zip

      (649,25 kB, 18 mal heruntergeladen, zuletzt: )
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    @Amelie Ich klatsch Dir mal meine Bemerkungen einfach so hin:

    Bei unvollständigerer Auswahl und Button "Widerstand ermitteln" => Mach beim Fehlerhandling nur eine Mitteilung, keine Aktion!
    Es darf während der Auswahl nicht der leere Ausgangszustand hergestellt werden, denn ich bin ja in mitten der Auswahl!
    Dann lieber einen Button "Reset" hinzufügen

    Titel Info-Dialog:
    Nicht "Infos zu Widerständen"
    besser: "Infos zur Kennzeichnung von Widerständen"
    Ob Du darauf ein Copyright haben kannst, steht auf einem anderen Blatt.

    FormMain:
    "Labelsumbenennen()" klingt so, als ob Du zur Design-Zeit etwas vergessen hast.
    Es werden nicht Labels umbenannt, sondern es werden Label-Texte upgedatet.

    ClassMain:
    In BerechneWiderstand() Exceptions zu werfen halte ich für suboptimal.
    Mach aus der Sub eine Function und gib True oder False zurück.

    VB.NET-Quellcode

    1. Widerstand = CDbl((Hunderter & Zehner & Einer)) * Multiplikator
    =>

    VB.NET-Quellcode

    1. Widerstand = Prüfsumme


    Enums mit genau zwei Items lassen sich besser als Boolean behandeln

    VB.NET-Quellcode

    1. For Each lbl As Control In Pn_textausgabe.Controls
    2. If lbl.GetType() Is GetType(Label) Then
    =>

    VB.NET-Quellcode

    1. For Each lbl As Control In Pn_textausgabe.Controls.OfType(Of Label)()
    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!
    @RodFromGermany & alle anderen ;)

    Ich sehe nun das es doch immer zu verschiedensten herangehendweisen führt.
    Beispiel mit der Prüfung
    Das hatte ich mal und dann auf anraten geändert.
    Friend Berechnung_OK As Boolean = False

    Dann lieber einen Button "Reset" hinzufügen
    Hatte ich auch mal aber dann verworfen weil ich mir dachte zu kompliziert wenn man immer auf Reset klicken soll.
    Ich könnte das leicht so anpassen das eben nur die Meldung kommt..

    Das mit dem Copy.. natürlch das Programm NICHT auf den Text oder so..., riet mir auch jemand das zu machen.

    ENUM und Boolan: Ein zweck für mich war es mit Enum und ListOf zu lernen. ;)

    Ich bin ja dankbar für alle Hilfen und versuche immer dazu zulernen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    wenn man immer auf Reset klicken soll.
    Das ist zu keinem Zeitpunkt erforderlich :!:
    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!