Funktion mit Schleife durch andere Funktion beende.

  • Hallo Leute,
    ich habe ein kleines bis mittelschweres Problem.
    Ich starte durch den Druck auf einen Button eine Funktion in der eine While-Schleife läuft (listview).
    Bei dem Druck auf den Button "Cancel" soll die Schleife sich beenden.
    Mein gesamtes Skript (noch wesentlich größer) soll mit dem GUIOnEventMode laufen.
    Wenn ich nun in der While-Schleife gefangen bin, sind dem Skript sämtliche andere Funktionen und Button-Drücke egal.
    Die Schleife kann ich nur durchbrechen, wenn ich ein Hotkey mit Referenz auf die cancel()-Funktion lege, nicht jedoch durch Knopfdruck.
    Ich möchte allerdings keinen Hotkey.
    Habt ihr eine Idee?
    Würde mich riesig freuen.

    Vielen Dank

    Im Anhang der entscheidene Code-Teil:

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

    Opt("GUIOnEventMode",1)

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

    GUICtrlSetOnEvent($run_KL2, "listview")
    GUICtrlSetOnEvent($stop_KL2, "cancel")

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

    Func listview()
    Dim $i, $aContent, $aContent_old
    GuiCtrlSetData($listview, "")
    $cancel=0
    $aContent_old=0
    While 1
    If $cancel=1 Then
    ExitLoop 1
    Else
    _FileReadToArray("hier das file", $aContent); reads txtfile, on array 0 it gives the nr of lines
    If Not _FileReadToArray("hier ein weiteres file", $aContent) Then
    Else
    If $aContent[0]<>$aContent_old Then
    $aContent_old=$aContent_old+1
    For $i=$aContent_old to $aContent[0]
    _GUICtrlListBox_InsertString($listview, $aContent[$i], -1)
    Next
    _GUICtrlListBox_SetCurSel($listview, _GUICtrlListBox_GetCount($listview) - 1)
    $aContent_old=$aContent[0]
    EndIf
    EndIf
    EndIf
    WEnd
    $list=0
    EndFunc

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

    Func cancel()
    local $request
    $request = MsgBox(1, "cancel", "do you really want to cancel?")
    If $request = 1 Then
    $cancel= 1
    EndIf
    Endif
    EndFunc

    [/autoit]
  • Also der OnEvent Mode sollte auch in dieser While-Schleife funktionieren. Dafür ist er ja da. Eigentlich sollte es gehen, wenn du die Funktion cancel einfach beim Button-Click ausführt.

    Gruss Shadowigor

  • Das habe ich jetzt auch in mehreren Foren/Beiträgen gelesen.
    Aber leider funktioniert es nicht. Es geht ausschließlich mit einem Hotkey.

    Ich verstehe es auch nicht. Es betrifft aber auch sonst alle Funktionen.
    Wenn ich beispielsweise die Funktion "GUI-Beenden"(also das X oben rechts) drücke, reagiert er nicht.

    Wenn ich daraufhin per Hotkey die While-Schleife durchbreche hat er sich aber sämtliche Funktionsaufrufe gemerkt, die ich während der Schleife getätigt habe.
    In dem Fall führt er also nach der While-Schleifen dann die Beenden-Funktion aus. Halt alle, die ich während der Schleife aufrufen wollte.

    Viele Grüße

  • Habe den Code leider nicht hier, sondern am Arbeitsplatz.
    Aber im Prinzip steht doch alles wichtige in dem Code oben, oder?!

    Opt("GUIOnEventMode",1)
    GUICtrlSetOnEvent($run_KL2, "listview")
    GUICtrlSetOnEvent($stop_KL2, "cancel")

    Mit der ersten Zeile lege ich fest, dass ich den OnEventMode möchte.
    In Zeile 2 und 3 ordne ich den Button ihre jeweiligen Funktionen zu.

    Über "$run_kl2" führt er also die Funktion mit der While-Schleife aus. Und aus dieser gibts kein entkommen mehr.
    Seltsam finde ich aber, dass er sich die anderen Funktionen "merkt", bis man die Schleife durch den Hotkey beendet.
    Gibt es vlt noch etwas anderes, dass ich übersehen haben könnte=?

    Viele Grüß

  • Hallo floeso,

    da dein Skript nicht formatiert war habe ich Tante Tidy bemüht, das Ergebnis:

    Code
    >"D:\Programme\AutoIt3\SciTE\tidy\tidy.exe" "D:\Programme\AutoIt3\Test\asdf.au3"
    Tidy AutoIt3 v2.0.28.3   Copyright (c) Jos van der Zande  April 29, 2009
    D:\Programme\AutoIt3\Test\asdf.au3(61) : ### Tidy Error -> "endif" is closing previous "func" on line 54
    D:\Programme\AutoIt3\Test\asdf.au3(63) : ### Tidy Error: next line creates a negative tablevel.
    D:\Programme\AutoIt3\Test\asdf.au3(64) : ### Tidy Error: next line creates a negative tablevel for the line after it.
    !> there were  3 error(s) encountered. look in your source for:### Tidy Error:
    +> Tidy AutoIt3 finished. Original copied to:"D:\Programme\AutoIt3\Test\BackUp\asdf_old17.au3"
    >Exit code: 3    Time: 0.925

    du solltest also als aller erstes die Fehler in deinem Skript beheben, unformatiert erhalte ich folgende Fehler beim starten:

    am besten stellst du dein komplettes Skript ein. Der haupsächliche Fehler (aber nicht deine Frage) ist in:

    bereinigt
    [autoit]

    Func cancel()
    Local $request
    $request = MsgBox(1, "cancel", "do you really want to cancel?")
    If $request = 1 Then
    $cancel = 1
    EndIf
    EndFunc ;==>cancel

    [/autoit]

    Das Verhalten da du beschreibst ist AutoIt typisch. Da ichaber keine Lust habe eine Gui zu deinem Code zu basteln must du es wohl alleine versuchen.Als kleiner Tipp du kommst nicht darum herum:

    • entweder vor der Schleife den OnEventMode abzuschalten,innerhalb der Schleife mit GuiGetMsg() das drücken des Cancel-Buttons abzufragen und nach der Schleife wieder den OnEventMode einzuschalten
    • oder in der Schleife auf _IsPressed zu reagieren

    mfg autoBert