GUI-Elemente "elegant" aktivieren oder deaktivieren

  • Hallo zusammen.
    Im Augenblick lerne ich gerade AutoIt durch "Learning-by-doing".
    Jetzt stehe ich vor der Frage, wie man am elegantesten einzelne GUI-Elemente in Abhängigkeit von anderen aktiviert bzw. deaktiviert.
    Zur Aufbereitung von Daten habe ich eine Oberfläche zusammengestellt, in der unter anderem zwei Dateien (Import und Export) und verschiedene Optionen angegeben werden können bzw. müssen.
    Dabei sind einige der einstellbaren Optionen nur verfügbar, wenn eine übergeordnete Checkbox aktiv ist.
    Außerdem soll der Button, der die eigentliche Datenaufbereitung anstößt erst aktiv werden, wenn zumindest die beiden Dateien mit korrekten Dateinamen gesetzt sind.
    Bisher habe ich es so gelöst, dass bei jeder Veränderung eines Elementes eine Routine aufgerufen wird, die für alle Elemente der Oberfläche prüft, ob diese aktiviert bzw. deaktiviert werden müssen.
    Diese Lösung funktioniert zwar, aber erscheint mir selber doch eher unelegant und wenig effizient.
    Alternativ habe ich schon überlegt, dass jedem Element eine globale boolsche Variable zugeordnet ist und ich dann im Hauptprogramm jeden möglichen Zustand prüfe, um dann nur den Status einzelner Elemente umschalten zu müssen.
    Mein erster Versuch mit dieser Variante hat allerdings manchmal zur Folge, dass die GUI "flackert" also dass man erkennt, wie die Aktualisierung der einzelnen Elemente vonstatten geht.
    Wahrscheinlich ist die Frage schon eher etwas "philosophisch", aber gibt es überhaupt einen "besten" Weg, so etwas zu realisieren?
    Wie macht ihr dass, wenn ihr GUIs entwerft?
    Gruß
    Benne
    PS: Ich hoffe mal, ich habe mich einigermaßen verständlich ausgedrückt :huh:

  • Hallo benne,

    so z.B.: [spoiler]

    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    Example()

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

    Func Example()
    Local $Checkbox_1, $Checkbox_2, $Checkbox_3, $Checkbox_4, $Kopieren, $msg

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

    GUICreate("My GUI with Checkboxgroup") ; will create a dialog box that when displayed is centered

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

    GUICtrlCreateGroup("Datei zum kopieren auswählen:", 10, 10, 190, 200)
    $Checkbox_1 = GUICtrlCreateCheckbox("Checkbox 1", 20, 40)
    $Checkbox_2 = GUICtrlCreateCheckbox("Checkbox 2", 20, 70)
    $Checkbox_3 = GUICtrlCreateCheckbox("Checkbox 3", 20, 100)
    $Checkbox_4 = GUICtrlCreateCheckbox("Sind Sie sicher???", 20, 130)
    $Kopieren = GUICtrlCreateButton("Kopieren", 30, 170)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ;close group

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

    GUICtrlSetState($Checkbox_2, $GUI_DISABLE)
    GUICtrlSetState($Checkbox_3, $GUI_DISABLE)
    GUICtrlSetState($Kopieren, $GUI_DISABLE)

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

    GUISetState() ; will display the GUI

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

    ; Run the GUI until the dialog is closed
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Checkbox_1
    If BitAND(GUICtrlRead($Checkbox_1), $GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($Checkbox_2, $GUI_ENABLE)
    GUICtrlSetState($Checkbox_3, $GUI_ENABLE)
    Else
    GUICtrlSetState($Checkbox_2, $GUI_DISABLE)
    GUICtrlSetState($Checkbox_3, $GUI_DISABLE)
    EndIf
    Case $Checkbox_4
    If BitAND(GUICtrlRead($Checkbox_4), $GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($Kopieren, $GUI_ENABLE)
    Else
    GUICtrlSetState($Kopieren, $GUI_DISABLE)
    EndIf

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

    Case $Kopieren
    If BitAND(GUICtrlRead($Checkbox_1), $GUI_CHECKED) = $GUI_CHECKED Then
    MsgBox(0, "Checkbox", "1 ausgewählt")
    If BitAND(GUICtrlRead($Checkbox_2), $GUI_CHECKED) = $GUI_CHECKED Then MsgBox(0, "Checkbox", "2 ausgewählt")
    If BitAND(GUICtrlRead($Checkbox_3), $GUI_CHECKED) = $GUI_CHECKED Then MsgBox(0, "Checkbox", "3 ausgewählt")
    EndIf
    EndSwitch
    WEnd
    EndFunc ;==>Example

    [/autoit]

    [/spoiler

    mfg (Auto)Bert


  • Hi (Auto)Bert,
    danke für die schnelle Antwort.
    Auf den ersten Blick scheint das genau das zu sein, was ich suche.
    Ich werd' es morgen mal direkt ausprobieren und dann noch mal kurz 'ne Rückmeldung geben.
    Gruß
    Benne

  • Zitat von »AutoBert«
    Hallo benne,

    so z.B.:

    :?:
    oder so:

    Spoiler anzeigen
    [autoit]

    ;#include <GuiComboBox.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ;#include <array.au3>

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

    #include <File.au3>

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

    Const $sElect = "bitte einen Benutzer auswählen"

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

    $hGui = GUICreate("Combobox mit INI ", 250, 120, 302, 218)
    $hcboUsers = GUICtrlCreateCombo($sElect, 8, 8, 200, 25,$CBS_DROPDOWNLIST)
    $hlblUser = GUICtrlCreateLabel("",8,35,200,25)
    $hbtnOpen = GUICtrlCreateButton("&Öffnen", 8, 65)
    GUICtrlSetState($hbtnOpen, $GUI_DISABLE)

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

    $list1 = _FileListToArray(@ScriptDir & "\Profiles", "*.ini", 1)

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

    If @error Then
    if MsgBox(36, "Keine Datei gefunden!", "Testdaten erzeugen?") = 6 then
    $sData = "Key1=Value1" & @LF & "Key2=Value2" & @LF & "Key3=Value3"
    if not FileExists(@ScriptDir & "\Profiles") then DirCreate(@ScriptDir & "\Profiles")
    $sIniName = @ScriptDir & "\Profiles\TestUser.ini"
    IniWriteSection($sIniName, "Sektion1", $sData)
    GUICtrlSetData($hcboUsers, "TestUser")
    Else
    Exit
    EndIf
    Else
    For $i = 1 To $list1[0]
    $sUser = StringTrimRight($list1[$i], 4)
    GUICtrlSetData($hcboUsers, $sUser)
    Next

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

    EndIf

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hcboUsers
    If GUICtrlRead($hcboUsers) = $sElect Then
    GUICtrlSetState($hbtnOpen, $GUI_DISABLE)
    GUICtrlSetData($hlblUser,"")
    Else
    GUICtrlSetState($hbtnOpen, $GUI_ENABLE)
    GUICtrlSetData($hlblUser,GUICtrlRead($hcboUsers))
    EndIf
    Case $hbtnOpen
    $sIniName = @ScriptDir & "\Profiles\" & GUICtrlRead($hcboUsers) & ".ini"
    $aIniVars = IniReadSection($sIniName, "Sektion1")
    ;_ArrayDisplay($aIniVars,"Sektion1:")
    If @error Then
    MsgBox(4096, "", "Es ist ein Fehler aufgetreten. Warscheinlich keine INI Datei vorhanden.")
    Else
    For $i = 1 To $aIniVars[0][0]
    MsgBox(4096, "", "Schlüssel: " & $aIniVars[$i][0] & @CRLF & "Wert: " & $aIniVars[$i][1])
    Next
    EndIf

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

    EndSwitch
    WEnd

    [/autoit]

    falls du ein spezielles Problem hast, poste doch dein Skript,

    mfg (Auto)Bert