Button array change color

  • VB.NET
  • .NET (FX) 4.0

Es gibt 46 Antworten in diesem Thema. Der letzte Beitrag () ist von toto.

    Button array change color

    ich habe folgende Code von vanitas-mundi hier in Forum gefunden

    VB.NET-Quellcode

    1. Private _Percent As Single = 0
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. _Percent += 25
    4. If _Percent > 100 Then _Percent = 0
    5. Button1.Invalidate()
    6. End Sub
    7. Private Sub Button1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Button1.Paint
    8. Dim rect As New RectangleF(4, 4, CType((Button1.Width * _Percent) / 100, Single) - 8, Button1.Height - 8)
    9. e.Graphics.FillRectangle(Brushes.Red, rect)
    10. Using b As New SolidBrush(Button1.ForeColor)
    11. Dim size As System.Drawing.SizeF = e.Graphics.MeasureString(Button1.Text, Button1.Font)
    12. e.Graphics.DrawString(Button1.Text, Button1.Font, b, (Button1.Width - size.Width) / 2, (Button1.Height - size.Height) / 2)
    13. End Using
    14. End Sub


    Ich habe ein ButtonArray in ein FLP und würde gerne so haben das die Button nacheinander den Paint event bekommen.
    Das Forum und google haben mir in dieser Hinsicht nichts bieten können.
    Ich weis auch nicht ob sowas möglich ist.
    Ich komme leider nicht weiter und hoffe auf ein paar Tipps.
    LG

    ....mist, ich bin hier falsch...an den Moderatoren, bitte In

    Sonstige Problemstellungen verschieben.



    lg toto

    VB.NET-Quellcode

    1. Private Sub Button1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Button1.Paint, Button2.Paint, Button3.Paint
    2. Dim bt = DirectCast(sender, Button)
    3. Dim rect As New RectangleF(4, 4, CType((bt.Width * _Percent) / 100, Single) - 8, bt.Height - 8)
    4. e.Graphics.FillRectangle(Brushes.Red, rect)
    5. Using b As New SolidBrush(bt.ForeColor)
    6. Dim size As System.Drawing.SizeF = e.Graphics.MeasureString(bt.Text, bt.Font)
    7. e.Graphics.DrawString(bt.Text, bt.Font, b, (bt.Width - size.Width) / 2, (bt.Height - size.Height) / 2)
    8. End Using
    9. End Sub
    Beachte auch, wie sich die Lesbarkeit verbessert, wenn du auf Leerzeilen ohne Sinn verzichtest.

    :P
    Hallo Erfinder,
    schön das du da bist.
    Zu den Code:
    die click ereignis erfolgt nicht über den Button im Array sondern über einen Startbtn.

    zu der "Leerzeilen ohne Sinn"
    ist das ein TIPP 8o

    Habe mir angeschaut.

    || Nein es ging wirklich um die Lesebarkeit
    lg toto

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

    ....wait please.....


    ...das hatte ich schon mal...
    was ich meine ist nacheinander

    und so leuchen alle gleichzeit....

    end wait
    mir geht es darum:
    wie kann ich den Paint event an den zweitwn Button geben nachdem der erste voll war und "invalide"
    lg toto

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

    toto schrieb:

    wie kann ich den Paint event an den zweitwn Button geben
    Mach Die eine eigene Button-Klasse:

    VB.NET-Quellcode

    1. Public Class MyButton
    2. Inherits Button
    3. Public Property Percent As Integer
    4. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    5. MyBase.OnPaint(e)
    6. Dim rect As New RectangleF(4, 4, CType((Me.Width * Me.Percent) / 100, Single) - 8, Me.Height - 8)
    7. e.Graphics.FillRectangle(Brushes.Red, rect)
    8. Using b As New SolidBrush(Me.ForeColor)
    9. Dim size As System.Drawing.SizeF = e.Graphics.MeasureString(Me.Text, Me.Font)
    10. e.Graphics.DrawString(Me.Text, Me.Font, b, (Me.Width - size.Width) / 2, (Me.Height - size.Height) / 2)
    11. End Using
    12. End Sub
    13. End Class
    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!

    toto schrieb:

    end wait
    mir geht es darum:
    wie kann ich den Paint event an den zweitwn Button geben nachdem der erste voll war und "invalide"
    Das geht erst ab .Net.4.5
    Mit .net 4.0 musste dein ganzen Kram dafür umstrukturieren - den Code dafür zu sevieren ist mir denn doch zu viel.

    So ansatzweise gugge Extensions für Listen
    Nur da wird glaub mittm Button durchgeschaltet - du müsstest stattdessen mit einem Timer weiter-schalten
    @ Erfinder, in Extensions für Listen wird schon mit ein Button durchgeschaltet, mit einTimer genauso, aber alle Button färben sich gleichzeitig nicht nacheinander.

    @ Rod, auch mit der Classe wird nur das erste geschaltet bzw gepaintet.

    Ich möchte eine Art Metronome machen, Panel nicht über die Form hinaus hiermit bekomme ich den Takt (4/4 - 3/4 usw,)
    DA im FLP sich ein Array von 32 Button ( 4x8) befindet, das einfärben soll dazu dienen zu wissen über oder in welcher Button ich mich befinde,
    Ich hoffe euch eine klare Situation erklärt zu Haben,

    Bin für weiter Tipps dankbar.

    @ Erfinder; .Net 4.5 habe mich verschrieben
    lg toto
    fein - mit 4.5 ists viel einfacher.
    Poste einfach die Methode mit der Schleife drin, die einen Button nach dem anderen färbt (was derzeit sich gleichzeitig auswirkt), ich kann dir dann das Async-Delay drin einbasteln.

    aber achtung - ich bin kleinlich: ich sage: poste die Methode (das meint die ganze), und ich sage: mit der Schleife drin.
    Ich hoffe das ich dein kleinkarriert gewachsen bin:
    Hier die Methode oder Sub

    VB.NET-Quellcode

    1. Private Sub Button1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Button1.Paint, Button2.Paint, Button3.Paint
    2. Dim bt = DirectCast(sender, Button)
    3. Dim rect As New RectangleF(4, 4, CType((bt.Width * _Percent) / 100, Single) - 8, bt.Height - 8)
    4. e.Graphics.FillRectangle(Brushes.Red, rect)
    5. Using b As New SolidBrush(bt.ForeColor)
    6. Dim size As System.Drawing.SizeF = e.Graphics.MeasureString(bt.Text, bt.Font)
    7. e.Graphics.DrawString(bt.Text, bt.Font, b, (bt.Width - size.Width) / 2, (bt.Height - size.Height) / 2)
    8. End Using
    9. End Sub


    Hier die Schleife

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. _Percent += 25
    3. If _Percent > 100 Then _Percent = 0
    4. For Each bt In {Button1, Button2, Button3}
    5. bt.Invalidate()
    6. Next
    7. End Sub


    Falls ich komplett daneben bin, bitte GEDULD
    lg toto
    Nur zur Erinnerung, ich habe ein btnArray den ich zu Laufzeit erstelle.

    aber
    Dein Paint erstmal weglassen, und so probieren


    OK


    3 Button in FLP aus der Werkzeugkiste.
    Click auf Butto1, tataaaa, btn1 red, btn2 red, btn3 red.

    ...also... die Methode wirkt, auch wenn die Button nicht invalide werden, sie werden alle 3 red nacheinander und bleiben red, aber warum verweigert den event in Timer?

    Please hold the line beep
    please hold the line beep

    Sie besitzen leider nicht die notwendigen Zugriffsrechte, um diese Aktion auszuführen.
    Klasse ne, hallo moderatoren es sind 11 min. vergangen, und keine Rechte auf ein Antwort???

    Please hold the line beep
    please hold the line beep

    How long?
    So...aber jetzt
    lg toto

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

    ERFINDER!!!!!!
    Ich habs heutemorgen um 5.00 Uhr.

    VB.NET-Quellcode

    1. Private Async Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. For Each bt In {Button1, Button2, Button3, Button4, Button5, Button6}
    3. bt.BackColor = Color.Blue
    4. bt.ForeColor = Color.White
    5. Await Task.Delay(2000)
    6. For i = 0 To FLP1.Controls.Count - 1
    7. FLP1.Controls(i).BackColor = Color.Gray
    8. FLP1.Controls(i).ForeColor = Color.Black
    9. Timer1.Stop()
    10. Next
    11. Next
    12. End Sub


    2 Sache noch:
    1_Wenn ich Timer.Stop weggnehme dann spinnt das Ganze, mit Timer.Stop läuft einwandfrei. Verstehe ich nicht? ?(
    2_Der Timer stoppt nicht.
    Habe versucht mit:

    VB.NET-Quellcode

    1. For i = 0 To FLP1.Controls.Count - 1
    2. If FLP1.Controls(i) > 6 Then
    3. Timer1.Stop


    Geht aber nicht, ich möchte das der Timer stopt abhängig von den Button anzahl
    lg toto
    3 Button in FLP aus der Werkzeugkiste.
    1 Timer
    Timer.Interval = 500
    Mein Code für den Timer.Tick

    Ich erzähle keine Geschichten 8-) probierst einfach, es geht schnell, die 5 min. wirdst noch haben

    Was ich meinte ist:
    wenn 3 bt in FLP, ab den dritten bt soll timer stoppen,
    wenn 6 bt in FLP, ab den sechsten bt soll timer stoppen,
    lg toto

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

    Ah - nachdem alle Controls umgefärbt wurden, soll der Timer stoppen.

    Wäre prinzipiell kein Problem aber - tut mir leid - dein Code ergibt (mir zumindest) keinen Sinn.
    Welche Rollen spielen die Button1 - Button6, und welche Controls sind dann im FlowLayoutPanel?

    Also nach deinem Code werden alle 500ms für jeden Button alle Controls des FlowLayoutPanels umgefärbt.
    Das ist insbesondere unsinnig, da im UmfärbeProzess ein Delay von 2000ms drin ist, es also 4-fach länger dauert, als bis bereits der nächste Tick erfolgt.

    Kannst du mal beschreiben, was das eiglich machen soll, so insgesamt?
    Was soll der Timer?
    Was sollen die Button1 - Button6?
    Was sind das für Controls im FLP?
    Hier 2 bilder des Projectes.

    Es müssen nicht button sein, können label, panele usw. sein.
    Welche Rollen spielen die Button1 - Button6, und welche Controls sind dann im FlowLayoutPanel?

    die controls in FLP bekommen einen Text: C-Dur, e_moll usw. das ergibt eine musikalische sequenz. (Das abspielen über die Frequenzen, kommt später).
    Der grüne Balken ist ein Panel der den Takt zählt. Erinnerst du dich - Panel nicht über die Form hinaus
    Damit Takt und einfärben syncron laufen habe die Intervalle anpassen müssen.
    Der Balken ohne einfärben läuft in Takt, aber mittendrin (es können bis zu 32 Controls in FLP sein, so lang ist in der Regel ein jazz Stück)weis ich mehr dann
    an welchen Punkt ich mich befinde im FLP, daher das einfärben Takt für Takt.

    Hoffe du weist wea ich meine, sonst weiter fragen
    LG

    @ beim ersten Bild ist genau beim drucken passiert das 2 balken zu sehen sind, ist aber nur einer.

    Noch was, der Balken läuft mit ein Intervall von 500/25 also 4 Mal über ein Button dann der nächste
    Bilder
    • Bild_1.png

      105,75 kB, 586×339, 137 mal angesehen
    • Bild_2.png

      27,41 kB, 362×302, 133 mal angesehen
    lg toto

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