Problem bei Farbe von Text im Button

  • VB.NET

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

    Problem bei Farbe von Text im Button

    Ich will bei dem Button_Save alle Sekunde die Farbe ändern. Das funktioniert.
    Am Schluß wir die Farbe zu dunkel und ich möchte die Schriftfarbe auf weiss umschalten.
    Das funktioniert nicht.
    (Genau genommen kommt die Umstellung auf weiß erst viel später)
    refresh hat nicht geändert...
    Was mache ich da falsch?
    Danke!

    Quellcode

    1. Private Sub Button_Save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Save1.Click
    2. With Button_Save
    3. .FlatAppearance.BorderSize = 0
    4. .Text = "text1"
    5. .BackColor = Color.Orange
    6. .Enabled = False
    7. .FlatAppearance.BorderColor = Color.Orange
    8. Wait(1)
    9. .Text = "text2"
    10. .BackColor = Color.Red
    11. .FlatAppearance.BorderColor = Color.Red
    12. Wait(1)
    13. .ForeColor = Color.White
    14. .Text = "text3"
    15. .BackColor = Color.DarkRed
    16. .FlatAppearance.BorderColor = Color.DarkRed
    17. .Refresh()
    18. Wait(1)
    19. End With
    20. End Sub
    21. ''' <summary>
    22. ''' progamm anhalten
    23. ''' </summary>
    24. ''' <param name="seconds"></param>
    25. Public Sub Wait(ByVal seconds As Double)
    26. Static start As Double
    27. start = Microsoft.VisualBasic.Timer
    28. Dim start2 As Double = start
    29. Do While Microsoft.VisualBasic.Timer < start + seconds
    30. Try
    31. System.Windows.Forms.Application.DoEvents()
    32. Catch
    33. End Try
    34. Loop
    35. End Sub
    VB.NET VB2017
    Wenn man von der Herangehensweise und dem Sinn absieht, liegt es daran, dass Dir das Deaktivieren (.Enabled = False) einen Strich durch Deine Stylerechnung macht. Deaktivier mal späßleshalber jene Zeile und schau, ob es dann so aussieht, wie Du wolltest.
    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.
    @Georg99 Willkommen im Forum. :thumbup:
    Streiche die Prozedur Wait() ersatzlos und ändere die Farben in einer Timer-Tick-Prozedur.
    Zieh Dir einfach einen Timer auf die GUI und feddich.
    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!
    Danke für eure Hinweise.
    @RodFromGermany: mit timer-tick ist es deutlich eleganter. Habe ich gemacht.
    @Vapori-Zed: du hast recht: .enable=false war das Problem. Da wäre ich nicht draufgekommen! Etwas verwunderlich finde ich, dass sich die Hintergrundfarbe im Gegensatz zur Textfarbe ändern läßt!
    Nochmal Danke!
    VB.NET VB2017
    Das Ändern der Textfarbe eines deaktivierten Buttons geht indem du den Text im Paint-Ereignis neu zeichnest.
    Changing Disabled Controls ForeColorsocial.msdn.microsoft.com/Foru…orecolor?forum=vblanguage

    VB.NET-Quellcode

    1. Private Sub btn_EnabledChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Button_Save.EnabledChanged
    2. Dim btn As Button = CType(sender, Button)
    3. btn.ForeColor = If(btn.Enabled, Color.Black, Color.White)
    4. End Sub
    5. Private Sub btn_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Button_Save.Paint
    6. Dim btn As Button = CType(sender, Button)
    7. Dim drawBrush As SolidBrush = New SolidBrush(btn.ForeColor)
    8. Dim sf As New StringFormat
    9. Dim lNum As Int32 = CType(Math.Log(CType(btn.TextAlign, Double), 2), Int32)
    10. sf.LineAlignment = CType(lNum / 4, StringAlignment)
    11. sf.Alignment = CType(lNum Mod 4, StringAlignment)
    12. If btn.Text <> String.Empty Then
    13. btn.Tag = btn.Text
    14. btn.Text = String.Empty
    15. End If
    16. e.Graphics.DrawString(btn.Tag.ToString, btn.Font, drawBrush, e.ClipRectangle, sf)
    17. drawBrush.Dispose()
    18. sf.Dispose()
    19. End Sub
    @HenryV Dann wäre es deutlich eleganter, ein eigenes Button-Control zu schreiben.
    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!
    @HenryV das casten von sender zu Button ist nicht notwendig, wenn die Methode in der zugehörigem Form läuft und nur ein Button betroffen ist.

    Dim btn As Button = CType(sender, Button)

    CType und Co . Eignen sich für String, Integer und so. Statt CType nimm bei Controls besser DirectCast oder TryCast.
    "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

    RodFromGermany schrieb:

    @HenryV Dann wäre es deutlich eleganter, ein eigenes Button-Control zu schreiben.
    Find ich nicht - vor allem nicht "deutlich".
    Ist zwar iwie totschick, eigene Controls zu entwickeln, aber wenn man einen Job auch mit einem einfachen Eventhandler abfackeln kann, ist das wohl der "weniger invasive" Eingriff.

    ErfinderDesRades schrieb:

    is geschmackssache
    oder so ähnlich. ;)
    OOD, Kapselung, ...
    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!
    Ganz oben, rechts auf [Thema bearbeiten] klicken und dann auf ⌠als erledigt markieren⌡
    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.