Frage zur GUI

  • Guten Tag zusammen.


    Ich möchte eine GUI mit einem Eingabefeld. Weiterhin möchte ich, dass jenachdem, welche zahl (1-6) darin eingetragen ist, eine bestimmte andere GUI aufgeht... wie mache ich das?


    (Anmerkung : bin Anfänger und fange mit einem befehl nun nicht viel an)

  • danke dir =) der nachtrag hilft mir mehr als beginner ^^ so weiß man wo man suchen muss =D

    mal sehen was an fragen offen bleibt ^^

  • Zuerst erstellst du die HauptGUI (mit dem Eingabefeld) und schaltest sie mit GUISetState sichtbar. Dann erstellst du die 6 anderen GUIs ganz nach deinen wünschen, aber benutzt noch nicht GUISetState. Dadurch sind sie nicht von Anfang an sichtbar.
    Dann fragst du den Wert des Eingabefelds in der Hauptschleife des Scripts ab und schaltest ggf. die GUIs per GUISetState an/aus.
    Hier noch ein Beispiel (mit Arrays, der Übersicht wgen):

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    $iGUI_Count = 6 ;Number of (sub)GUIs

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

    $hWnd = GUICreate("Main", 400, 200)
    $cInput = GUICtrlCreateInput("", 10, 10, 60, 20)
    $cButton = GUICtrlCreateButton("OK", 80, 10, 60, 20)
    GUISetState()

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

    Global $aGUIs[$iGUI_Count][2]
    For $i = 0 To $iGUI_Count - 1
    $aGUIs[$i][1] = False ;Visibilty state
    $aGUIs[$i][0] = GUICreate("Sub " & $i + 1, 200, 100)
    GUICtrlCreateLabel("GUI Nr. " & $i + 1, 10, 10, 80, 20)
    Next

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

    While True
    $aMsg = GUIGetMsg(1)
    Switch $aMsg[1]
    Case $hWnd ;If message comes form main Window...
    Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE
    Exit
    Case $cButton
    $iGUI = GUICtrlRead($cInput)
    If StringIsInt($iGUI) And $iGUI >= 0 And $iGUI <= $iGUI_Count Then
    $aGUIs[$iGUI - 1][1] = True
    GUISetState(@SW_SHOW, $aGUIs[$iGUI - 1][0])
    EndIf
    EndSwitch
    Case Else ;If message comes form one of the sub Windows...
    For $i = 0 To $iGUI_Count - 1
    If $aGUIs[$i][0] = $aMsg[1] Then ExitLoop
    Next
    $iGUI = $i ;Index of GUI in $aGUIs

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

    Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE
    $aGUIs[$iGUI][1] = False
    GUISetState(@SW_HIDE, $aMsg[1])
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]
  • Nimm besser Switch-Case, die ist eher für GUIGetMsg geeignet. Die Hilfe die AutoIt mitsichbringt ist auf englisch. Die deutsche gibt's links zum Download.

    • Offizieller Beitrag

    Mist, da war name22 schneller mit dem Beispiel. ^^
    Egal, da ich es jetzt schonmal erstellt habe, hier noch meins:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Global $ahChildGui[6], $aMsg, $iReadInput

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

    $hMainGui = GUICreate('Main', 240, 80)
    GUICtrlCreateLabel('Fenster Nr.:', 10, 12, 80, 20)
    GUICtrlSetFont(-1, 10, 400, 0, 'Arial')
    $idInput = GUICtrlCreateInput('', 90, 12, 40, 20)
    $idStart = GUICtrlCreateButton('öffnen...', 140, 10, 80, 25, $BS_DEFPUSHBUTTON)
    GUISetState(@SW_SHOW, $hMainGui)
    For $i = 0 To 5
    $ahChildGui[$i] = GUICreate('Fenster ' & $i + 1, 320, 240)
    Next

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

    While True
    $aMsg = GUIGetMsg(1)
    Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE
    If $aMsg[1] = $hMainGui Then
    Exit
    Else
    GUISetState(@SW_HIDE, $ahChildGui[$iReadInput - 1])
    GUICtrlSetState($idInput, $GUI_FOCUS)
    EndIf
    Case $idStart
    $iReadInput = GUICtrlRead($idInput)
    If $iReadInput > 0 And $iReadInput < 7 Then
    GUISetState(@SW_SHOW, $ahChildGui[$iReadInput - 1])
    GUICtrlSetData($idInput, '')
    Else
    MsgBox(0, 'Fehler', 'Bitte nur Zahlen von 1...6 eingeben!')
    GUICtrlSetData($idInput, '')
    GUICtrlSetState($idInput, $GUI_FOCUS)
    EndIf
    EndSwitch
    WEnd

    [/autoit]
  • Hätte ich schon meinen neuen Akku für's Notebook, hätte ich auch noch eins geliefert.^^

  • nutzt ihr variablen die iwie fest definiert sind? da ihr beide relativ identische benutzt ( ich muss noch vieeel lernen als informatik student :D )

  • Die in der Hilfe auch sind. Automatisch nutzt man die. Aber du kannst dir auch welche selber ausdenken.

  • ah okay, dann ist gut ^^

    war mir grade nur nicht klar wieso ihr exakt die selben benutzt habt =)

    ich bin gespannt wie ich damit klar komme ....

  • Zitat

    war mir grade nur nicht klar wieso ihr exakt die selben benutzt habt =)


    Das ist vermutlich zum Teil Zufall.. Aber es gibt auch bestimmte inoffizielle Richtlinien an die sich natürlich keiner halten muss. Die sollen lediglich das lesen von Code einfacher machen.
    Generell ist es üblich, englische Variablennamen zu verwenden, die Variablen logisch und übersichtlich zu bennenen und ungarische Notation zu verwenden.
    Da in den Beispielen der Hilfe schon seit Ewigkeiten $nMsg als Rückgabewert von GUIGetMsg benutzt wird machen das jetzt fast alle so. Auch in den meisten Tutorials wird das so gemacht.
    Aber da wir den erweiterten Modus von GUIGetMsg verwenden ist das präfix nicht 'n' sondern 'a' weil GUIGetMsg statt einer Zahl ein Array zurückgibt (siehe ungarische Notation).

  • Ich blicke durch eure Beispiele nicht ganz durch ...

    Wie mache ich das denn, das bei jeder Zahl die ich im input eingebe eine andere GUI aufgeht? bei 1 eine mit 1 input, bei 2 eine mit 2 inputfeldern usw ...

  • Zitat

    Wie mache ich das denn, das bei jeder Zahl die ich im input eingebe eine andere GUI aufgeht? bei 1 eine mit 1 input, bei 2 eine mit 2 inputfeldern usw ...


    Das klingt nach keinem besonders effektiven Plan... Was genau soll daraus denn werden? Das kriegt man mit Sicherheit einfacher und sauberer gelöst.

  • Letzten endes ist es zum üben gedacht.

    Es geht um "Angriffe", jenachdem welche zahl x in der Main_GUI eingegeben wird, geht eine neue GUI mit x - Inputs auf in welche man die Zeit eintragen kann die zwischen den Angriffen liegen soll,

  • wenn ich wüsste wie das funktioniert ^^ hab zwar vor ner ewigkeit schonmal mit autoit rumgespielt aber viel is nich hängen geblieben until now ...

  • Momentan siehts so aus

    *edit : das copy paste scheint nicht so wunderbar zu funktionieren

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>
    $MainGui = GUICreate("Input", 200, 200, 900, 250) ;==> MainGUI erstellen
    $Label_GUI = GUICtrlCreateLabel ("Wieviele Angriffe?", 10, 10, 200, 20) ;==> Label in der MainGUI
    $MainInput = GUICtrlCreateInput("", 10, 40, 180, 20) ;==> Input in der MainGUI
    $MainButton = GUICtrlCreateButton("Open!", 10, 70, 180, 20) ;==> Button in der MainGUI

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

    $MainGui = GUISetState() ;==> MainGUI sichtbar
    while 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $MainButton
    $read = GUICtrlRead($MainInput)
    If $read = 1 Then
    MsgBox(0, "1 Angriff?", "Ich glaube für einen Angriff brauchst du dieses Tool nicht", 3)
    elseif $read = 2 Then
    $GUI1 = GUISetState()
    $GUI1 =GUICreate("Fenster" & $read , 280, 150, 10, 10)
    $MainLabel =GUICtrlCreateLabel ("Zeit zwischen den Angriffen in Sekunden", 50, 10, 200, 20)
    $label1 =GUICtrlCreateLabel("Angriff 1", 20, 40, 80, 20)
    $input1 =GUICtrlCreateInput( "", 80, 40, 80, 20)
    $label2 =GUICtrlCreateLabel("--> Angriff 2", 180, 40, 86, 20)
    $Button_Start = GUICtrlCreateButton("Go!", 100, 120, 100, 20)
    Select
    Case $msg = $Button_Start
    AutoItSetOption ( "WinTitleMatchMode" , 2 )
    WinActivate("Internet Explorer")
    sleep (4000)
    senden2()
    $Sleep = GUICtrlRead($Input1 * 1000)
    senden1()
    Exit
    EndSelect
    elseif $read = 3 Then
    $GUI2 = GUISetState()
    $GUI =GUICreate("Fenster" & $read , 280, 180, 10, 10)
    $MainLabel =GUICtrlCreateLabel ("Zeit zwischen den Angriffen in Sekunden", 50, 10, 200, 20)
    $label1 =GUICtrlCreateLabel("Angriff 1", 20, 40, 80, 20)
    $input1 =GUICtrlCreateInput( "", 100, 40, 100, 20)
    $label1 =GUICtrlCreateLabel("Angriff 2", 20, 70, 80, 20)
    $input1 =GUICtrlCreateInput( "", 100, 70, 100, 20)
    $label1 =GUICtrlCreateLabel("Angriff 3", 20, 100, 80, 20)
    $input1 =GUICtrlCreateInput( "", 100, 100, 100, 20)
    $Button_Start = GUICtrlCreateButton("Go!", 100, 140, 100, 20)

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

    ElseIf $read >4 Then
    MsgBox(0, "In Work", "Mehr als 3 Angriffe bisher nicht möglich!", 2)
    endif
    case $msg = -3
    Exit
    EndSelect
    WEnd

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

    Func senden1()
    send("{enter}")
    send("{ctrldown}")
    send("{Tab}")
    send("{ctrlup}")
    Sleep($Sleep)
    endfunc
    Func senden2()
    send("{enter}")
    send("{ctrldown}")
    send("{Tab}")
    send("{ctrlup}")
    Sleep(1000)
    endfunc

    [/autoit]

    Nur weiß ich nicht wie ich dem Button beibringe den Teil darunter zu starten :D die variante die momentan drin steht spurt nicht

    Einmal editiert, zuletzt von timy17 (2. Juni 2012 um 17:51)

  • Hatte grade Lust ein Beispiel zu schreiben...
    Wie wärs denn so?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    Dim $aInput[1] = [0]

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

    $hWnd = GUICreate("Main", 400, 200)
    $cInput_Main = GUICtrlCreateInput("", 5, 5, 60, 20)
    $cButton_OK = GUICtrlCreateButton("OK", 75, 5, 40, 20)
    GUISetState()

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

    $hWnd_Input = GUICreate("Input", 400, 205)

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

    While True
    $aMsg = GUIGetMsg(1)
    Switch $aMsg[1]
    Case $hWnd
    Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE
    Exit
    Case $cButton_OK
    $iCount = GUICtrlRead($cInput_Main)
    If StringIsInt($iCount) And $iCount > 0 Then
    $aInput[0] = $iCount
    ReDim $aInput[$aInput[0] + 1]
    GUISwitch($hWnd_Input)
    For $i = 1 To $aInput[0]
    $aInput[$i] = GUICtrlCreateInput("", 5 + Floor(($i - 1) / Floor(200 / 25)) * 65, 5 + Mod(($i - 1), Floor(200 / 25)) * 25, 60, 20)
    Next
    GUISetState()
    EndIf
    EndSwitch
    Case $hWnd_Input
    Switch $aMsg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $hWnd_Input)
    For $i = 1 To $aInput[0]
    GUICtrlDelete($aInput[$i])
    Next
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]