Problem mit Ein- und Ausblenden von Form

  • VB.NET

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

    Problem mit Ein- und Ausblenden von Form

    Hallo

    Ich hebe ein Programm mit 2 Forms.Beide werden geladen. Form 1 ist im Vordergrund. Nun möchte ich das Form1 alle 60 s weich ausgeblendet wird, bzw durchsichtig wird bzw wieder weich eingeblendet wird.
    Bin da am tüftel, nur leider klappt das nicht so. Hier mal mein Code:

    VB.NET-Quellcode

    1. Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer5.Tick
    2. If Me.Opacity <> 1 Then
    3. Me.Opacity = Me.Opacity + 0.01
    4. Else
    5. If Me.Opacity <> 0 Then
    6. Me.Opacity = Me.Opacity - 0.01
    7. End If
    8. End If
    9. End Sub
    Hallo,

    sowas mit nur einem Timer zu realisieren halte ich für schwierig / zu umständlich, nutze einen Timer zum warten bis die 60 Sekunden abgelaufen sind und den Zweiten zum anpassen der gewünschten Deckkraft deiner Form, die zwei deklarierten Bools IncreaseOpacity und DecreaseOpacity geben dann an, ob die Form sichtbar oder unsichtbar werden soll.

    VB.NET-Quellcode

    1. Public Class FM_Main
    2. Private Sub FM_Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. TR_Wait.Start()
    4. End Sub
    5. 'TR_Wait
    6. WithEvents TR_Wait As New Windows.Forms.Timer With {.Interval = [Timeout]}
    7. Private Sub TR_Wait_Tick(sender As Object, e As EventArgs) Handles TR_Wait.Tick
    8. If Opacity = 1.0 Then
    9. DecreaseOpacity = True
    10. IncreaseOpacity = False
    11. Else
    12. IncreaseOpacity = True
    13. DecreaseOpacity = False
    14. End If
    15. TR_Wait.Stop()
    16. TR_ChangeFormOpacity.Start()
    17. End Sub
    18. Dim IncreaseOpacity As Boolean
    19. Dim DecreaseOpacity As Boolean
    20. 'TR_ChangeFormOpacity
    21. WithEvents TR_ChangeFormOpacity As New Windows.Forms.Timer With {.Interval = [ChangeOpacityDelay]}
    22. Private Sub TR_ChangeFormOpacity_Tick(sender As Object, e As EventArgs) Handles TR_ChangeFormOpacity.Tick
    23. If DecreaseOpacity = True Then
    24. Me.Opacity -= 0.01
    25. If Opacity = 0.0 Then
    26. TR_ChangeFormOpacity.Stop()
    27. TR_Wait.Start()
    28. End If
    29. ElseIf IncreaseOpacity = True Then
    30. Me.Opacity += 0.01
    31. If Opacity = 1.0 Then
    32. TR_ChangeFormOpacity.Stop()
    33. TR_Wait.Start()
    34. End If
    35. End If
    36. End Sub
    37. End Class
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „Vultrax“ ()

    heinosh schrieb:

    nur leider klappt das nicht so.
    Dann nenne bitte das gewünschte Ziel, und dein derzeitiges Resultat.

    Grundlegend ist es aber generell bei nem Double eine nicht ganz so gute Idee mit Gleichheitsoperatoren zu arbeiten.
    Dein gezeigter Code würde, so wie er dort steht, bei jedem Tick die Opacity abwechselnd um 0,01 senken und dann wieder erhöhen.

    Vultrax schrieb:

    schwierig / zu umständlich,


    Das finde ich umstaendlich ;) .

    Vultrax schrieb:

    Dim IncreaseOpacity As Boolean
    Dim DecreaseOpacity As Boolean



    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents Ticker As New Timer With {.Interval = 1, .Enabled = True}
    3. Private Sub Ticker_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ticker.Tick
    4. Static flag As Boolean = True
    5. Static active As Boolean = False
    6. Static lastBlend As DateTime = Now
    7. If active Then
    8. If flag Then
    9. Opacity -= 0.01D
    10. Else
    11. Opacity += 0.01D
    12. End If
    13. If Opacity <= 0 OrElse Opacity >= 1 Then
    14. flag = Not flag
    15. active = Not flag
    16. End If
    17. If Not active Then
    18. lastBlend = Now
    19. End If
    20. Else
    21. If (Now - lastBlend).Seconds >= 3 Then
    22. active = True
    23. End If
    24. End If
    25. End Sub
    26. End Class

    And i think to myself... what a wonderfuL World!
    @Eddy - Sieht für mich ziemlich kompliziert aus, könntest Du mir Dein Beispiel erklären?
    Mich würde auch interessieren, warum Du flag, active und lastBlend als Static deklariert hast? (Was bewirkt das?).
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Vultrax schrieb:

    (Was bewirkt das?).


    Erklaerung zu Static:

    msdn schrieb:


    Normalerweise wird eine lokale Variable einer Prozedur gelöscht, sobald die Prozedur beendet wird. Eine statische Variable bleibt erhalten und behält ihren letzten Wert bei. Beim nächsten Aufruf der Prozedur wird die Variable nicht neu initialisiert, sondern hat immer noch den Wert, der ihr zuletzt zugewiesen wurde. Eine statische Variable bleibt so lange bestehen, wie die Klasse oder das Modul, in der bzw. dem sie definiert wurde.


    Was natuerlich schoener ist, als unnoetig klassenweit gueltige Variablen. Wir brauchen sie ja nur in dieser Sub. Aber wir brauchen den vorherigen Wert(vorheriger Durchlauf), daher Static.

    msdn.microsoft.com/de-de/library/z2cty7t8.aspx

    Hier notduerftig die Logik im Code beschrieben:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Ticker_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ticker.Tick
    2. Static flag As Boolean = True
    3. Static active As Boolean = False
    4. Static lastBlend As DateTime = Now
    5. If active Then
    6. If flag Then
    7. Opacity -= 0.01D
    8. Else
    9. Opacity += 0.01D
    10. End If
    11. If Opacity <= 0 OrElse Opacity >= 1 Then
    12. ' Wenn Opacity kleiner oder = 0 ist bzw.groesser oder = 1 ist,
    13. 'Ein/ausblenden "richtungswechsel"
    14. 'obwohl geht ja net kleiner 0 oder grosser 1, hihi
    15. flag = Not flag 'wenn Opacity 0, flag = false
    16. active = Not flag 'active soll ja noch True bleiben bis Opacity =1
    17. 'wenn opacity 1 ist, dann ist flag true und active false
    18. End If
    19. If Not active Then
    20. 'wenn Opacity 1 ist, wird oben flag True somit active false
    21. 'daher ist hier den letzten Zeitpunkt des blendens zu setzen
    22. lastBlend = Now
    23. End If
    24. Else
    25. If (Now - lastBlend).Seconds >= 3 Then
    26. 'nachdem 3 sekunden vorbei sind geht's wieder von vorne los.
    27. active = True
    28. End If
    29. End If
    30. End Sub


    Ich habe manchmal die Angwewohnheit einiges komlizierter als noetig zu machen. Daher hier noch einmal etwas einfacher:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Ticker_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ticker.Tick
    2. Static flag As Boolean = True
    3. Static active As Boolean = False
    4. Static lastBlend As DateTime = Now
    5. If active Then
    6. If flag Then
    7. Opacity -= 0.01D
    8. Else
    9. Opacity += 0.01D
    10. End If
    11. If Opacity <= 0 Then
    12. flag = False
    13. End If
    14. If Opacity >= 1 Then
    15. lastBlend = Now
    16. flag = True
    17. active = False
    18. End If
    19. Else
    20. If (Now - lastBlend).Seconds >= 3 Then
    21. active = True
    22. End If
    23. End If
    24. End Sub

    And i think to myself... what a wonderfuL World!

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

    @Eddy - Danke, sowas wie Static hätte ich in einigen Fällen gut gebrauchen können. :)
    Mich würde noch interessieren, warum Deine Variablen (flag - Flagge?) so genannt hast, wie Du sie genannt hast.

    Tut mir leid, dass ich erst jetzt antworte.
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Hey,

    naja warum Flag? increase- oder decrease-Opacity waere ja nur die halbe wahrheit, daher Flag.

    Wobei hier Flag <> Fahne ist, schau dir die definition mal auf Wikipedia an. Hier trifft Abgrenzung Punkt 1 zu.
    Irgendwie zerreisst die Forensoftware den Link, musst du von hand noch ein ) anhaengen.
    https://de.wikipedia.org/wiki/Flag_(Informatik)

    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Eddy“ ()

    Entschuldige mir, dass ich erneut so spät antworte.
    So wie ich das verstanden habe, könnte Flag dann bedeuten wie "Open / Closed", "True / False / Neutral / Blocked" oder wie in meinem Beispiel verwendet, "IncreaseOpacity / DecreaseOpacity", korrekt?
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford