Eine Funktion wird ständig wieder ausgeführt (soll aber nicht sein)

  • Hey,

    ich arbeite gerade an einem Script welches ein Textbearbeitungsprogramm öffnet, eine Datei abspeichert im rtf-Format. Danach wird Word gestartet und die Datei öffnet und als .Doc speichert.
    Das meiste davon geht über "Send".
    Soweit so gut, nun habe ich folgendes Problem, dass wenn ich auf den Button klicke welcher die Funktion startet die diesen Ablauf automatisiert, diese zwar durchläuft jedoch dann gleich wieder von vorne anfängt. Hier ein Auszug aus dem Quellcode:

    Das Problemkind ist der Button $umwandeln

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

    Func _Konvertierung()

    _ID_auslesen()

    _current_ID_bestimmen()

    $hauptfenster = GUICreate( "Umwandlung Baubüro -> Word", 400, 250, -1, -1, -1,$WS_EX_ACCEPTFILES)

    $profil_waehlen = GUICtrlCreateButton( "Profil auswählen", 50, 10, 120, 30)

    $profil = GUICtrlCreateLabel( "Kein Profil gewählt", 200, 13, 140, 24, BitOR($BS_PUSHLIKE, $SS_CENTER))
    GUICtrlSetFont( $profil, 12, 600)

    $file = GUICtrlCreateInput( "", 10, 80, 330, 30)
    GUICtrlSetFont( $file, 12, 400)
    GUICtrlSetState( $file, $GUI_DROPACCEPTED)

    $open = GUICtrlCreateButton( "", 360, 75, 30, 40, $BS_ICON)
    GUICtrlSetImage( -1, "shell32.dll", 2)

    $umwandeln = GUICtrlCreateButton( "umwandeln", 160, 200, 80, 30)

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

    GUISetState(@SW_SHOW, $hauptfenster)

    While 1

    $msg = GUIGetMsg()

    If $msg = $open Then
    $file_open = FileOpenDialog( "Datei auswählen", "C:\", "Baubüro-dokumente (*.bbd;*.bbv)", 1 + 2)
    GUICtrlSetData( $file, $file_open)
    EndIf

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

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop

    If $msg = $umwandeln Then
    MsgBox( 64, "Ertappt", "-.-")
    umwandeln()
    EndIf

    If $msg = $profil_waehlen Then
    GUISetState(@SW_HIDE, $hauptfenster)
    GUISetState(@SW_DISABLE, $hauptfenster)
    Profile()
    GUISetState(@SW_ENABLE, $hauptfenster)
    GUISetState(@SW_SHOW, $hauptfenster)
    EndIf

    WEnd

    EndFunc

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

    ; Und die Funktion um die es geht:

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

    Func umwandeln()

    $file_bbd = GUICtrlRead($file)

    GUISetState( @SW_DISABLE, $hauptfenster)

    Send("{SPACE}")
    Run( RegRead( "HKEY_LOCAL_MACHINE\SOFTWARE\Konvert Delta\Profile\" & $bb_ID, "BRZ32 Ordner") & "\Prog\Tx\BrzTxMp.exe")
    WinWaitActive( "BRZ Login")
    Send("+{TAB}")
    Send($bb_benutzer)
    Send("{TAB}")
    Send($bb_codewort)
    Send("!o")
    WinWaitActive( "BRZ Bau-Büro")
    Send("!d{DOWN}{ENTER}")
    WinWaitActive("Öffnen")
    Send($file_bbd)
    Send("!f")
    Sleep(500)
    Send("!d{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}")
    WinWaitActive("Speichern unter")
    Send("{TAB}r+{TAB}")
    $file_rtf = StringTrimRight( $file_bbd, 4)
    Send($file_rtf)
    Send("!s")
    WinWaitActive( "Dokumentinfos")
    Send("!o")
    WinClose( "BRZ Bau-Büro")
    Sleep(500)
    Send("!n")

    $file_dir = StringTrimRight($file_bbd, StringLen($file_bbd) - StringInStr($file_bbd, "\", 2, -1)) & "Umgewandelt\"
    Sleep(500)
    FileMove($file_bbd, $file_dir, 8)

    Run( "C:\Programme\Microsoft Office\OFFICE11\Winword.exe")

    WinWaitActive( "Microsoft Word")
    Send("^o")
    WinWaitActive( "Öffnen")
    $file_doc = StringTrimRight( $file_bbd, 3) & "doc"
    MsgBox( 64, "Test", $file_doc, 5)
    Send($file_rtf & ".rtf")
    Sleep(1000)
    Send("!f")
    Sleep(1000)
    Send("!du")
    WinWaitActive("Speichern unter")
    Send("{TAB}Word-Dokument{ENTER}+{TAB}")
    Sleep(1000)
    Send($file_doc)
    Send("!p")

    GUISetState( @SW_ENABLE, $hauptfenster)

    EndFunc

    [/autoit]

    Ich habe extra eine MsgBox eingebaut um zu sehen von wo die Schleife anfängt, nur blicke ich nicht durch, warum er die Funktion wieder startet.

    Vielleicht kennt ja jemand das Problem oder sieht den Fehler. Es sieht wohl so aus, als ob das Script denkt, ich hätte den Button immernoch gedrückt..


    Mit freundlichen Grüßen

    Prajoss

    "Never touch a running System!"

    2 Mal editiert, zuletzt von Prajoss (19. November 2008 um 14:27)

  • Moin,

    ich kann so direkt keinen Fehler erkennen.
    Vielleicht solltest Du in den If Abfragen der Nachrichtenschleife des Fensters explizit den Vergleichsoperator '==' benutzen.
    Das '=' könnte evtl. als Zuweisung gewertet werden und sollte nicht als Vergleichsoperator genutzt werden ...

    Oder Du nimmst eine Switch Abfrage in der Nachrichtenschleife.

    Besser wäre vielleicht auch, in der umwandeln() die Control...() Funktionen zu nutzen, anstatt Send().


    LG
    Greenhorn


  • Zitat

    Vielleicht solltest Du in den If Abfragen der Nachrichtenschleife des Fensters explizit den Vergleichsoperator '==' benutzen.
    Das '=' könnte evtl. als Zuweisung gewertet werden und sollte nicht als Vergleichsoperator genutzt werden ...

    Hab ich gemacht, ändert nichts am Problem, außerdem steht das so in der Hilfe da, dass man nur "=" für If-Abfragen nutzen kann.
    Ich werde mich bessern und nun "==" benutzen der Lesbarkeitshalber :)

    Zitat

    Oder Du nimmst eine Switch Abfrage in der Nachrichtenschleife.

    Das werde ich gleich testen

    Zitat

    Besser wäre vielleicht auch, in der umwandeln() die Control...() Funktionen zu nutzen, anstatt Send().

    Ich denke das wird nicht das Problem verursachen aber ich seh sie mir mal genauer an, vorallem ControlSend(), danke ;)

    Gruß

    Prajoss

    "Never touch a running System!"

  • Ich glaube ich habe es !

    [autoit]

    ; Und die Funktion um die es geht:

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

    Func umwandeln()

    $file_bbd = GUICtrlRead($file)

    GUISetState( @SW_DISABLE, $hauptfenster)

    Send("{SPACE}")

    [/autoit]


    Send("{SPACE}") auskommentieren, dann geht's. ;)
    Send("{SPACE}") bewirkt, dass die Schaltfläche 'umwandeln' noch einmal gedrückt wird - da diese nun den Fokus hat -, trotz @SW_DISABLE !
    Was soll der Aufruf an dieser Stelle denn bewirken ?
    Wie gesagt, die Control...() Funktionen sind sicherer als Send(), da diese nur an das betreffende Fenster gesendet werden.


    LG
    Greenhorn


  • Das dachte ich mir bereits aber als ich es getestet habe war der trotzdem noch da, hmm warscheinlich das
    Script nicht abgespeichert nach der Änderung :pinch:

    Der Aufruf soll bewirken dass, wenn jemand vor dem Drücken des Buttons noch die Taste "^" gedrückt hat, dass es keine Verfälschung im gesendeten Text gibt ;)

    sonst ist der erste Buchstabe kein a sondern ein â... Gibt sicher auch einen Befehl den Tastaturpuffer zu leeren, weiß den jemand grade auf die schnelle? sonst such ich halt :)

    Gruß

    Prajoss

    PS: Danke Greenhorn

    "Never touch a running System!"