Schleife, um Maus-Positionen zu speichern

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von X-Zat.

    Schleife, um Maus-Positionen zu speichern

    Hey, Leute!

    Ich wollte einfach mal ein Makro-Programm schreiben, dachte, es sei nicht sonderlich schwierig, es auf die Beine zu stellen.
    Mein Problem ist folgendes:

    Ich möchte alle 10 MS die Mausposition als Variable PosX(1/2/3)/PosY(1/2/3) speichern.

    Mein Code sieht so aus:




    GetThem = True
    CountA = 0
    While GetThem = True
    If Control.ModifierKeys <> Keys.Escape Then
    GetThem = False
    End If
    CountA += 1
    PosY(CountA) = Control.MousePosition.Y.ToString()
    PosX(CountA) = Control.MousePosition.X.ToString()
    Wartezeit(10)
    End While

    Ich erklär eben warum mein Code so aussieht, wie er es tut:

    - Ich benutze die Funktion Wartezeit (Link), welche ich leider nicht in einer For-Schleife benutzen kann.
    - Als Abbruch-Bedingung der While-Schleife steht "GetThem" (Boolean), welche bei Druck auf "Escape" "true" wird und somit die While-Schleife beendet.
    - CountA ist vom Typ "Integer" und wird wie in einer For-Schleife += 1 gerechnet.
    - PosX ist die X-Koordinate und soll mehrere "Arrays" (?) haben. (Sorry, kenne mich damit leider nicht so gut aus :()
    - PosY ist dasselbe nur mit Y-Koordinate.

    Der Fehler, den ich bekomme, zeigt auf

    VB.NET-Quellcode

    1. PosY(CountA) = Control.MousePosition.Y.ToString()



    Und besagt:

    Die Objektvariable oder die With-Blockvariable wurde nicht festgelegt.

    Ich habe mir diese With-"Funktion" mal angeschaut und ehrlich gesagt keinen blassen Schimmer, wozu sie gut sein soll...

    Hoffe, mir kann hier jemand helfen! :D

    MfG,
    X-Zat / Momo
    - Ich benutze die Funktion Wartezeit (Link), welche ich leider nicht in einer For-Schleife benutzen kann.
    Wieso kannst Du diese nicht in einer For-Schleife verwenden?

    - PosX ist die X-Koordinate und soll mehrere "Arrays" (?) haben. (Sorry, kenne mich damit leider nicht so gut aus )
    - PosY ist dasselbe nur mit Y-Koordinate.
    Wie sind denn Deine Variablen PosX und PosY deklariert?

    Befasse Dich mal mit den Grundlagen der Variablen-Deklaration. Dein Fehler weist auch auf eine fehlende Delkaration bzw. Zuweisung hin.
    Du hast gar keinen With-Block, also brauchst Du Dich auch darum nicht zu kümmern.

    Eigentlich macht man so was nicht mit einer Schleife sondern mit dem Timer, dann braucht man auch keine zusätzliche irgendwie geartete Funktion Wartezeit.

    Du solltest auch noch Dir die Themen Prozeduren (Sub- und Function-Prozeduren) anschauen.
    Und was ist bitte ein Makro in Zusammenang mit VB?
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    1. Frage: wie hast du PosX und PosY deklariert ?
    2. Frage: warum hast du 2 Integer-Arrays genommen wenn du doch gleich ein Point-Array bzw. eine Point-Liste nehmen kannst ?

    3. kleines Beispiel für With:

    VB.NET-Quellcode

    1. ' ohne With
    2. Dim btn as new Button
    3. btn.Text = "Ich bin ein Button"
    4. btn.Width = 100
    5. btn.Location = New Point(75, 0)
    6. btn.ForeColor = SystemColors.ControlDarkDark
    7. ' mit With
    8. Dim btn as new Button
    9. With btn
    10. .Text = "Ich bin ein Button"
    11. .Width = 100
    12. .Location = New Point(75, 0)
    13. .ForeColor = SystemColors.ControlDarkDark
    14. End With

    Funktion verstanden =?

    4. Wie Inopiae schon gesagt : Schleife ist unpassend. Was für eine Schleife solls denn werden ?
    (For c as Double = Double.MinValue to Double.MaxValue wäre wohl zu viel und nicht so schnell stoppbar)
    Ein Timer wäre gut, aber bei 10 ms würde die Form anfangen zu spacken.
    Eine Spontane Idee: nimm eine Form als Fullscreen, durchsichtig und TopMost. So kann der User durchklicken aber noch die MouseMoveEvents abfangen und beim Bewegen die Punkte notieren und evtl. Zwischenspeichern in einer Datei. Must du so sehen : der Timer sucht erst die Maus, dann hast du die Position und addest die. Was wäre wenn der User mal weg ist und sich die Maus kaum bewegt ? Dann ist der Timer unnötige Resourcenverschwendung. Das Event wird immer aufgerufen, wenn es gebraucht wird. Du kannst natürlich das ganze auch mit einem Hook machen und die Mausbewegungen registrieren Wie ein Hook funktioniert ist hier im Forum (glaub von mike69) beschrieben.

    5. Frage: Warum solltest du das Warten innerhalbes einen externen Threads nicht hier auch anwenden können ?

    MfG M4n94fr34k
    Danke erstmal für eure Antworten!

    Also:

    - Gute Idee mit dem Timer, werde ich mal ausprobieren!
    - Was ein Makro-Programm mit VB sein soll? Ganz einfach:
    Ich habe eine kleine Form mit zwei Buttons "Aufnehmen" und "Abspielen". Bei "Aufnehmen" sollen dann alle Positionen der Maus gespeichert werden, bis Escape gedrückt wird. Bei "Abspielen" wollte ich das ganze anders herum benutzen.
    - Ich werde mich auch noch mal wegen der Deklaration schlau machen :).
    - Ja, das mit dem With hab ich jetzt verstanden - vielen Dank!

    MfG,
    X-Zat / Momo