none
Buttonfarbe per Threading ändern RRS feed

Antworten

  • Hi,

    this bezieht sich immer auf die Instanz der Klasse in der sich der Code befindet. Deiner Methode button1_click hat einen Parameter namens sender, der vom Typ Object ist. Dies ist wie der Name schon sagt der Sender des Ereignisses. Für den Fall, dass Du nur die Farbänderung haben willst und sonst keinen spezifischen Code der je nachdem welcher Button gedrückt wurde unterschiedlich ausführen willst, so kannst Du das sender Object einfach an Deine ColorButton() Methode übergeben.

    In der ColorButton() Methode benutzt Du dann Dein object a um die Eigenschaften zuzuweisen wie z.B.:

    a.BackColor = Color.FromArgb(255, 255, 255);

    ...

    Besser wäre es allerdings bei Deinem object a erstmal zu überprüfen, ob es vom Typ Button ist und dann auch in einen Button zu casten.

     


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Als Antwort markiert as_1985 Dienstag, 4. Oktober 2011 07:27
    Dienstag, 4. Oktober 2011 06:15
  • Da ich mehr in VB mache, kann ich Dir nicht sagen, ob das so funktioniert, aber einen Versuch wäre es Wert:

    If (a is Button) {
    
    Button MyButton = (Button)a;
    MyButton.BackColor=Color.FromArgb(255, 255, 255);
    ......
    
    
    }
    

     


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Als Antwort markiert as_1985 Dienstag, 4. Oktober 2011 07:27
    Dienstag, 4. Oktober 2011 06:47

Alle Antworten

  • Mach das nicht per Threading, das ist nur unnötig kompliziert, mach das
    per Timer! Aus deinem Posting schließe ich, dass du einen Button suchst,
    der kontinuierlich die Farbe ändert. Das machst du am einfachsten, indem
    du eine Klasse von Button ableitest. Statt ihn von außen zu manipulieren
    macht die neue Klasse das von innen heraus. Das hat den Vorteil, dass du
    beliebig viele Objekte davon erzeugen kannst und alle habem diese
    Eigenschaft von Haus aus.
     
    using System;
    using System.Drawing;
    using System.Windows.Forms;
     
    namespace ColorButtonApp
    {
        class FancyButton : Button
        {
            Timer t1 = new Timer();
             int red = 10;
            int green = 20;
            int blue = 30;
             public FancyButton()
            {
                t1.Tick += new EventHandler(t1_Tick);
                t1.Interval = 50;
                t1.Start();
            }
             void t1_Tick(object sender, EventArgs e)
            {
                this.BackColor = Color.FromArgb(red % 256, green % 256,
    blue % 256);
                red += 3;
                blue += 4;
                green += 7;
            }
        }
    }
     
    Die Initialisierung und den Tick-Handler kannst du natürlich
    implementieren wie du willst, das ist hier nur ein Beispiel. Du brauchst
    gar nicht viel zu tippen. Rechstklick auf das Projekt, Klasse
    hinzufügen, Namen verpassen und fertig. Dann änderst du noch im file
    Form1.Designer.cs die Deklaration von
     
    private System.Windows.Forms.Button button1;
    auf
    private FancyButton button1;
     
    Das war's
     
     
    Freitag, 23. September 2011 12:33
  • Danke für deine Antwort,

    ich möchte einen Button, der nur bei Klick die Farbe ändert. Sprich Form wird geöffnet, Button hat Ausgangsfarbe xy.

    Klick auf Button, Button ändert die Farbe, wie z.B. aus deinem Post, kehrt nach X Sekunden wieder in Ausgabsposition zurück und bleibt wieder in Ausgabslage, bis erneut geklickt wird.

    Mittwoch, 28. September 2011 12:58
  • Hallo,

     

    ich hab jetzt eine eigene Methode geschrieben, die funktioniert nun auch wie gewünscht. Jedoch möchte ich diese nicht für jeden Button neu schreiben, wie übergebe ich korrekt, welcher Button gedruckt wurde?

    Hier mal ein kleiner Teil..

    public void button1_Click(object sender, EventArgs e)
            {
                object a = button1;
                ColorButton(a);  
            }
    
            public void ColorButton(object a)
            {
                a = this;
                this.BackColor = Color.FromArgb(255, 255, 255);
                // this hat hier leider "FormX" nicht den Inhalt von a
                [...]
                
                while (i != 120)
                {
                    this.BackColor = Color.FromArgb(255, i, i);
                    this.Refresh();
                [...]
                }
    
            }    
    


    Donnerstag, 29. September 2011 11:22
  • keiner eine Idee, wie ich das korrekt aufrufen kann? :))
    Dienstag, 4. Oktober 2011 06:00
  • Hi,

    this bezieht sich immer auf die Instanz der Klasse in der sich der Code befindet. Deiner Methode button1_click hat einen Parameter namens sender, der vom Typ Object ist. Dies ist wie der Name schon sagt der Sender des Ereignisses. Für den Fall, dass Du nur die Farbänderung haben willst und sonst keinen spezifischen Code der je nachdem welcher Button gedrückt wurde unterschiedlich ausführen willst, so kannst Du das sender Object einfach an Deine ColorButton() Methode übergeben.

    In der ColorButton() Methode benutzt Du dann Dein object a um die Eigenschaften zuzuweisen wie z.B.:

    a.BackColor = Color.FromArgb(255, 255, 255);

    ...

    Besser wäre es allerdings bei Deinem object a erstmal zu überprüfen, ob es vom Typ Button ist und dann auch in einen Button zu casten.

     


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Als Antwort markiert as_1985 Dienstag, 4. Oktober 2011 07:27
    Dienstag, 4. Oktober 2011 06:15
  • Ja, das mit dem sender übergeben und das a in meiner Methode ColorButton zu benutzen, das hab ich soweit. Das Problem wird mit dem cast sein, bzw. der Prüfung ob vom typ Button.

    da a.BackColor oder sender.BackColor sagt, dass "object " does not contain a definition for BackColor..


    Da steh ich grad auf dem Schlauch :)

    Dienstag, 4. Oktober 2011 06:36
  • Da ich mehr in VB mache, kann ich Dir nicht sagen, ob das so funktioniert, aber einen Versuch wäre es Wert:

    If (a is Button) {
    
    Button MyButton = (Button)a;
    MyButton.BackColor=Color.FromArgb(255, 255, 255);
    ......
    
    
    }
    

     


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    C# to VB.NET: http://www.developerfusion.com/tools/convert/csharp-to-vb/
    • Als Antwort markiert as_1985 Dienstag, 4. Oktober 2011 07:27
    Dienstag, 4. Oktober 2011 06:47
  • Hab mal etwas versucht,

    folgendes Ergebnis aus dem Debugging:

    a = object {System.Windows.Forms.Button}

    if (a is Button) {...}

    true

    Das Problem weiterhin ist, dass a.BackColor nicht angenommen wird, "object " does not contain a definition for BackColor..

    **Update**

    funktioniert.

    • Bearbeitet as_1985 Dienstag, 4. Oktober 2011 07:27
    Dienstag, 4. Oktober 2011 07:19
  • Am 04.10.2011 08:00, schrieb as_1985:
    > keiner eine Idee, wie ich das korrekt aufrufen kann? :))
     
    Wenn du erst alle Tips in den Wind schlägst und dann auch noch
    rumnörgelst wie ein Zweitklässler bestimmt nicht mehr.
     
    Dienstag, 4. Oktober 2011 08:08
  • Hans, ich frage mich grad echt wo dein Problem ist, deine Lösung hat nicht gepasst, bist jetzt traurig dass du keine korrekte Antwort auf meine Frage stellen konntest? Lass es doch darauf beruhen, dass Heslacher mir helfen konnte, meine Lösung zum funktionieren zu bekommen.
    Dienstag, 4. Oktober 2011 09:02
  • Am 04.10.2011 11:02, schrieb as_1985:
    > Hans, ich frage mich grad echt wo dein Problem ist, deine Lösung hat
    > nicht gepasst, bist jetzt traurig dass du keine korrekte Antwort auf
    > meine Frage stellen konntest? Lass es doch darauf beruhen, dass
    > Heslacher <../../../../profile/heslacher/> mir helfen konnte, meine
    > Lösung zum funktionieren zu bekommen.
     
    Der Ansatz ist ebenso wie
     
    while (i != 120)
    {
      this.BackColor = Color.FromArgb(255, i, i);
      this.Refresh();
      [...]
    }
     
    von Grund auf falsch. Das *scheint* nur zu funktionieren aber die
    Schiene endet auf dem Abstellgleis, glaub es.
     
    Dienstag, 4. Oktober 2011 10:57