Button array change color

  • VB.NET
  • .NET (FX) 4.0

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

    naja, relationales Datenmodell halt: erfinderdesrades.unitweb.de/Programmer/Blogs/Die relationale Grundidee.html
    Ein Musikstück könnte man unterteilen in Abschnitte, und jeder Abschnitt hat eine Tonart,Takt-Art und mehrere Takte davon, und jeder Takt ein paar Noten oder sowas.

    Bei dir sähe das Datenmodell wohl anders aus, weil sonst könntest du ja auch einfach eine fertige Musik-Software nehmen.

    Jo, und dann muss man sich was ausdenken, wie man das darstellt mit OwnerDrawing - nicht mit Takte zählenden Panels (was immer das bedeuten mag).

    Aber unter 10% Prozessorlast ist erstaunlich gut - fährt bei dir nicht ein Timer herum, der jede Millisekunde das Takt-Zähl-Panel verschiebt?
    fährt bei dir nicht ein Timer herum, der jede Millisekunde das Takt-Zähl-Panel verschiebt?


    Jo, da fährt einer herum.

    Ich will keine Noten schreiben sondern ein sequenzer zur Musik begleitung.
    lg toto
    Naja, son Timer ist gemein der Performance-Fresser, aber offsichtlich dein PC hats ja.
    Also nochmal versuch, das prob zu verstehen: Das Panel fährt von links nach rechts über das FLP, und über welchen Button es grad ist, der soll blau.
    Und bei mehrere Zeilen fährt es pro zeile von links nach rechts, und in der gemeinten Zeile der Button drunter soll blau.

    Hat mit Async garnix zu tun.

    Einfach abhängig von der AbspielPosition ist ein Button zu färben, und ein Panel zu positionieren.
    Warum kommen mir so viele Sätze immer so sinnlos vor? Also semantisch ohne Sinn, und dann kann man natürlich nicht drauf antworten.

    toto schrieb:

    Ist die Position der bt zu ermitteln und die des Panel um die bt dann zu färben?


    Ich geb mir Mühe, und versuchs abschnittweise zu verstehen:

    toto schrieb:

    Ist die Position der bt zu ermitteln?
    fragst du, ob das möglich sei? Natürlich ist das möglich, und ich glaube kaum, dass du nicht selber weißt, wie das geht.

    toto schrieb:

    und die des Panel
    ich denk, du legst dessen Position selber fest - dann kannst du sie ja wohl auch ermitteln.

    toto schrieb:

    um die bt dann zu färben?
    Um einen Button zu färben muss man nicht seine Position ermitteln, oder was meinst du?
    Maria.... bist Heute mitm linen Fuß auferstanden...
    Ich weis das Deutsch nicht meine mamma Spreche ist, aber du bist auch sehr kleinlich.

    Die Position der bt hatte ich schon bevor das ganze umgeschrieben habe. Aber kein Problem, bekomme ich wieder.
    Die Position des Panels habe ich auch.

    Also das ganze spricht jetzt nur für ein Timer um die bt zu färbren. Richtig?
    lg toto
    ja, derselbe Timer, der auch das Panel positioniert. Also der wohl die 10% Prozessor-Last verursacht ;) .

    btw was heißt kleinlich: Du musst doch zugeben, dass post#24 überhaupt keinen Sinn ergibt, und schon gar nicht den Sinn von post#26, nämlich dass du fragst, ob die Buttons nun im Timer_Tick zu färben sind
    - oder?
    Erst mein rumgemecker bringt dich dazu, verständlich auszudrücken, was du meinst.

    toto schrieb:

    auch mit der Classe wird nur das erste geschaltet bzw gepaintet.
    Sorry Toto, ich hab das invalidisieren vergessen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class MyButton
    2. Inherits Button
    3. Private _Percent As Integer
    4. Public Property Percent As Integer
    5. Get
    6. Return Me._Percent
    7. End Get
    8. Set(value As Integer)
    9. If Me._Percent = value Then
    10. Return
    11. End If
    12. Me._Percent = value
    13. Me.Invalidate()
    14. Me.Update()
    15. End Set
    16. End Property
    17. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    18. MyBase.OnPaint(e)
    19. Dim rect As New RectangleF(4, 4, CType((Me.Width * Me._Percent) / 100, Single) - 8, Me.Height - 8)
    20. e.Graphics.FillRectangle(Brushes.Red, rect)
    21. Using b As New SolidBrush(Me.ForeColor)
    22. Dim size As System.Drawing.SizeF = e.Graphics.MeasureString(Me.Text, Me.Font)
    23. e.Graphics.DrawString(Me.Text, Me.Font, b, (Me.Width - size.Width) / 2, (Me.Height - size.Height) / 2)
    24. End Using
    25. End Sub
    26. 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!
    Danke Rod,
    aber momentan bin ein wenig durcheinander.
    Ich bekomme es nicht mehr hin, im Timer das es funzt.
    Den Code von gestern habe mittlerweile überschrieben, leider.
    Werde weiter probieren.

    @ Jetzt werden alle rot.
    lg toto

    toto schrieb:

    im Timer das es funzt.
    In meinem Code kommt kein Timer vor.
    Mach Dir die Klasse, kompiliere sie, dann bekommst Du in der Toolbar ein Icon für diesen Button.
    Zieh Dir diesen auf die GUI und gib nach Gutdünken den Wert Percent vor (den Bereich 0 ... 100 solltest Du noch abtesten).
    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!
    ähm - aber was soll er mit dem Button anfangen?
    Das scheint iwie sowas zu sein wie eine Progressbar, also bei 50% isser zur Hälfte, und bei 100% dann in Gänze rot.

    Also in post#23 fasse ich nochmal zusammen, was ich mir als Problemstellung dieses Threads zusammengereimt habe.

    Wäre übrigens nett vom TE, wenner das bestätigen oder korrigieren könnte.
    wenn ich in die Eigenschaften den Percentwert angebe, verhalten sich die Button wie ProgressBar mit der value.
    Bsp. Wert 25 - die Button sind für ein viertel ausgefüllt und beim ausführen passiert nichts.

    Im Timer werden alle gleichzeit Blau:

    VB.NET-Quellcode

    1. Dim _percent As Integer
    2. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    3. For Each bt In {MyButton1, MyButton2, MyButton3, MyButton4, MyButton5, MyButton6}
    4. _percent = 25
    5. bt.BackColor = Color.Blue
    6. bt.ForeColor = Color.White
    7. 'For i = 0 To FLP1.Controls.Count - 1
    8. ' FLP1.Controls(i).BackColor = Color.Blue
    9. ' FLP1.Controls(i).ForeColor = Color.White
    10. ' 'Timer1.Stop()
    11. 'Next
    12. Next
    13. End Sub


    Klar ich sage auch " For Each......."
    Wenn ich die Schleife einsetze, passiert auch nichts, keine färbung.
    Ich Komme nicht drauf was ich falsche mache.
    lg toto
    Ich liebe dein Zynismus

    Naja, son Timer ist gemein der Performance-Fresser, aber offsichtlich dein PC hats ja.
    Also nochmal versuch, das prob zu verstehen: Das Panel fährt von links nach rechts über das FLP, und über welchen Button es grad ist, der soll blau.
    Und bei mehrere Zeilen fährt es pro zeile von links nach rechts, und in der gemeinten Zeile der Button drunter soll blau.

    Hat mit Async garnix zu tun.

    Einfach abhängig von der AbspielPosition ist ein Button zu färben, und ein Panel zu positionieren.


    Mist Sorry Erfinder, hatte mich auf die AbspielPosition post#26 konzentriert, sorry.
    JA, du hast es richtig erkannt
    Also nochmal versuch, das prob zu verstehen: Das Panel fährt von links nach rechts über das FLP, und über welchen Button es grad ist, der soll blau.
    Und bei mehrere Zeilen fährt es pro zeile von links nach rechts, und in der gemeinten Zeile der Button drunter soll blau.

    das ist genau den Ablauf den ich (wir) versuchen zu schaffen,
    lg toto
    Wie gesagt - imo kann dir dabei Rods MyButton nicht helfen, ausser beim dich verzetteln.

    In post#28 wolltest du irgendetwas angehen (was genau, weiß ich nicht), und dich bei Problemen wieder melden.

    Aber behalte vlt. als Ziel vor Augen:
    1. Die Buttons liegen in mehreren Zeilen im FLP, und repräsentieren gleichförmige, fortlaufende Zeitabschnitte
    2. Beim Abspielen ist jeweils der Button blau, in dessen Zeitabschnitt die aktuelle AbspielPosition fällt
    3. Ausserdem gibts noch ein strichförmiges Panel, was während des Abspielens mehrmals (nämlich einmal pro Zeile) von links nach rechts über das FLP läuft
    4. Daraus ergibt sich - wie zufällig - dass das Strich-Panel immer grade über einem blauen Button fährt.
    5. Also ist untereinander unabhängig, aber beides ist abhängig von der AbspielPosition:
      1. welcher Button grad blau ist
      2. wo das StrichPanel grad ist
    Jep...so isses.
    Ich könnte den StrichPanel auch weglasse und dafür ein BEEP einbauen der mir den Takt vorgibt
    bringt aber nichts zu sache weil der StrichPanel sein Weg stur nach geht.

    Die "Zeitabschnitte" sind das Problem, ein Button soll so lang blau bleiben bis der StrichPanel zu nächste Abschnitt ist,
    der wiederum in diesem Augenblick blau wird und der vorigen wieder sein ursprungliche Farbe erhält

    Bei mir sind momentan entweder alle "blau" oder alle grau

    Habe gerade was probiert,
    habe ein ListBox auf die Form gezogen der die namen der Button auflistet

    VB.NET-Quellcode

    1. For Each bt As Button In FLP1.Controls
    2. lstChords.Items.Add(bt.Name)
    3. Next
    4. lstChords.SelectedIndex = lstChords.Items.Count - 1


    Dieser ListBox scrollt über ein Timer im gleichen Tempo wie die Button gefärbt sein sollten

    VB.NET-Quellcode

    1. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    2. If lstChords.Items.Count = 0 Then
    3. Return
    4. End If
    5. If lstChords.SelectedIndex = lstChords.Items.Count - 1 Then
    6. lstChords.SelectedIndex = 0
    7. Else
    8. lstChords.SelectedIndex += 1
    9. End If
    10. If lstChords.SelectedIndex = lstChords.Items.Count - 1 Then
    11. pnlTempo.Location = pnlStartPos
    12. btnTempo.Location = btnStartPos
    13. tmrTempo.Stop()
    14. Timer1.Stop()
    15. Timer2.Stop()
    16. End If
    17. End Sub


    Im Timer1 dann die Färbung

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. If lstChords.SelectedItem.ToString = Button1.Text Then
    3. Button1.BackColor = Color.Blue
    4. Button1.ForeColor = Color.White
    5. End If
    6. End Sub


    Es ist zwar nicht elegant, aber ich wollte einfach ein Erfolg haben.
    Aber macht auch wenig Sinn das für 32 Button zu schreiben.
    Was meinst du?
    Ist der Fall von ListOf oder SelectCase, ich weis nicht mehr wie es heißt.
    lg toto

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

    ich meine, du solltest mal lernen, eine Variable zu deklarieren. Vielleicht auch mal ein Array.

    VB.NET-Quellcode

    1. Private _BlueButtonIndex As Integer, _Buttons As Button()
    2. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    3. If _Buttons Is Nothing Then
    4. _Buttons = FLP1.Controls.OfType(Of Button).ToArray
    5. _BlueButtonIndex = _Buttons.Length - 1
    6. End If
    7. _Buttons(_BlueButtonIndex).BackColor = SystemColors.Control
    8. _BlueButtonIndex = (_BlueButtonIndex + 1) Mod _Buttons.Length
    9. _Buttons(_BlueButtonIndex).BackColor = Color.Blue
    10. End Sub
    Das sollte einen Button nach dem anderen blau machen, und am Ende von vorne anfangen. Listbox und Kram brauchst du nicht.

    Ansonsten bin ich aber jetzt draussen, weil ich glaub, du kriegst deine Anwendung nie fertig, ausser dass andere Leute alles für dich programmieren müssen.
    Sorry - ist gemein, aber kann ich nix für.

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

    Ich sage erstmal Danke.

    ich bin sehr kritikfähig und finde deine Aussage nicht gemein, aber ich habe nie nach Code gefragt, nur nach Tipps und Wege.
    Wie lang ich für mein Programm brauche ist nicht rilevant da es für mich ein Hobby ist und nicht mein Brötchen geber.

    Es tut mir leid das du frustriert bist das nach 2 volle Seiten kein Erfolg siehst.
    Für dich eine Kleinigkeit, für mich eine große Freude.
    Es sind halt diese Kleinigkeiten die mehr Freude bereiten.
    Danke
    lg toto
    oh - vielen Dank - das erleichtert mich tatsächlich iwie.
    Ich bin eiglich von ausgegangen, dich zu kränken, und damit leben zu müssen, dass du mich mehr o. weniger als arrogantes A. ansiehst etc..

    Jedenfalls das wichtigste ist glaub post#36, was eine Art Konzept/Plan ist, der die Zielvorstellung in prinzipiell umsetzbarer Form formuliert.