MouseClick nicht als Event / Handler

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    MouseClick nicht als Event / Handler

    Hey Community!

    Also ich hab ein Programm gecodet, und möchte jetzt, das es an einer Stelle erst fortfährt, sobald die linke Maustaste geklickt wurde.
    Mit Private Sub ... Handles xy.MouseDown geht das ganze nicht, weil ich a) zuviele Controls hab, und b) das nicht so zu implementieren ist, da es ja schon während eines Subs abgefragt werden soll.

    Ich hab bei MSDN was über System.Windows.Input.Mouse gelesen, den Namespace kennt meine IDE aber nicht ?( :D
    Dann dachte ich, ich könnte If System.Windows.Forms.MouseEventArgs.Button = Windows.Forms.MouseButtons.Left Then schreiben, aber dann bekomme ich die Fehlermeldung: "Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis"

    Könnt ihr mir helfen ? :s
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    da es ja schon während eines Subs abgefragt werden soll.

    So funktioniert Event-orientiertes programmieren aber eigentlich nicht. Du kannst auch mehrere Controls in einem Event zusammenfassen, indem du die Handler so schreibst: Handles x.MouseDown, y.MouseDown, z.MouseDown

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    ThePlexian schrieb:

    VB.NET-Quellcode

    1. System.Windows.Forms.MouseEventArgs.Button
    Er will eine Instanz von System.Windows.Forms.MouseEventArgs haben, die heißt im richtigen Eventhandler e.
    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!

    ThePlexian schrieb:

    das es an einer Stelle erst fortfährt, sobald die linke Maustaste geklickt wurde.

    Das hört sich für mich so an, als ob das Programm dort mitten in der Funktion stoppen soll, bis eben die Maus gedrückt wird. Das ist nicht schön.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    vb-checker schrieb:

    Du kannst auch mehrere Controls in einem Event zusammenfassen, indem du die Handler so schreibst: Handles x.MouseDown, y.MouseDown, z.MouseDown

    Ist mir bewusst, das will ich aber nicht :/
    Gibt es auch ein Handle, wo zum Beispiel ein Klick, auf die Form, egal wo, das Event ausgelöst wird ?
    Oder müsste ich dafür eine For-Each-Schleife schreiben (in Me.Controls) wo dann jedes Control zu dem Sub hinzugefügt wird ?

    RodFromGermany schrieb:

    Er will eine Instanz von System.Windows.Forms.MouseEventArgs haben, die heißt im richtigen Eventhandler e.

    Ist mir auch bewusst, aber es ist ein ganz normaler Sub, kein Event, und erst recht kein MouseEvent, also hab ich auch keine Eventhandler

    vb-checker schrieb:


    Das hört sich für mich so an, als ob das Programm dort mitten in der Funktion stoppen soll, bis eben die Maus gedrückt wird. Das ist nicht schön.

    Wollte ich aber ;)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Geht aber nicht ;)
    Es sei denn, du willst dafür extra einen Global Mouse Hook einrichten. Ansonsten musst du wohl die Handles-Klauseln des Events alle aneinanderreihen, wie oben beschreiben.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    vb-checker schrieb:

    Geht aber nicht ;)

    Okay... komisch, aber was solls :D
    Hätte ich wirklich erwartet, naja trotzdem danke :)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Wenn Du eine Übersicht über den letztendliches Ziel geben würdest, könnten wir Dir bestimmt helfen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    Wenn Du eine Übersicht über den letztendliches Ziel geben würdest, könnten wir Dir bestimmt helfen.


    Also: Ich habe einen Sudoku Solver, der anfängt zu lösen sobald ein Button geklickt wurde. Sobald eine neue Zahl herausgefunden wird, wird ein Sub gestartet, um alles notwendige zu machen bei einer neuen Nummer (darstellen, Kandidaten löschen etc.). Dieser Sub soll erst beendet werden, sobald der User auf die Form klickt (sofern eine CheckBox aktiviert ist). :)
    Und ich dachte mir das in etwa so:

    VB.NET-Quellcode

    1. Do
    2. If System.Windows.Forms.MouseButtons.Left = [???] Then Exit Do
    3. Loop


    ?(
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    in etwa so
    als Endlosschleife?
    Wir arbeiten mit Windows multitask. Nicht aber unter DOS 6.2.
    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!

    RodFromGermany schrieb:

    ThePlexian schrieb:

    in etwa so
    als Endlosschleife?
    Wir arbeiten mit Windows multitask. Nicht aber unter DOS 6.2.


    Da ist doch ein Exit Do... :/
    Oder meinst du, das man wenigstens ein Timer einbaut, der besagt, das nach bspw. 20 sek die Schleife autom. beendet wird ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    Oder meinst du,
    Das ist Ranz.
    Wenn Du eine Pizza bestellst, stehst Du weder vor der Tür noch rennst Du alle 5 Minuten zur Tür um zu sehen, ob der Pizzabota da ist.
    Nein, Du wartest, bis er klingelt.
    Also warte auf das entsprechende Event!
    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!

    RodFromGermany schrieb:

    ThePlexian schrieb:

    Oder meinst du,
    Das ist Ranz.
    Wenn Du eine Pizza bestellst, stehst Du weder vor der Tür noch rennst Du alle 5 Minuten zur Tür um zu sehen, ob der Pizzabota da ist.
    Nein, Du wartest, bis er klingelt.
    Also warte auf das entsprechende Event!


    Also bspw.

    VB.NET-Quellcode

    1. Private bool As Boolean = False
    2. Private Sub new_number(sender As Object, e As EventArgs) 'Sub, der bei jeder neuen Nummer aufgerufen wird
    3. 'Sämtlicher Code
    4. Do Until bool = True
    5. Loop
    6. bool = False
    7. End Sub
    8. Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    9. bool = True
    10. End Sub


    Nein, das geht nicht -.-
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Ich verstehe Dein Problem nicht und ich verstehe auch Deine Denkweise nicht. Wozu willst Du diesen seltsamen Loop, der wartet, bis etwas gecklickt wurde. Überleg mal, wenn Du Dein Programm in diese Schleife schickst:

    VB.NET-Quellcode

    1. Private Sub new_number(sender As Object, e As EventArgs) 'Sub, der bei jeder neuen Nummer aufgerufen wird
    2. 'Sämtlicher Code
    3. Do Until bool = True
    4. Loop
    5. bool = False
    6. End Sub


    Das blockiert Deine Anwendung! Lagere Deine Logik in einen extra Thread aus. Und verabschiede Dich von Deinem bisherigen Denken. Anwendungen sind eventgesteuert und solcher Blödsinn macht genau das Gegenteil.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    ThePlexian schrieb:

    Nein, das geht nicht -.-
    Umfassdende Erklärung. ;(
    Kannst Du das bitte präzisieren?
    Was ist der Plan dahinter?
    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!
    also ich könnte mir 2 mögliche Pläne vorstellen:
    1. Eine Sudoku-Lösung zu berechnen dauert u.U. gemein lange, und der User soll das abbrechen können, wenner die Nase voll hat. Oder mindestens ein TimeOut.
    2. Der Sudoku-Löser ist schnell, aber der User soll die Möglichkeit haben, den Fortgang der Berechnungen schrittweise mitzuverfolgen.
    Muss halt der TE sagen, obs eins davon ist oder noch was anneres und wennjawas.
    @ErfinderDesRades:
    Ja, genau das, ich will deinen zweiten Plan: Also die Sudokus werden größtenteils in ~1sek gelöst. Aber ich möchte eine Funktion hinzufügen, die es erlaubt, nach jeder neuen Zahl auf den Klick des Users zu warten, bis das Programm fortsetzt

    SpaceyX schrieb:

    Das blockiert Deine Anwendung!

    Jap, das war ein Fail, ist mir auch direkt danach aufgefallen -.-

    RodFromGermany schrieb:

    Umfassdende Erklärung. ;(

    Wie SpaceyX schon sagte, bei so einer Loop friert die Appl. natürlich ein, hab ich iwie voll verhauen -.- :D

    So ich habe jetzt eine Lösung und die poste ich nachher auch, bin grade unterwegs :D
    Trotzdem vielen Dank!
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

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

    Das ginge mit Threading und einer WaitHandle.
    Die Löse-Funktion läuft im NebenThread, und setzt immer wenn eine Zahl gefunden wurde eine Meldung ans Gui ab. Anschlißend läuft sie in ein AutoResetEvent.WaitOne, welches den Thread blockt, bis der User ihn wieder freigibt.

    Wird selten genutzt diese Art Threading, mag aber hier einfacher sein als den SuchAlgorithmus umzuarbeiten, sodass er in unabhängigen einzeln auslösbaren Einzelschritten sucht.
    @ErfinderDesRades:

    So, da ich noch nie mit Threads gearbeitet hab, außer mit Sleep (:-D) lasse ich die Funktion einfach raus :)

    Ist ja eh nur ein kleines Feature :)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais