Laden...

Hintergrundfarbe beim Button blockiert

Erstellt von macke_a vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.487 Views
M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 15 Jahren
Hintergrundfarbe beim Button blockiert

Hallo !
Ich habe einen Button, den ich je nach Bedarf in meiner grafischen Oberfläche ein- oder ausblende. Mehr als den folgenden Quelltext nutze ich nicht um den Button darzustellen. Der Buttonname heißt in diesem Fall "Ok"

private delegate void SetTextSteuer(int value);
public void TextSteuerInfo(int value)
{
    if (this.Ok.InvokeRequired)
    {
        this.Invoke(new SetTextSteuer(this.TextSteuerInfo), new object[] { value });
    }
    else
    {
        switch (value)
        {
            case 0x30: { Ok.Visible = false; break; }
            case 0x31: { break; } 
            case 0x32: { Ok.Visible = true; break; }
        }
    }
}

Die Methode TextSteuerInfo(int value) rufe ich nach belieben auf. Die Aktion ist immer erfolgreich, nur das mein Button unregelmäßig eine gedrückten Zustand darstellt, die Button Backcolor ist Schwarz - anstatt grau, wobei der Button überhaupt nicht betätigt wurde!

Kann mir jemand sagen, was ich falsch mache? Weitere Informationen stelle ich auf Anfrage gerne zur Verfügung!

Gelöschter Account
vor 15 Jahren

wie oft rufst du diese methode auf?

this.Ok.InvokeRequired

das ist falsch. du invokest ja this und nicht den button. daher solltest du direkt this fragen ob er invoked werden muss.

G
40 Beiträge seit 2008
vor 15 Jahren

Mit folgendem Code ist der Fehler bei mir NICHT reproduzierbar:


public partial class Form1 : Form
    {
        private Thread t;

        public Form1()
        {
            InitializeComponent();
        }

        private delegate void SetTextSteuer(int value);
        public void TextSteuerInfo(int value)
        {
            if (this.Ok.InvokeRequired)
            {
                this.Invoke(new SetTextSteuer(this.TextSteuerInfo), new object[] { value });
            }
            else
            {
                switch (value)
                {
                    case 0x30: { Ok.Visible = false; break; }
                    case 0x31: { break; }
                    case 0x32: { Ok.Visible = true; break; }
                }
            }
        }

        private void btnHide_Click(object sender, EventArgs e)
        {
            TextSteuerInfo(0x30);
        }

        private void btnShow_Click(object sender, EventArgs e)
        {
            TextSteuerInfo(0x32);
        }

        private void invert()
        {
            while (true)
            {
                TextSteuerInfo(0x30);
                Thread.Sleep(1500);
                TextSteuerInfo(0x32);
                Thread.Sleep(1500);
            }
        }

        private void btnAutoInvert_Click(object sender, EventArgs e)
        {
            t = new Thread(new ThreadStart(invert));
            t.Start();
        }
    }

Tipp: Benutze ein Enum für die Angabe, was mit dem Button passieren soll;)

M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 15 Jahren

Wie oft ich die Methode aufrufe?
Das kann im Extremfall, einmal in der Sekunde sein, dann aber nicht mehr als 20mal hintereinander, sodass ich bei 20Sekunden wäre!

M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 15 Jahren

Hallo Grosche,
Danke für den Tipp und den Sourcecode.
Welche Begründung hast Du für die Benutzung von Deinem Tipp?

Benutze ein Enum für die Angabe, was mit dem Button passieren soll;)

G
40 Beiträge seit 2008
vor 15 Jahren

Die Benutzung von Enums ist sinnvoll für die Übersichtlichkeit. Somit muss man beim Aufrufen der Methode nicht erst im Sourcecode nachschauen, welcher HEX-Wert welche Aufgabe erfüllt, sondern man kann es anhand der Eelemente des Enums sehen 😉

M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 15 Jahren

Na gut, trotzdem muss ich es doch eine Möglichkeit geben, wie ich das Problem mit der Hintergrundfarbe beseitigen kann!
Wieso kommt es vor bzw. woran kann es liegen, das der Button im gedrückten Zustand bleibt, obwohl ich die Taste schon längst losgelassen habe!

Kann ich das irgendwie abfangen?

private delegate void SetTextSteuer(int value);
public void TextSteuerInfo(int value)
{
    if (Ok.InvokeRequired)
    {
        Invoke(new SetTextSteuer(this.TextSteuerInfo), new object[] { value });
    }
    else
    {
        switch (value)
        {
            case 0x30: { Ok.Visible = false; break; }
            case 0x31: { break; }
            case 0x32: { Ok.Visible = true; break; }
        }
    }
}
Gelöschter Account
vor 15 Jahren

ich nehme mal an, das du nciht gelesen hast, was ich geschrieben habe?

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo JAck30lena,

das, was du geschrieben hast, kann kaum die Fehlerursache sein. Sicher ist es lesbarer, wenn man bei InvokeRequired und Invoke dasselbe Objekt verwendet. Aber ich gehe davon aus, dass this und der Button im selben Thread erzeugt wurden (zumindest sollte das so sein). Und dann kann man beides wechselseitig austauschen. Das Control dient ja bei InvokeRequired und Invoke nur dazu, um zu ermitteln, um welchen Thread es geht. Wurden zwei Controls vom selben Thread erzeugt, hat es bei InvokeRequired und Invoke dieselbe Wirkung, egal welches Control man verwendet.

herbivore

Gelöschter Account
vor 15 Jahren

jupp. mir ist klar, das das nciht der grund ist aber der grund steckt ja auch nciht im geposteten code. nur ist es so, das es mir vorkommt, das er es nciht gelesenh at, da sich am code nciht wirklich was getan hat.

5.299 Beiträge seit 2008
vor 15 Jahren

Hi Macke!

Iwie isses müßig, nachm Fehler zu suchen, wenn Grosche ihn unter Verwendung deines Codes nicht reproduzieren kann.
Vllt. sollteste einen Solution-Zip machen, wo den Fehler reproduziert.

Der frühe Apfel fängt den Wurm.

M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 15 Jahren

Hallo ! Danke für Eure Beiträge!

ich nehme mal an, das du nicht gelesen hast, was ich geschrieben habe?

Na klar, habe ich das gelesen was Ihr geschrieben habt! Leider habe ich nicht den Überblick bzw. das nötige Wissen wie ich meine Aufgabe oder auch meine Problem richtig angehen muss. Mal Invoke, mal InvokeRequired, es gibt viele Lösungsansätze!
Jeder macht es unterschiedlich, jeder hat ne andere Meinung und vertritt diese dann auch noch!

Zeigt mir doch mal wie man es richtig programmiert!

Ja Danke, jetzt kommt wieder der Spruch mit den Grundlagen!
Wer lesen kann ich klar im Vorteil - usw. usw....

Gelöschter Account
vor 15 Jahren

Mal Invoke, mal InvokeRequired, es gibt viele Lösungsansätze!

das gehört zusammen. soll bedeuten, das das zum selben lösungsansatz gehört.

Zeigt mir doch mal wie man es richtig programmiert!

siehe hier:
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)

Ja Danke, jetzt kommt wieder der Spruch mit den Grundlagen!
Wer lesen kann ich klar im Vorteil - usw. usw....

nein, zur abwechslung möchte ich dich darauf hinweisen, das dir hier jeder helfen möchte, du aber durch eben solche aussagen unter umständen helfende vertreibst 😉

zum abschluss noch etwas, was du beachten solltest:

Iwie isses müßig, nachm Fehler zu suchen, wenn Grosche ihn unter Verwendung deines Codes nicht reproduzieren kann.