Forum: PC Hard- und Software Visual Studio Button lange drücken


von M. F. (fuchs1991)


Lesenswert?

Hallo zusammen,

Habe mal wieder eine Frage zu Visual Studio.
Ich möchte wenn ich einen Button kurz drücke eine Aktion auslösen, wenn 
ich den Button jedoch länger drücke eine andere Aktion auslösen.
Programmiere mit C#.

Gibt es da eine Möglichkeit ?

Wäre über Tipps sehr dankbar :)

Gruß

Fuchs

von Drahtverhau (Gast)


Lesenswert?

Hallo!
Evtl wäre es denkbar die beiden Events mouse down und mouseup zu 
abonnieren. Bei mouse down eine stopwatch starten und die abgelaufene 
zei bei mouseup abfragen und auswerten

von M. F. (fuchs1991)


Lesenswert?

Danke das hilft mir schon weiter werde das gleich mal ausprobieren.

Gruß
Fuchs

von Frank H. (huene)


Lesenswert?

Die Events KeyDown und KeyUp für den Button wären ein Ansatzpunkt.
Bei KeyDown Zeitpunkt merken und bei KeyUp die Zeitdauer auswerten und 
entsprechende Aktionen starten.

von M. F. (fuchs1991)


Lesenswert?

Habe mir jetzt einen Code gebastelt allerdings funktioniert der nicht.
Habe noch nie mit MouseDown bzw. MouseUp gearbeitet.
Kann mir jemand weiterhelfen was ich falsch gemacht habe ?







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

        down = Now
        Timer2.Enabled = True
    End Sub

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

        Timer2.Enabled = False

        speichern = False

    End Sub

    Private Sub Timer2_Timer()

        If DateDiff("s", down, Now) > 1 Then

            speichern = True
        End If

    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles 
Timer2.Tick
        If DateDiff("s", down, Now) > 1 Then

            speichern = True
        End If
    End Sub

    Private Sub Button_M1_Click()

        If speichern = True Then
            SerialPort1.Write("+")

        Else
            SerialPort1.Write("a")
        End If

    End Sub

Private Sub Button_M1_Click(sender As Object, e As EventArgs) Handles 
Button_M1.Click
        If speichern = True Then
            SerialPort1.Write("+")
        Else
            SerialPort1.Write("a")
            Label_Drehzahl.Text = Label2.Text
        End If




        SerialPort1.Write("e")
    End Sub

von marais (Gast)


Lesenswert?

Man kann das mit den Events und einem timer lösen, aber das ist nicht 
konform zu den Windows Bedienkonventionen. Ich würde davon abraten: Es 
gibt unter Windows einfach nicht diese Unterscheidung für Buttons, und 
daher ist das völlig unintuitiv.

von Sven K. (quotschmacher)


Lesenswert?

bist du dir sicher, dass du mit c# programmierst und nicht mit irgendwas 
basic-mäßigem?

von M. F. (fuchs1991)


Lesenswert?

Sven K. schrieb:
> bist du dir sicher, dass du mit c# programmierst und nicht mit irgendwas
> basic-mäßigem?

Sorry, ist natürlich kein C# sondern VB

von Dirk K. (merciless)


Lesenswert?

Angenommen, dein "längeres" Drücken sind 2s:
1. Button wird 5s gedrückt, nach 2s wird automatisch
   etwas ausgelöst.
oder
2. Button wird mindestens 2s gedrückt, nach dem
   loslassen wird etwas ausgelöst.

Was willst du genau, Fall 1 oder Fall 2?

merciless

von M. F. (fuchs1991)


Lesenswert?

Dirk K. schrieb:
> Angenommen, dein "längeres" Drücken sind 2s:
> 1. Button wird 5s gedrückt, nach 2s wird automatisch
>    etwas ausgelöst.
> oder
> 2. Button wird mindestens 2s gedrückt, nach dem
>    loslassen wird etwas ausgelöst.
>
> Was willst du genau, Fall 1 oder Fall 2?
>
> merciless

Fall 1 möchte ich ;)

Nur steh ich da total auf dem Schlauch.

Fuchs

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

M. F. schrieb:
> Dirk K. schrieb:
>> Angenommen, dein "längeres" Drücken sind 2s:
>> 1. Button wird 5s gedrückt, nach 2s wird automatisch
>>    etwas ausgelöst.
>
> Fall 1 möchte ich ;)

Und was soll nach vier Sekunden passieren?

A) Das Ereignis wird erneut ausgelöst?

B) Es wird kein weiteres Ereignis ausgelöst, bis das Drücken hinreichend 
lange (wie lange?) unterbrochen wurde?

Das ganze schreit doch nach einem ordentlichen Zustandsautomaten, der 
mit Tasten- und Timerereignissen gefüttert wird.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Deine Benutzer werden Dich verfluchen, bei manchen könnte sogar das 
Vertrauen in Deinen Sachverstand in Mitleidenschaft gezogen werden, in 
einigen Fällen eventuell sogar dauerhaft. Also tu das lieber nicht.

von Dirk K. (merciless)


Lesenswert?

M. F. schrieb:
> Fall 1 möchte ich ;)
>
> Nur steh ich da total auf dem Schlauch.

Dann musst du mit Timern hantieren
- Beim Drücken einen Timer starten.
- Wenn vorzeitig losgelassen wird, Timer disablen.
- Wenn Timer abgelaufen ist, Timer disablen und Aktion auslösen.
  (Timer disablen, wenn das Ereignis nur einmalig ausglöst werden soll)

Und bitte: Bau deine eigene Button-Klasse und pack den Code dort rein.

Der 2. Fall wäre halt einfacher gewesen:
Beim Drücken Zeitstempel merken, beim Loslassen Differenz zur aktuellen
Zeit berechen. Wenn die Differenz größer ist als die (fiktiven) 2s,
Spezial-Aktion auslösen ansonsten normale Aktion.

Das ganze ist natürlich überhaupt nicht intuitiv und sowas erwartet
auch niemand. Warum keine 2 Buttons, oder eine Checkbox für Speichern
oder sowas?

merciless

: Bearbeitet durch User
von Drahtverhau (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.