Aktion ausführen, solange Butten gedrückt ist

T

TimWegener

Hallo Zusammen,

ich habe folgendes Problem:
Ich möchte, einen Button realisieren, der auf 2 verschiedene Events reagiert.
Zum einen soll er ganz normal angeklickt werden können und eine andere
Funktion ausführen wenn er gehalten wird.

Beispiel Windows Media Player:
-Klick auf Weiter und das nächste Lied wird abgespielt
-Weiter wird gehalten und es wird vorgespult

Code:
private void btnSkipForward_Click(object sender, MouseEventArgs e)
        {
               // Das nächste Lied wird abgespielt
        }

//Theorie
// private void btnSkipForward_WirdGehalten(object sender, MouseEventArgs e)
//        {
//              // Das Lied wird vorgespult
//        }

Wie kann ich das realisieren?

Vielen Dank im Vorraus. :)
 
Da "wird gehalten" kein Event sein kann, gibts dazu auch keine Methode. Aber du kannst dir eine boolesche Variable (z.B. "wirdGehalten") erstellen. Danach implementierst du zu deinem Button die Methoden mouseDown und mouseUp und setzt dort entsprechend den Wert von wirdGehalten. Anstelle der Variable könntest du auch zwei Methoden (z.B. starteWas() und stoppeWas()) aufrufen.

Code:
button.MouseDown += new System.Windows.Forms.MouseEventHandler(button_MouseDown);
button.MouseUp += new System.Windows.Forms.MouseEventHandler(button_MouseUp);

...

private void button_MouseDown(object sender, EventArgs e)
{
wirdGehalten = true;
//oder
starteWas();
}

private void button_MouseUp(object sender, EventArgs e)
{
wirdGehalten=false;
//oder
stoppeWas();
}
 
Hallo CPoly,

ersteinmal vielen Dank für die Antwort.
Das das kein Event sein kann ist mir bewusst.

Bei deinem Lösungsansatz sehe ich nun das Problem, dass ich nicht auf zwei unterschiedliche Events reagieren kann.

Nochmal am Beispiel des WMP:
Einmal kurz klicken und das nächste Lied soll abgespielt werden.
Beim Button halten, soll gespult werden.

Wenn ich das jetzt mit deiner Lösung implementieren würde, würde ich beim halten des Buttons zwar spulen, jedoch würde beim loslassen trotzdem (obwohl wir beispielsweise nur spulen wollten), das nächste Lied abgespielt.

Aber durch deine Antwort bin ich auf eine andere Idee gekommen. Ich werde das gleich mal ausprobieren und meinen Versuch dann posten.

Vielen Dank nocheinmal ;)
 
Um das zu unterscheiden könntest du die Zeit messen wie lange der Button angeklickt wird.

Wenn es z.B. kürzer als 1 Sekunde ist, wird die normale onClick Prozedur ausgeführt.
Wenn es länger als 1 Sekunde ist wird gespult oder sonst was.

Die Dauer (1 Sekunde) müsstest du halt auf ein geeignetes Maß setzen das es auch passt.

Gruß Thomas
 
Hallo tombe,

genau das habe ich vor.

Beim MouseDown-Event eine Bool-Variable auf True setzen, dann einen Timer starten, der beim Tick-Event überprüft ob die gesetzte Bool-Variable noch True ist.
Beim MouseUp-Event wird diese Variable wieder auf False gesetzt.

Damit ließe sich die Unterscheidung machen.

Ich versuche das nachher mal umzusetzen und poste dann...

Danke :)
 
Habe es mit VB 6 mal nachgestellt.

Es gibt auf der Form einen Button (Command1) und drei Labels. Beim Anklicken des Buttons wird im Label1 die aktuelle Uhrzeit angezeigt. Nach dem Loslassen der des Mausbuttons wird im Label2 diese Uhrzeit angezeigt und im Label3 wir die Differenz angezeigt.

Je nachdem wie lange die Maustaste gedrückt wurde, wird dann die Meldung "normal" oder "spulen" angezeigt.

Code:
Dim down
Dim up

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

down = Now
Label1.Caption = down

End Sub

Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
up = Now

Label2.Caption = up

Label3.Caption = DateDiff("s", down, up)

If DateDiff("s", down, up) > 1 Then
    MsgBox "spulen"
Else
    MsgBox "normal"
End If


End Sub
 
Ich kann zwar mit VB nicht viel anfangen, aber so ähnlich habe ich es jetzt auch umgesetzt:

Code:
private bool btnIsPressed = false;

private void btnSkipForward_MouseDown(object sender, MouseEventArgs e)
        {
            btnSkipForward.Visible = false;
            btnFastForward.Visible = !btnSkipForward.Visible;
            btnIsPressed = true;
            tiSkipOrFast.Start();
        }

        private void btnSkipForward_MouseUp(object sender, MouseEventArgs e)
        {
            btnSkipForward.Visible = true;
            btnFastForward.Visible = !btnSkipForward.Visible;
            btnIsPressed = false;
        }

private void tiSkipOrFast_Tick(object sender, EventArgs e)
        {
            tiSkipOrFast.Stop();
            if (btnIsPressed == true)
                lblSpulenOrSkip.Text = "Spulen";
            else
                lblSpulenOrSkip.Text = "Skip";
        }

Also vielen Dank... Problem gelöst :)
 
Nachtrag: Das da oben funktioniert zwar, ist aber nicht für das geeignet was du vor hast.

Habe jetzt auf der Form einen Button (Command1), ein Label (Label1) und einen Timer (Timer1).
So bald jetzt der Button angeklickt und die Maustaste gedrückt gehalten wird, wird der Timer aktiviert und geprüft ob die Maustaste länger als eine Sekunde gedrückt ist. In diesem Fall wird die Variable "spulen" auf TRUE gesetzt. Dadurch wird verhindert das das onClick Ereignis ausgelöst wird.

Wird der Button kürzer als 1 Sekunde angeklickt/gedrückt, wird das normale OnClick-Ereignis ausgeführt.

Zur Verdeutlichung was ausgeführt wird, wird beim "Spulen" einfach im Label1 hochgezählt, beim einfachen anklicken wird eine entsprechende Meldung ausgegeben.

Code:
Dim down
Dim spulen As Boolean

Private Sub Command1_Click()

If spulen = True Then
    Exit Sub
Else
    MsgBox "Normales Click Ereignis"
End If

End Sub

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

down = Now

Timer1.Enabled = True

End Sub

Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

Timer1.Enabled = False

spulen = False

End Sub

Private Sub Timer1_Timer()

If DateDiff("s", down, Now) > 1 Then
    Label1.Caption = Label1.Caption + 1
    spulen = True
End If

End Sub
 

Neue Beiträge

Zurück