Was ist hier der „Konflikt“?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Was ist hier der „Konflikt“?

    Hey,
    ich habe gerade gesehen, dass Visual Studio hier etwas bemängelt. Im Codeausschnitt geht es darum, dass im Form_Load erkannt wird, ob einer der angeschlossenen Bildschirme groß genug für die Anwendung ist. Wenn ja, dann weiter. Wenn nein, dann Programm beenden. Was genau ist der Konflikt? Sieht der Compiler nicht, dass
    OK verändert werden könnte?

    VB.NET-Quellcode

    1. Private Sub Form_Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. '=====
    3. Dim all_screens As Screen() = Screen.AllScreens
    4. Dim OK As Boolean = False
    5. For Each scr As Screen In all_screens
    6. If scr.Bounds.Width >= Me.Size.Width AndAlso scr.Bounds.Height >= Me.Size.Height Then OK = True
    7. Next
    8. If Not OK Then
    9. MessageBox.Show($"Es ist kein Bildschirm groß genug{NewLine}(mindestens {Me.Size.Width} Pixel in der Breite und {Me.Size.Height} in der Höhe).{NewLine}Programm wird beendet.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Hand)
    10. Me.Close()
    11. End If
    12. '=====


    Ein schönes Wochenende! :)
    Bilder
    • Vollbildaufzeichnung 08.05.2021 172235.jpg

      107,55 kB, 1.920×256, 83 mal angesehen
    Man könnte auch einfach den flag Boolean komplett entfernen, indem man innerhalb der Schleife die Meldung und Close() aufruft.

    Was ist das denn überhaupt für eine alberne „Hilfe“ die du da aktiviert hast? Bringt das denn überhaupt was oder kommt dabei nur solcher Käse raus?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Bartosz Was hast Du herausbekommen, als Du da einen Haltepunkt reingesetzt hast?
    Debuggen, Fehler finden und beseitigen
    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 Folgendes: Das Screen-Array wird initialisiert, mein einer Bildschirm ist drin. Dann wird grundsätzlich durch alle Bildschirme iteriert. (Auf einem Fremd-PC können es ja mehrere sein, daher der Aufwand). In der For-Schleife wird richtigerweise festgestellt, dass meine Bildschirmmaße groß genug sind, daher wird OK auf True gesetzt. Schleife iteriert nicht weiter (logisch, da nur 1 Bildschirm) und ins If Not _OK Then läuft er in dem Fall richtigerweise nicht. Ergo, ich weiß nicht, was VS will.

    Das Programm muss nur ins If laufen, wenn alle Bildschirme nicht groß genug sind. Andersherum formuliert: Sobald einer groß genug ist, lade das Programm weiter.
    Bilder
    • debugging.jpg

      100,56 kB, 1.479×318, 77 mal angesehen
    @Bartosz Wenn ein Schirm True liefert, musst Du die Schleife verlassen, denn in der nächsten Runde kann False rauskommen und das Ergebnis steht dann stets für den letzten gefundenen Schirm.
    ====
    Ist schon OK, True wird nur bei (mindestens) einem großen Schirm geliefert.
    Was wird denn als Size zurückgegeben?
    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!

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

    @RodFromGermany Normalerweise mach ich das immer. Nur in dem Fall ist es egal, denke ich, denn OK wird nie wieder auf False gesetzt. Dennoch habe ich nun Exit For eingebaut. VS meckert immer noch.

    VB.NET-Quellcode

    1. '=====
    2. Dim all_screens As Screen() = Screen.AllScreens
    3. Dim OK As Boolean = False
    4. For Each scr As Screen In all_screens
    5. If scr.Bounds.Width >= Me.Size.Width AndAlso scr.Bounds.Height >= Me.Size.Height Then
    6. OK = True
    7. Exit For
    8. End If
    9. Next
    10. If Not OK Then
    11. MessageBox.Show($"Es ist kein Bildschirm groß genug{NewLine}(mindestens {Me.Size.Width} Pixel in der Breite und {Me.Size.Height} in der Höhe).{NewLine}Programm wird beendet.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Hand)
    12. Me.Close()
    13. End If
    14. '=====


    Bei der Auslagerung in den Form_Shown-Eventhandler hats dieselbe Warnung gegeben.

    Meine Bildschirmbreite ist 1920 Pixel, die Formbreite 1885 Pixel; die Bildschirmhöhe ist 1080, die Formhöhe 1040. Also beides richtig.
    Bilder
    • Vollbildaufzeichnung 08.05.2021 192446.jpg

      124,91 kB, 1.920×387, 68 mal angesehen
    Aber es steht doch da, dass ein Konflikt besteht. Das soll wohl bedeuten, dass VS selber erkennt, dass der Vorschlag wahrscheinlich Mumpitz ist.
    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.
    @Bartosz Arbeite mal die paar Zeilen Code schrittweise ab.
    ====
    Auf dem ScreenShot sehe ich ein If Not False Then bedeutet If True Then, wird also stets ausgeführt.
    Vielleicht ist das der Konflikt?
    Mit welchem Studio arbeitest Du?

    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!

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

    Nimmt man die bedingte Zuweisung an OK weg, wird die inline temporäre Umwandlung von OK zu False konfliktfrei gelöst. Mit der bedingten Zuweisung sieht VS, dass das wahrscheinlich aber nicht im Sinne des Entwicklers ist. Der VS-Vorschlag, an der Stelle aus If Not OK ein If Not False zu machen, ergibt dann korrekterweise keinen Sinn mehr. Das ist m.E. der Konlikt, den VS selber sieht.
    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.
    Arbeite mal die paar Zeilen Code schrittweise ab.
    Habe ich, alles verläuft richtig. Habe das Programm auch auf meinem alten Laptop getestet, dort ist der Bildschirm nämlich kleiner als die Form und es wird richtigerweise die MessageBox gezeigt.

    Ich denke, dass wird so sein, wie @VaporiZed erklärte, dass Visual Studio seinen eigenen Vorschlag selbst kritisiert. Aber was mich wunderte, ist: "Mit der bedingten Zuweisung sieht VS, dass das wahrscheinlich aber nicht im Sinne des Entwicklers ist.". Ist das so ungewöhnlich, eine For-Schleife mit einem IF zu versehen?

    Microsoft Visual Studio Community 2019, Version 16.9.4

    @ErfinderDesRades habe ich gestern getestet, bringt nichts..

    Bartosz schrieb:

    Ist das so ungewöhnlich, eine For-Schleife mit einem IF zu versehen?
    Absolut nicht.
    Kommt wohl auf den Kontext an.
    Und:
    Wenn Du einem Vorschlag des Studios folgst, kann es sein, dass es im nächsten Vorschlag seinen letzten Vorschlag anmeckert.
    Ist bei der Codeanalyse alltäglich.
    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!
    Bei der VS 2019 CE 16.9.4 kommt bei mir die Meldung.
    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.