mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von M. F. (fuchs1991)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Danke das hilft mir schon weiter werde das gleich mal ausprobieren.

Gruß
Fuchs

von Frank H. (huene)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von M. F. (fuchs1991)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.