Button klick -> FileOpenDialog

  • Hey.

    Kleine Frage:
    Wie kann ich den FileOpenDialog öffnen, wenn ich auf einen Button im Gui klicke?
    Wie krieg ich es hin, dass sich der Buttontext ändert? Also Ausgang ist "Start", sobald ich darauf klicke wird es zu "Stop" und erneutes klicken auf "Stop" bewirkt, dass es wieder zu "Start" wird. Dabei sollte auch das ganze Script pausiert werden, was eigentlich nicht schwer ist.

    mfg

    • Offizieller Beitrag

    Button Klick erzeugt ein Ereignis.
    Entweder mit von dir definierter Funktion (OnEvent-Mode) oder GUIGetMsg liefert die Button-ID.
    Das wertest du aus und läßt damit FileOpenDialog öffnen.
    Die Beschriftung wechselst du mit GUICtrlSetData. Hinterlege den Status in einer Variablen, die du einfach hin- und herschaltest 0/1 und je nach Zustand deinen Text switchst.

  • Bin mir nicht sicher ob ich dich richtig verstanden habe:

    [autoit]

    ; ...

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

    $Button = GUICtrlCreateButton("Start", 10, 10, 50, 20)

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

    ; ...

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

    While 1
    Switch GUIGetMsg()
    Case $Button
    GUICtrlSetData($Button, "Stop")
    FileOpenDialog("...")
    Do
    Sleep(10)
    Until GUIGetMsg() = $Button
    GUICtrlSetData($Button, "Start")
    ; Case $Bla
    ; ...
    ; Case Else
    ; ...
    EndSwitch
    WEnd

    [/autoit]
  • ok, das funzt jetzt :P

    zwischen Do und Until kann ich dann das script einfügen, dass ausgeführt werden soll, weil jetzt wird ja nur 10ms gewartet bis wieder Stop geklickt wird.

    Im Gui ist eine Inputbox, in der dann der Pfad steht zur datei, die vorher mit FileOpenDialog geöffnet wurde. Wenn man auf Save bzw Exit klickt, wird das in der einer Ini gespeichert.
    Wie krieg ich das jetzt hin, dass beim start des scriptes die Ini ausgelesen wird und der Pfad in der Inputbox steht?
    das es mit IniRead geht weiß ich, nur wie genau?

    //Edit:

    neues problem. :P Hab jetzt noch eine Checkbox eingefügt und wenn die angekreuzt ist, soll ein anderer teil des scriptes ausgeführt werden.
    Also z.B.
    Angekreuzt -> Sounddatei wird abgespielt (+5min warten) und PC wird ausgeschaltet
    nicht angekreuzt -> Sounddatei wird abgespielt ohne shutdown

    Einmal editiert, zuletzt von ^T!Tu$ (29. Oktober 2007 um 15:04)

  • Das bekommst du aber sehr übersichtlich mit Beispiel aus der Hilfe.

  • [autoit]

    $shutdown=GUICtrlCreateCheckbox("Shutdown on DC",9,47,102,20,-1,-1)
    $check = 0
    GuiCTRLSetState ($shutdown, $check)

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

    If GuiCTRLSetState ($shutdown, 1) Then
    If PixelGetColor (495, 428) = 16710616 Then
    SoundSetWaveVolume (100)
    Sleep (1000)
    SoundPlay ($soundfile)
    Sleep (1000)
    MouseClick ("left", 509, 422)
    Sleep (300000)
    Shutdown (5)
    EndIf

    [/autoit]


    so hab ich das jetzt gelöst. funzt auch einwandfrei :P

  • ||

    Du fragst aber den Zustand der Checkbox nicht ab, sondert setzt ihn:

    Code
    If GuiCTRLSetState ($shutdown, 1) Then...

    GuiCtrlGetState war wohl gemeint. Aber damit kommst du auch nicht weit, wenn du den Status haben willst, probiert das:

    GuiCtrlGetState liefert bei der Checkbox immer den Wert 80 zurück, egal ob angeklickt oder nicht.

    ||

    Einmal editiert, zuletzt von zio82draw (29. Oktober 2007 um 15:52)

  • sobald die CheckBox ausgewählt ist, geht der stopbutton nicht mehr.

    mal das ganze script

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <file.au3>

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

    GUICreate("MeineGUI",269,105)
    GUISetState(@sw_show)

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

    $msg="Search Mp3 Soundfile..."
    $search=GUICtrlCreateButton("Search File...",171,19,85,24,-1,-1)
    $filepath=GUICtrlCreateInput("MP3 Soundfile",9,21,150,20,-1,-1)
    $start=GUICtrlCreateButton("Start",184,72,80,20,-1,-1)
    $save=GUICtrlCreateButton("Save",97,72,80,20,-1,-1)
    $exit=GUICtrlCreateButton("Exit",7,72,80,20,-1,-1)
    $shutdown=GUICtrlCreateCheckbox("Shutdown on DC",9,47,102,20,-1,-1)
    $check = 0
    GuiCTRLSetState ($shutdown, $check)

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

    While 1

    Switch GUIGetMsg()
    Case $start
    GUICtrlSetData($start, "Stop")
    Do
    ToolTip('Script is "Running"',0,0)


    IF WinActive ("SRO_Client") Then
    If GuiCtrlRead($shutdown) = $GUI_CHECKED Then
    If PixelGetColor (495, 428) = 16710616 Then
    SoundSetWaveVolume (100)
    Sleep (1000)
    SoundPlay ($soundfile, 0)
    Sleep (1000)
    MouseClick ("left", 509, 422)
    Sleep (300000)
    Shutdown (5)
    EndIf

    EndIf
    If PixelGetColor (495, 428) = 16710616 Then
    SoundSetWaveVolume (100)
    Sleep (1000)
    SoundPlay ($soundfile, 0)
    Sleep (1000)
    MouseClick ("left", 509, 422)
    EndIf
    EndIf

    Sleep(10)
    Until GUIGetMsg() = $start

    ToolTip ('Script is "Paused"', 0,0)
    GUICtrlSetData($start, "Start")

    Case $search
    GuiCtrlSetData ($search, "Search File...")
    $soundfile = FileOpenDialog($msg, "C:\Windows\", "Soundfile (*.mp3;*.wav)", 1 + 2)
    GUICtrlSetData($filepath, $soundfile)

    Case $exit
    IniWrite("myfile.ini", "Settings", "filepath", $soundfile)
    Exit

    Case $save
    IniWrite("myfile.ini", "Settings", "filepath", $soundfile)

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


    EndSwitch
    WEnd

    [/autoit]
  • ||

    Der tolle Sleep-Befehl hat einen riesengroßen Nachteil, weshalb man ihn so gut wie nie im Zusammenhang mit einer GUI gebrauchen sollte. Es geht wärend dieser Zeit nichts, was du irgendwie mit Schleifen abfragst.

    Du legst dein Script auch 30 Sekunden lang schlafen. Ist ein bißchen viel. Wie gesagt in dieser Zeit kannst du keine Interaktionen abfragen.

    ||

  • das sollen 5min sein :P

    wie krieg ich es dann hin, dass 5min gewartet werden und dann shutdown, aber der stop button noch funktioniert?

  • ||

    Zum Beispiel mit einem Timer. Der wird initiert (TimerInit() ). In der AutoIT-Hilfe findest du auch ein Beispiel. Lass dich aber nicht von dem Sleep-Befehl täuschen. Wenn man es in einer Schleife einbaut könnte es so aussehen:

    Spoiler anzeigen

    Nimm dir einfach ein bißchen mehr Zeit es zu verstehen, um es dann auf den Beispiel zu übertragen. Es bringt nichts blind Code oder Funktionen zu nutzen. Es hilft immer sich die Sachen genauer anzugucken.

    ||

    Einmal editiert, zuletzt von zio82draw (30. Oktober 2007 um 08:32)

  • danke. :)

    bin mit dem beispiel nicht zurecht gekommen. hab versucht die zeit auf 10sek zu setzen bei dem beispiel, da wurde das script immer nach 0,2sek beendet. :/

    danke nochmal für die hilfe =)

  • ||

    Bei meinem Beispiel oder bei deinem?

    Ist dir bewußt das sich die Zeitangaben immer im Millisekundenbereich befinden? (Hoffe doch)

    ||

  • yaya, das ist mir schon klar. deshalb ja auch in meinem script SLeep (300000) für 5min warten.

    ne, nicht bei deinem beispiel, sondern bei dem aus der hilfe datei. ;)

  • Hi,

    @^T!Tu$ zu Deinem Skript:
    1. Inkludiere nur die Dateien, die du wirklich benötigst.
    2. Benutze am besten Opt("MustDeclareVars", 1) oben im Skript.
    3. Setze die GUI besser erst auf sichtbar, wenn alle GUI-Elemente erzeugt wurden.
    4. Setze die Elemente der GUI erst auf enabled, wenn es Sinn ergibt. Vorher wäre Dein Skript auch mit leerem Inputfeld gestartet.
    5. Die Sleeps beim SoundPlay kannst Du Dir sparen, nutze lieber den Parameter "wait" der Funktion.
    6. Benutze wie angesprochen Timer.
    7. Benutze Tidy (in SciTE STRG+T) um dein Skript zu säubern und poste es dann.

    Hier nun das Skript:

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #include <GUIConstants.au3>

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

    main()

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

    Func OnAutoItStart()
    Opt("MustDeclareVars", 1)
    EndFunc ;==>OnAutoItStart

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

    Func main()
    Local Const $S_CFGFILE = @ScriptDir & "\MyFile.ini"
    Local $n_timer = 0, $s_soundfile = "", $h_searchbt = 0, $h_pathinp = 0, _
    $h_startbt = 0, $h_savebt = 0, $h_exitbt = 0, $h_sdownchkbox = 0

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

    GUICreate("MyGUI", 269, 105)
    $h_pathinp = GUICtrlCreateInput(IniRead($S_CFGFILE, "Settings", "Filepath", ""), 9, 21, 150, 20)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $h_searchbt = GUICtrlCreateButton("Search File...", 171, 21, 85, 20)
    $h_startbt = GUICtrlCreateButton("Start", 184, 72, 80, 20)
    $h_savebt = GUICtrlCreateButton("Save", 97, 72, 80, 20)
    $h_exitbt = GUICtrlCreateButton("E&xit", 7, 72, 80, 20)
    $h_sdownchkbox = GUICtrlCreateCheckbox("Shutdown on DC", 9, 47, 102, 20)

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

    If Not GUICtrlRead($h_pathinp) Then
    GUICtrlSetState($h_startbt, $GUI_DISABLE)
    GUICtrlSetState($h_savebt, $GUI_DISABLE)
    EndIf
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $h_exitbt
    INIWriteFilePath($S_CFGFILE, $h_pathinp)
    Exit
    Case $h_searchbt
    $s_soundfile = FileOpenDialog("Search Soundfile...", @WindowsDir, "Soundfile (*.mp3;*.wav)", 3)
    If $s_soundfile Then
    GUICtrlSetData($h_pathinp, $s_soundfile)
    GUICtrlSetState($h_startbt, $GUI_ENABLE)
    GUICtrlSetState($h_savebt, $GUI_ENABLE)
    EndIf
    Case $h_startbt
    GUICtrlSetData($h_startbt, "Stop")
    Do
    ToolTip('Script is "running"', 0, 0)
    If WinActive("SRO_Client") Then
    If PixelGetColor(495, 428) = 16710616 Then
    SoundSetWaveVolume(100)
    SoundPlay($s_soundfile, 1)
    MouseClick("left", 509, 422)
    If GUICtrlRead($h_sdownchkbox) = $GUI_CHECKED Then
    $n_timer = TimerInit()
    While 1
    If TimerDiff($n_timer) > 300000 Then Shutdown(5)
    WEnd
    EndIf
    EndIf
    EndIf
    Until GUIGetMsg() = $h_startbt
    ToolTip('Script is "paused"', 0, 0)
    GUICtrlSetData($h_startbt, "Start")
    Case $h_savebt
    INIWriteFilePath($S_CFGFILE, $h_pathinp)
    EndSwitch
    WEnd
    EndFunc ;==>main

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

    Func OnAutoItExit()
    GUIDelete()
    EndFunc ;==>OnAutoItExit

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

    Func INIWriteFilePath(Const $S_CONFIG, ByRef Const $H_CTRL)
    Local Const $S_PATH = GUICtrlRead($H_CTRL)
    If $S_PATH Then IniWrite($S_CONFIG, "Settings", "Filepath", $S_PATH)
    EndFunc ;==>INIWriteFilePath

    [/autoit]
  • Hey :)

    danke, hab gestern noch ~2h am script gesessen, weil mir der fehler "Variable used before declared" angezeigt wurde.
    Ich les mir mal das script durch.

    bin nunmal noch ein anfänger, deshalb noch alles bissl komisch bei mir im script. :P