singleClick vs. doubleClick

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von kiter20.

    singleClick vs. doubleClick

    Hallo,
    ich möchte gerne herausbekommen, ob "singleClick" oder "doubleClick" auf einem Objekt ausgeführt wurde.
    Folgenden Code habe ich dazu gefunden und etwas abgewandelt.
    Die funktion ist schonmal gegeben.
    Ich werde aber das Gefühl nicht los, dass das auch anders geht.
    Wie bekomme ich eine Kommunikation von dem Click und dem Tick event hin?

    Oder ist es der richtige Weg dass ich das MouseEventArg an eine Variable übergbe und dann im Tick mir darüber die gedrückte Taste besorge?

    VB.NET-Quellcode

    1. Private WithEvents _doubleClickTimer As New Timer()
    2. Private _isFirstClick As Boolean = True
    3. Private _isDoubleClick As Boolean = False
    4. Private _milliseconds As Integer = 0
    5. Private _ClickMouseEvent As MouseEventArgs
    6. #Region "grpZeichnen Click"
    7. Public Sub grpzeichnen_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles grpzeichnen.MouseClick, grpzeichnen.MouseDoubleClick
    8. _ClickMouseEvent = e
    9. If _isFirstClick = True Then
    10. _isFirstClick = False
    11. _doubleClickTimer.Start()
    12. Else
    13. If _milliseconds <= SystemInformation.DoubleClickTime Then
    14. _isDoubleClick = True
    15. End If
    16. End If
    17. End Sub
    18. 'Timmer für doppelklick
    19. Private Sub _CheckDBL_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles _doubleClickTimer.Tick
    20. _milliseconds += 100
    21. If _milliseconds >= SystemInformation.DoubleClickTime Then
    22. _doubleClickTimer.Stop()
    23. If _isDoubleClick = True Then
    24. Select Case _ClickMouseEvent.Button
    25. Case Windows.Forms.MouseButtons.Left
    26. MessageBox.Show("left double")
    27. Case Windows.Forms.MouseButtons.Right
    28. MessageBox.Show("right double")
    29. End Select
    30. Else
    31. Select Case _ClickMouseEvent.Button
    32. Case Windows.Forms.MouseButtons.Left
    33. MessageBox.Show("left single")
    34. Case Windows.Forms.MouseButtons.Right
    35. MessageBox.Show("right single")
    36. End Select
    37. End If
    38. _isFirstClick = True
    39. _isDoubleClick = False
    40. _milliseconds = 0
    41. End If
    42. End Sub
    43. #End Region
    "Mann" lernt mit seinen Projekten.
    Also ich kenns auch so, dasses ziemlich knifflig ist, Click und DoubleClick auseinanderzuhalten.
    Das Problem ist ja, dass jeder Doppelklick mit einem Click anfängt, also braucht man eine Verzögerung, die erstmal guckt, ob nochn Click kommt.

    Wenn der Code tut, was er soll - vlt. besser nicht dran rumrühren.
    Servus in die Runde,

    problematisch ist auch noch, dass jeder seine Doppelklickgeschwindigkeit selber festlegen kann (falls der Code für die mehrere Personen dienen sollte... ).

    lg
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:

    HamburgerJungeJr schrieb:

    Jedes Objekt bringt eigentlich ein Click (einfach) und ein DoubleClick (doppel) Event mit.

    Damit ist das ganze doch eigentlich erledigt. @xpecidy Dadurch ist auch egal wie der User die Doppelklick geschwindigkeit eigestellt hat.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    kiter20 schrieb:

    herausbekommen
    kannst Du das ganz einfach, Panel zum drauf klicken, RTB zur Protokollausgabe:

    VB.NET-Quellcode

    1. Private Sub Panel1_MouseClick(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseClick
    2. Dim dt = DateTime.Now
    3. Dim txt = "MouseClick " & dt.ToLongTimeString & "." & dt.Millisecond.ToString
    4. RichTextBox1.AppendText(txt & Environment.NewLine)
    5. End Sub
    6. Private Sub Panel1_MouseDoubleClick(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDoubleClick
    7. Dim dt = DateTime.Now
    8. Dim txt = "MouseDoubleClick " & dt.ToLongTimeString & "." & dt.Millisecond.ToString
    9. RichTextBox1.AppendText(txt & Environment.NewLine)
    10. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Situation ist auf jeden Fall so wie EDR es geschrieben hat. Jeden doppelclick geht ein klick voran.
    Somit muss ich die System Doppelklickzeit abwarten.
    Das funktioniert ja auch alles soweit.

    Mir gigng es eher darum,ob das so wie ich den Code gemacht habe eine sauber Lösung ist.

    Es stört mich dass ich so für jedes feld auf welches ich klicke und eine aktion haben möchte den Code benötige......

    Kann man das nicht in eine Klasse packen?
    Aber wie bekomme ich dann zurück, ob ein oder zweimal geklickt wurde?
    Denn wenn ich das zweite mal klicke, wird eine neue instanz der klasse erstellt.


    Das Hauptproblem was ich habe ist, dass die eigendliche auswertung des clicks in dem tivk event abläuft.
    Wie komme Ich da dran das mir dort was zurückgegeben wird?
    "Mann" lernt mit seinen Projekten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kiter20“ ()

    Wenn ich den Code so mache wie von RodfromGermany beschrieben, kommt man nicht in den doubleclick rein.
    Es greift immer zuerst der single click.

    Deswegen frage ich mit dem Timer ab, ob innerhalb der im System eingestellten doubleclick zeit ein zweiter klick kommt.
    Wenn ja, dann weiß ich dass es ein doppelklick ist.
    "Mann" lernt mit seinen Projekten.
    hmm.. vielleicht bist du zu langsam für diese Welt :)
    .. mit dem Klicken meine ich...
    ich habe, wie wohl jeder andere hier 1000x das "stinknormale" Click und DoppelClick Event genutzt.
    Hatte immer bestens geklappt.

    Klapps denn bei anderen Programmen?
    Falls nicht, mal die Doppelklickgeschwindigkeit in den Systemeinstellungen verändern.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RoulettePilot“ ()

    Jetzt habe ich das Problem verstanden. :whistling:
    Ich hätte folgenden Ansatz:

    VB.NET-Quellcode

    1. Private WithEvents clickTimer As Timer = New Timer 'Klassenweit zugreifbarer Timer kann auch aus dem Form-Designer sein
    2. Private Sub Panel1_MouseUp(sender As Object, e As EventArgs) Handles Panel1.MouseUp 'Hab jetzt zum Testen ein Panel genommen
    3. If clickTimer.Enabled = False Then
    4. clickTimer.Interval = SystemInformation.DoubleClickTime 'Timer-Intervall auf Doppel-Klickzeit festlegen
    5. clickTimer.Start()
    6. Else
    7. clickTimer.Stop() 'Wenn Ich klicke, während der Timer läuft -> Doppel-Klick
    8. MessageBox.Show("Doppel")
    9. End If
    10. End Sub
    11. Private Sub clickTimer_Tick(sender As Object, e As EventArgs) Handles clickTimer.Tick
    12. clickTimer.Stop() 'Sonst nach der Doppelklick-Zeit -> Einzel-Klick
    13. MessageBox.Show("Einzel")
    14. End Sub

    Hat für mich den Vorteil, dass du nur einen Timer und keine zwischenspeichernden Variablen brauchst.
    Doppel-Klick wird sofort ausgeführt, Einzel-Klick natürlich erst nach der Systemzeit für Doppel-Klicks.

    Gruß
    HamburgerJungeJr

    kiter20 schrieb:

    kommt man nicht in den doubleclick rein.
    Klar kommst Du in Doppelklick rein, aber erst nach Klick:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Panel1_MouseClick(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseClick
    3. Dim dt = DateTime.Now
    4. Dim txt = "MouseClick " & dt.ToLongTimeString & "." & dt.Millisecond.ToString
    5. RichTextBox1.AppendText(txt & Environment.NewLine)
    6. End Sub
    7. Private Sub Panel1_MouseDoubleClick(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDoubleClick
    8. Dim dt = DateTime.Now
    9. Dim txt = "MouseDoubleClick " & dt.ToLongTimeString & "." & dt.Millisecond.ToString
    10. RichTextBox1.AppendText(txt & Environment.NewLine)
    11. End Sub
    12. End Class
    Bilder
    • Doppelklick.png

      5,2 kB, 229×218, 100 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich Antworte nach bestem Wissen und Gewissen. Ich übernehme keine Garantie für die Richtigkeit oder Fehlerfreiheit meiner Texte.


    Ich konnte dir helfen?
    - Das ist schön :) Ich würde mich über ein "Hilfreich" freuen ^^
    Ok, ich werde hier mal beenden.
    Wir drehen uns etwas im Kreis.

    Das worum es ging wurde gesagt. Ich hatte nach einer Alternative gesucht und in #13 bekommen.

    Das es ein single und ein doubleclick event gibt war mir klar, auch wie ich es anwende.
    Kernproblem ist, wenn man auf ein Objekt das click und das doubleclick event jeweils benötigt für unterschiedliche dinge, kommt man nicht darum herum
    dies über die im zb. im System eingestellte doubleclick Zeit zu realisieren.

    Da jetzt niemand mich für meinen Code zerrissen hat, kann man sagen wir haben hier 2 Lösungen: #1 und #13

    Danke an alle!

    Daniel
    "Mann" lernt mit seinen Projekten.
    *VormKopfschlag*
    Jetzt begreife ich erstmal genau worum es ging.
    Muss einen dummen Menschen wie mir doch erstmal erklärt werden :)

    Ist mir früher nie aufgefallen *g* ... man lernt nie aus

    Habe zwar was ähnliches gemacht, aber da ging es darum zu unterscheiden, ob es ein "langer" Klick, oder ein Kurzer war.

    kiter20 schrieb:

    Wir drehen uns etwas im Kreis.
    Kann es sein, dass Du Dein Problem suboptimal beschrieben hast?
    Ist das Dein Problem:
    Ich weiß, dass beim Doppelklick zuerst der Klick und danach der Doppelklick gesendet wird.
    Ich möchte, dass aber die Doppelklick-Prozedur vor der Klick-Prozedur abarbeiten.
    :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Eigendlich habe ich noch nicht einmal direkt nach dem code gefragt.
    Ich habe ja einen funktionierenden code schon geliefert. Es ging darum, weil ich noch Anfänger binn, ob der so ok ist.

    Meine Frage am Anfang war folgende:
    Oder ist es der richtige Weg dass ich das MouseEventArg an eine Variable übergbe und dann im Tick mir darüber die gedrückte Taste besorge?

    Im Post 8 greife ich das Problem wieder auf und beschreibe, dass ich das gerne in eine eigene Klasse packen würde.
    Ich habe aber keine Ahnung wie das sauber gemacht wird.
    Oder ob das überhaupt in diesem Fall geht.

    Muss ich nicht dort etwas statisches haben? Weil der Button ja erneut geklickt wird?


    Sollte also jetzt dahingehen jemand eine Idee haben, immer her damit.

    RodFromGermany schrieb:

    Kann es sein, dass Du Dein Problem suboptimal beschrieben hast?


    Nein ich denke nicht das die Frage suboptimal formuliert war. Schließlich geht ja aus dem code hervor, dass erst die doubleclicktime abgewartet wird, bevor etwas geschieht.
    "Mann" lernt mit seinen Projekten.