C# Aktion durchführen solange Button gedrückt bleibt

logiz4

Cadet 3rd Year
Registriert
Sep. 2008
Beiträge
46
Brauche Hilfe, ich will das ich wenn ich meinen Button gedrückthalte die Lautstärke erhöht.
Hatte den Code von unten heut sogar mal soweit das er das ganze nach nach oben gezählt hat (also volume), blos wenn ich dann losgelassen habe hat er munter weitergezählt und das Programm ist bei 100% Lautstärke eingefrohren. ich weiß echt nicht mehr weiter, seh glaub vor lauter Code im Kopf die lösung nicht.

Code:
 private void button8_MouseDown(object sender, MouseEventArgs e)
        {
            for(volume=volume;volume<=255&&volume_set==true;volume++)
            {
                WinampLib.SetVolume(volume);
                System.Threading.Thread.Sleep(100); 
            }
        }
private void button8_MouseUp(blabla)
{
       volume_set=false;
}

Vielen Dank schomal :)
 
Das Problem ist, dass das ganze im selben Thread läuft. Heißt: Sobald der Button gedrückt wird, wird in deinem Thread volume nach oben gezählt, bis volume <= 255, da volume_set == true immer zutrifft, da dein Programm das MouseUp-Event erst erhält, sobald die Schleife durch ist.
Ich würde das ganze entweder in einen eigenen Thread auslagern oder mit nem Slider die Lautstärke regeln.
 
Hi,

deine for Schleife ist programmtechnisch ein kleiner Horror :). Einen BackgroundWorker für dein "Problem" zu benutzen halte ich für etwas übertrieben. Folgende Lösung sollte funktionieren:


Code:
    public partial class Form1 : Form
    {
        int volume;
        Timer volumeUpTimer;

        void volumeUpTimer_Tick(object sender, EventArgs e)
        {
            if (volume < 255)
            {
                volume++;
                // Winampvolume erhöhen
                label1.Text = volume.ToString();
            }
        }

        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            if (volumeUpTimer != null)
            {
                volumeUpTimer.Stop();
                volumeUpTimer.Dispose();
            }
        }

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            volumeUpTimer = new Timer();
            volumeUpTimer.Interval = 500;
            volumeUpTimer.Tick += new EventHandler(volumeUpTimer_Tick);
            volumeUpTimer.Start();
        }
}
 
@_Chris_: Deine Lösung ist gut, wird aber bei
Code:
 void volumeUpTimer_Tick(object sender, EventArgs e)
        {
            if (volume < 255)
            {
                volume++;
                // Winampvolume erhöhen
                label1.Text = volume.ToString();
            }
        }
label1.Text eine ThreadExcetion werfen. Das ganze noch Invoket und die Lösung ist pasabel ;)

Moment: Du erstellst ja SOLANGE MouseDown ist IMMER wieder einen neuen Timer, das kann nicht gut gehen auf die Dauer.
 
also ich habs jetzt viel einfacher gelöst (oder weniger Schreibarbeit)
Code:
        private void button9_MouseDown(object sender, MouseEventArgs e)
        {
            mouseOnButton9 = true;
        }

        private void button9_MouseUp(object sender, MouseEventArgs e)
        {
            mouseOnButton9 = false;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if ((mouseOnButton8 == true)&&(volume<255))
            {
                volume++;
                this.Text =("" + volume);
                WinampLib.SetVolume(volume);
            }
            if ((mouseOnButton9 == true) && (volume >0))
            {
                volume--;
                this.Text = ("" + volume);
                WinampLib.SetVolume(volume);
            }
        }
 
ja,leuft er... könnte man ja aber auch ändern.
 
Du brauchst den Timer ja dann nur bei MouseDown starten und bei MouseUp stoppen.
Und ich würde glaube eher dazu übergehen einen Timer für erhöhung und einen für absenkung der Lautstärke zu verwenden.
Das macht das ganze, wie ich finde deutlich übersichtlicher(vorallem bei späterer Wartung) als deine Variante mit den Variablen "mouseOnButton8" und "mouseOnButton9"
 
toeffi schrieb:
@_Chris_: Deine Lösung ist gut, wird aber bei
Code:
 void volumeUpTimer_Tick(object sender, EventArgs e)
        {
            if (volume < 255)
            {
                volume++;
                // Winampvolume erhöhen
                label1.Text = volume.ToString();
            }
        }
label1.Text eine ThreadExcetion werfen. Das ganze noch Invoket und die Lösung ist pasabel ;)

Moment: Du erstellst ja SOLANGE MouseDown ist IMMER wieder einen neuen Timer, das kann nicht gut gehen auf die Dauer.


Ist nicht richtig was du schreibst, denn das MouseButtonDown-Ereignis wird nur einmal geworfen, selbst wenn du den Button gedrückt hältst. Desweiteren ist "Erstellt" hier das falsche Wort. Der Timer wird nur neuinstanziert, d.h. das alte Objekt wird überschrieben.
 
Zuletzt bearbeitet:
@_Chris_: Stimmt, du hast Recht, habs grad ausprobiert. War der Annahme das dass Event dauerhaft gewurfen wird. Danke für den Einwand.
 
Zurück
Oben