Problem mit While

  • Hallo Tastaturprofis,

    bin begeisterter AutoIT Anfänger und stehe mal vor einem Problem.
    Ich bin jetzt dabei mal die einzelnen Funktionen durchzuspielen, um
    mich mit der Syntax und der Funktion vertraut zu machen.
    Bin jetzt bei der Funktion „While“.
    Ich möchte nun den Programmablauf bei „While“ anhalten lassen
    solange die Variable unwahr ist und weiterlaufen lassen wenn die Variable wahr ist.
    Bei wahr soll ein Tastendruck gesendet werden und das Skript nach „WEnd“ weiterlaufen.

    Mein Beispiel sieht nun so aus.

    [autoit]


    While $Variable = 1
    Send("{ins}")
    WEnd

    [/autoit]

    Nun wartet das Skript aber nicht bei unwahr sondern setzt das Skript nach „WEnd“ fort
    was es ja nicht soll, sondern warten.
    Und wenn die Variable wahr ist werden in einer Endlosschleife Tastendrücke gesendet und nicht nach einem gesendeten Tastendruck nach „WEnd“ fortgefahren.

    Nun meine Frage.
    Kann ich das mit dieser Funktion überhaupt realisieren?
    Wenn ja, wie ginge das?
    Wenn nein, mit welcher Funktion und wie?

    Würde mich auf eine Antwort von Euch sehr freuen.
    Vielen Dank im voraus.

    Mit freundlichen Grüßen aus Berlin
    Trixi

    Einmal editiert, zuletzt von Trixi (14. Juni 2011 um 20:58)

  • Hallo trixi,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die deutsche Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu deinen Fragen: ja es ist zu realisieren. Es hängt mit deiner Programmlogik zusammen, da diese aber elementar für das Verständnis ist solltest du sie schon selbst entwickeln oder dein komplettes Skript posten, vielleicht ist dann ja jemand so freundlich,

    mfg autoBert

  • z.B. eine If-Abfrage in die While-Schleife einfügen:

    [autoit]


    If WinExists("test") Then $Variable = 0

    [/autoit]
  • Aus der Hilfe zu While: "Wenn der Ausdruck wahr ist, werden die Codezeilen bis WEnd ausgeführt. Die Schleife wird fortgesetzt, bis der Ausdruck unwahr ist."
    Wenn die Bedingung nicht mehr wahr ist, geht der Interpretent bei Schleifenende im Quellentext weiter.

    [autoit]


    Local $a = 1
    While $a = 1
    $a = 0
    Wend
    Exit

    [/autoit]


    Das Beispiel würde folgendes Bewirken: Deklarierung der Variable -> Schleifenbeginn -> $a = 0 -> Schleifenende -> Exit

    Magnus

    Magnus

  • Vielen Dank für Eure schnellen Antworten.
    Danke auch an autoBert.
    Mit dem selbst beibringen ist es nicht so einfach.
    Es gibt keinen Lehrer der einem im Schwierigkeitsgrad
    steigende Aufgaben gibt und Fragen dazu beantwortet
    wenn man nicht weiterkommt. Als Anfänger kennt man
    auch nicht das machbare oder Ausweichmöglichkeiten.

    Ich werde mich mal hinsetzen und mir das gebotene
    zu Gemüte ziehen und zu verstehen.

    Viele Grüße
    und nen schönen Feierabend
    Trixi

  • Ich hab dir mal ein Beispiel gemacht:

    Spoiler anzeigen
    [autoit]

    HotKeySet("{ENTER}", "variable") ; Den Hotkey "Enter" festlegen... (Wenn "Enter" gedrückt wird,
    ; wird die Funktion "variable" aufgerugen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $variable = False ; Variable "$variable" mit dem wert "False"(Unwahr) deklarieren

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1 ; Start der While-Schleife mit der Bedingung 1(wahr)
    Sleep(100) ; 0.1 sec lang nichts tun

    [/autoit] [autoit][/autoit] [autoit]

    If $variable = True Then ; Wenn die Variable "$variable" wahr ist...
    MsgBox("", "Erfolg", "Die Variable ist jetzt wahr") ; ...dann diese MsgBox ausgeben....
    ExitLoop ; ...und die While-Schleife hier Abbrechen und nach "WEnd" weiter machen
    EndIf ; Ende der If-Bedingung
    WEnd ; Ende der While-Schleife

    [/autoit] [autoit][/autoit] [autoit]

    ; Alles unter diesem Kommentar wird nach der While-Schleife ausgegeben
    MsgBox("", "", "Das Script wird nun nach WEnd fortgesetzt")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func variable() ; Funktion "variable" deklarieren (Sie wird von unserem Hotkey aufgerufen)
    ; (siehe oben)
    $variable = True ; Den Wert der Variable "$variable" auf "True"(wahr) legen
    EndFunc ; Ende der Funktion

    [/autoit]

    Dies ist natürlich nur eine Lösung, es gibt noch andere Wege...

    Wenn du Fragen hast, einfach fragen... :)

  • Hallo dada,

    das sieht sehr gut aus.
    Es funktioniert genau so wie ich es mir vorgestellt habe
    Danke auch für Deine Mühe.

    Gleich eine Frage.

    Hat das einfügen von Sleep einen tieferen funktionellen Sinn.

    Viele Grüße in die Schweiz
    Trixi

    Einmal editiert, zuletzt von Trixi (24. Mai 2011 um 21:37)

  • Das ist damit die Prozessorauslastung nicht zu hoch wird, obwohl das bei diesem Script nicht so eine grosse Rolle spielen würde... :)
    Und es kommt halt drauf an, bei diesem Script reicht es, wenn 10 mal in der Sekunde überprüft wird, ob die Variable wahr ist. Und bei anderen Sachen muss mann halt ohne sleep(z. B. bei einer GUI), oder mit einem kürzeren sleep arbeiten...


    Also, es wäre nicht nötig gewesen... :)

    Gruss David

  • aha,
    das mit der Prozessorauslastung ist gut zu wissen.

    Danke noch mal an alle.

    Tschüß


  • Woah, schrecklich zu lesen für meine Augen, ich empfehle für alle Ausdrücke immer Klammern^^


    Wo, Wie, Was für Klammern?

    Die Kommentare waren am Anfang schön gebündelt, aber als ich das hier ins Forum kopierte, war s halt nicht mehr so. ?(
    Und ich hatte keine Lust mehr, das schön zu bündeln... ;)

  • is übersichtlicher, wenn du schreibst
    While ($i<100)
    ; mach irgendwas
    Wend
    als ohenKlammern, vor allem wenn die Ausdrücke komplizierter werden.
    Ich würde aber auch nie auf die Idee kommen, While (1) für nen Dauerloop zu schreiben :D^^