none
Warum sin (not) Schalter nicht unabhängig? RRS feed

  • Frage

  • Guten Tag, die Aufregung zwei verschiedene Wahrheitswerte für eine Reihe von Tasten verwenden zu können legt sich langsam. Das Formevent ist eine gute Art schon verstandene Eindrücke weiter zu entwickeln. Es genügt nicht logisch zu denken und wählen, den die Informationen können nicht gefiltert werden. Ich kann zwei Wahrheitswerte in diesem Fall A und B zuweisen.

    Public Class Form1  

    Dim Wario As Boolean

    Sub tork(ByVal e As KeyEventArgs) Select Case e.KeyCode Case Keys.A Wario = True Case Keys.B Wario = False End Select End Sub Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp tork(e) Me.Invalidate() End Sub Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint With e.Graphics If Wario = True Then .FillEllipse(Brushes.Aquamarine, 150, 150, 40, 40) End If If Wario = False Then .DrawRectangle(New Pen(Color.FloralWhite, 5), 100, 100, 200, 200) End If End With End Sub End Class

    Nach den Versuchen Informationen zu lesen, hatte ich auch die Möglichkeit zwei Wahrheitswerte nur nach einer Tastenbelegung drücken zu können. Indem ich zusätzlich zu einem Variablennamen (not) auf der rechten Seite einer Gleichung schrieb.

           Select Case e.KeyCode
                Case Keys.Space
                    GATED_LATCH_ENDOR = Not GATED_LATCH_ENDOR
            End Select

    Ich war völlig sicher, dass (not) eine eigenständige Funktion ist. Einmal verwendet und dort manipulierbar wo eine Ausgabe stattfindet. Mehr als ein (not) ist mir nur mit einem KeyCode gelungen zu verwenden. Ohne KeyCode sind mehrere (not) nicht unabhängig.

    Public Class Form1
        Dim GATED_LATCH_ENDOR As Boolean
        Dim kaos As Boolean 'default
        Dim kanon As Boolean = True
        Sub knak()
            kanon = False
            Select Case kanon
                Case True
                    kaos = kaos
                Case False
                    kaos = Not kaos
            End Select
        End Sub
        Sub tork(ByVal e As KeyEventArgs)
            Select Case e.KeyCode
                Case Keys.Space
                    GATED_LATCH_ENDOR = Not GATED_LATCH_ENDOR
            End Select
        End Sub
        Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    
            tork(e)
    
            Me.Invalidate()
    
        End Sub
        Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    
            knak()
    
            With e.Graphics
                If GATED_LATCH_ENDOR = True Then
                    .FillEllipse(Brushes.Aquamarine, 150, 150, 40, 40)
                End If
    
                If kaos = False Then
                    .DrawArc(New Pen(Color.ForestGreen, 5), 200, 200, 140, 71, 90, 180)
                End If
    
                If kaos = True Then
                    .DrawArc(New Pen(Color.Bisque, 5), 200, 200, 140, 71, 90, 180)
                End If
    
                If kanon = False Then
                    .DrawRectangle(New Pen(Color.FloralWhite, 5), 100, 100, 200, 200)
                End If
            End With
    
        End Sub
    End Class

    Wenn ich (GATED_LATCH_ENDOR) drücke wird auch der Wert von (kaos) geändert. Warum?

    Mittwoch, 8. Januar 2020 15:40

Antworten

  • Hi Stefan,
    mir unlogisch erscheinen leider Deine Darstellungen.

    Wenn A, B den Wert Eins haben, dann ist die Negation einer Zahl üblicherweise der gleiche absolute Wert mit negativem Vorzeichen. Logische Verknüpfungen in .NET werden mit booleschen Typen realisiert. Eine Ausnahme (Abweichung) bilden bitweise logische Verknüpfungen, die mit der Binärdarstellung eines Wertes möglich sind.

    Um ein Ereignis (z.B. Neuzeichnen) zu nutzen, muss man eine Ereignisroutine an das Ereignis "hängen". Im Ereignisfall wird diese Routine dann aufgerufen (abgearbeitet). Das Paint-Ereignis eines Steuerelementes in einer Windows Forms Anwendung wird ausgelöst, wenn die Oberfläche angewiesen wird, sich neu darzustellen (refresh).

    Innerhalb einer Ereignisroutine können alle in diesem Kontext "sichtbaren" Variablen genutzt werden. Das sind Variablen, die in der Routine deklariert sind, die realen Parameter, die beim Aufruf der Routine übergeben wurden und auch die Felder (Variablen auf Klassenniveau), die sich in der Klasse befinden, in der sich die Ereignisroutine befindet, üblicherweise die Form-Klasse.

    Wenn also auf Klassenebene ein boolesches Feld (Variable) deklariert wurde, so kann dieses Feld in der Ereignisroutine für das Paint-Ereignis genutzt und auch negiert werden. Üblich ist aber meist, dass in einem anderes Ereignis (z.B. Button-Klick) Feldwerte verändert werden (z.B. negiert) und danach ein Refresh, Redraw o.ä. aufgerufen wird, um im der Oberfläche neue Werte anzuzeigen.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Samstag, 11. Januar 2020 16:57
  • Hi Stefan,
    GATED_LATCH_ENDOR ist bei Dir keine Taste, die gedrückt werden kann, sondern eine booleasche Variable, die beim Loslassen der Space-Taste negiert wird.

    Dein Problem habe ich nicht so richtig verstanden.

    1. Methode knak setzt kanon immer auf False und negiert deshalb kaos.

    2. Methode tork negiert GATED_LATCH_ENDOR, wenn KeyCode Space war.

    3. Zum Abschluß jeden Tastenanschlages wird tork aufgerufen und damit GATED_LATCH_ENDOR mit dem Loslassen der Space-Taste negiert und danach Neuzeichnen aufgerufen

    4. Beim Neuzeichnen wird knak aufgerufen, was kanon auf False setzt und deshalb kaos negiert. Nach dem ersten Loslassen wird die Ellipse mit Auqamarine gefüllt. Nach jedem Loslassen einer Taste wird über knak die Variable kaos negiert, so dass abwechselnd ein Kreisbogen in ForestGreen und dann in Bisque gezeichnet wird. Da kanon immer False ist (nach knak) wird ein weißes Rechteck gezeichnet.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Mittwoch, 8. Januar 2020 16:13

Alle Antworten

  • Hi Stefan,
    GATED_LATCH_ENDOR ist bei Dir keine Taste, die gedrückt werden kann, sondern eine booleasche Variable, die beim Loslassen der Space-Taste negiert wird.

    Dein Problem habe ich nicht so richtig verstanden.

    1. Methode knak setzt kanon immer auf False und negiert deshalb kaos.

    2. Methode tork negiert GATED_LATCH_ENDOR, wenn KeyCode Space war.

    3. Zum Abschluß jeden Tastenanschlages wird tork aufgerufen und damit GATED_LATCH_ENDOR mit dem Loslassen der Space-Taste negiert und danach Neuzeichnen aufgerufen

    4. Beim Neuzeichnen wird knak aufgerufen, was kanon auf False setzt und deshalb kaos negiert. Nach dem ersten Loslassen wird die Ellipse mit Auqamarine gefüllt. Nach jedem Loslassen einer Taste wird über knak die Variable kaos negiert, so dass abwechselnd ein Kreisbogen in ForestGreen und dann in Bisque gezeichnet wird. Da kanon immer False ist (nach knak) wird ein weißes Rechteck gezeichnet.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Mittwoch, 8. Januar 2020 16:13
  • Hallo und guten Tag.

    Soweit ich in meiner Logik praktisch erkennen konnte, wird

    Case False kaos = Not kaos 'nach dem loslassen neu

    'gezeichnet und somit wieder negiert

    in einer theoretischen Zwischenablage nach dem ersten Aufruf von false (default) auf true geändert und

    nur im Rahmen der neuen Zeichnung true wieder auf false negiert.

    Somit ist der Wert von kanon nicht ausschlaggebend, der ja immer noch auch nach einer neuen Zeichnung false ist. Ich bin hundert Prozent sicher gewesen, dass die Case Anweisung geändert werden muss um den Wert von der Variable kaos zu ändern.

    Ich kann damit leben, dass es Methoden gibt, in diesem Fall wurde alles neu gezeichnet und das war der Grund das wieder negiert wurde weil ja nur der false Wert in der kanon Variable "gespeichert" (oder so ähnlich) ist.

    Mein Problem ist, das ich ein Nicht-Gatter (englisch: NOT gate) versuche zu verstehen und in weiterer Folge zu verwenden.

    Ich weiß leider nicht was ich schreiben sollte, in meinem Fall kann ich nicht unterscheiden was ein logischer Baustein ist und wann oder warum und wieso eine neue Zeichnungsebene zu beachten ist. Der AND und der OR Baustein konnten von mir mit dem paintEvent zufriedenstellend verwendet werden. Ich wusste nicht das nach jedem neuem Zeichenvorgang auch etwas anderes, dass ich nicht benennen kann weil mein Wissen nicht reicht, den Wert, von in diesem Fall den Wert false, der Variable kanon noch einmal aufruft.

    Ich gebe mir Mühe zu verstehen, dass nicht nur neu gezeichnet wird sondern auch die Werte der Variablen noch einmal aufgerufen werden.

    Das einzige was mir zum Abschluss meines Textes einfällt ist, dass der paintEvent immer neu aufgerufen wird und es logisch ist das die Methode knak wieder aufgerufen wird. Ich erkenne nicht den Unterschied. Mit einer If Anweisung in einer Methode wie zum Beispiel

        Sub knak()
            If kaos = False Then
                kaos = Not kaos
            End If
        End Sub

    wird kaos immer mit dem Wert true aufgerufen. Und Color.Bisque ändert sich nicht nach einem neuen Aufruf.

    Mit der Variable kanon als Anweisungsbedingung und dem selben Wert in der Dim Zuweisung in meinem Fall true

        Sub knak()
            If kanon = True Then
                kaos = Not kaos
            End If
        End Sub
     

    dann ist der letzte Wert von kaos der aktuelle. Und ich kann wechseln zwischen Color.Bisque und Color.ForestGreen.

    Wenn ich nur diese Tatsachen berücksichtige dann ist die Lösung möglicherweise

        Sub knak()
            If kaos = False Then
                kaos = Not kaos
            End If
        End Sub

    Dann habe ich noch
        Sub knak()
            Select Case kaos = False
                Case True
                    kaos = kaos
                Case False
                    kaos = Not kaos
            End Select
        End Sub

    getestet und das Ergebnis war Color.ForestGreen also war der Wert kaos false und keine Negation. Ist es notwendig noch die Case Anweisung zu verstehen oder soll ich es nur bei der If Anweisung belassen?

    Freitag, 10. Januar 2020 16:24
  • Hi,

    ich muss gestehen, dass ich in deiner "Logik" nur wenig bis gar keine Logik entdecken kann, die sich einem Außenstehenden auch nur irgendwie erschließen könnte.

    Es wäre ggfs. hilfreicher, wenn Du einfach mal (ohne Code, rein textlich) detailliert beschreibst, was genau Du wann in welcher Form machen willst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 10. Januar 2020 16:34
    Moderator
  • Ja, hallo.

    Ich denke A und B ergeben einen Wert. Der Anfangswert für A, B ist Eins. Wenn C den Wert Eins hat dann ist eine Negation Null. Die Variablen A, B und C können nach einer Deklaration im paint Event verwendet werden.

    Ab hier kann es unlogisch sein denn ich weiß nicht genau ob das paint Event eine Methode ist oder ein Event (oder einen Namen trägt den ich nicht kenne).

    In der ersten Antwort, von Herr Peter Fleischer, auf meine Frage erhielt ich die für mich wichtige Information, dass nach einem neuen Aufruf des paint Events nicht nur neu gezeichnet wird, sondern auch eine negierte Variable noch einmal negiert wird. Nach jedem neuen Aufruf.

    Bei A und B ist mir das nicht aufgefallen.

    Wie kann ich negieren und den Wert verwenden und trotzdem neu Aufrufen ohne eine neuerliche Negierung auszulösen?

    Samstag, 11. Januar 2020 14:12
  • Hi Stefan,
    mir unlogisch erscheinen leider Deine Darstellungen.

    Wenn A, B den Wert Eins haben, dann ist die Negation einer Zahl üblicherweise der gleiche absolute Wert mit negativem Vorzeichen. Logische Verknüpfungen in .NET werden mit booleschen Typen realisiert. Eine Ausnahme (Abweichung) bilden bitweise logische Verknüpfungen, die mit der Binärdarstellung eines Wertes möglich sind.

    Um ein Ereignis (z.B. Neuzeichnen) zu nutzen, muss man eine Ereignisroutine an das Ereignis "hängen". Im Ereignisfall wird diese Routine dann aufgerufen (abgearbeitet). Das Paint-Ereignis eines Steuerelementes in einer Windows Forms Anwendung wird ausgelöst, wenn die Oberfläche angewiesen wird, sich neu darzustellen (refresh).

    Innerhalb einer Ereignisroutine können alle in diesem Kontext "sichtbaren" Variablen genutzt werden. Das sind Variablen, die in der Routine deklariert sind, die realen Parameter, die beim Aufruf der Routine übergeben wurden und auch die Felder (Variablen auf Klassenniveau), die sich in der Klasse befinden, in der sich die Ereignisroutine befindet, üblicherweise die Form-Klasse.

    Wenn also auf Klassenebene ein boolesches Feld (Variable) deklariert wurde, so kann dieses Feld in der Ereignisroutine für das Paint-Ereignis genutzt und auch negiert werden. Üblich ist aber meist, dass in einem anderes Ereignis (z.B. Button-Klick) Feldwerte verändert werden (z.B. negiert) und danach ein Refresh, Redraw o.ä. aufgerufen wird, um im der Oberfläche neue Werte anzuzeigen.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Samstag, 11. Januar 2020 16:57