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 ![]()
GUI-Elemente "elegant" aktivieren oder deaktivieren
-
- [ offen ]
-
benne -
27. Januar 2010 um 22:53 -
Geschlossen -
Erledigt
-
-
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()
[/autoit][autoit][/autoit][autoit]
Local $Checkbox_1, $Checkbox_2, $Checkbox_3, $Checkbox_4, $Kopieren, $msgGUICreate("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)
[/autoit][autoit][/autoit][autoit]
$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 groupGUICtrlSetState($Checkbox_2, $GUI_DISABLE)
[/autoit][autoit][/autoit][autoit]
GUICtrlSetState($Checkbox_3, $GUI_DISABLE)
GUICtrlSetState($Kopieren, $GUI_DISABLE)GUISetState() ; will display the GUI
[/autoit][autoit][/autoit][autoit]; Run the GUI until the dialog is closed
[/autoit][autoit][/autoit][autoit]
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)
EndIfCase $Kopieren
[/autoit]
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[/spoiler
mfg (Auto)Bert
-
Alles anzeigen
Hallo benne,
so z.B.: [spoiler]
[autoit]#include
[/autoit] [autoit][/autoit] [autoit]Opt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit]Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
[/autoit] [autoit][/autoit] [autoit]
Local $Checkbox_1, $Checkbox_2, $Checkbox_3, $Checkbox_4, $Kopieren, $msgGUICreate("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)
[/autoit] [autoit][/autoit] [autoit]
$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 groupGUICtrlSetState($Checkbox_2, $GUI_DISABLE)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetState($Checkbox_3, $GUI_DISABLE)
GUICtrlSetState($Kopieren, $GUI_DISABLE)GUISetState() ; will display the GUI
[/autoit] [autoit][/autoit] [autoit]; Run the GUI until the dialog is closed
[/autoit] [autoit][/autoit] [autoit]
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)
EndIfCase $Kopieren
[/autoit]
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[/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>
[/autoit] [autoit][/autoit] [autoit]
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;#include <array.au3>#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)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$hcboUsers = GUICtrlCreateCombo($sElect, 8, 8, 200, 25,$CBS_DROPDOWNLIST)
$hlblUser = GUICtrlCreateLabel("",8,35,200,25)
$hbtnOpen = GUICtrlCreateButton("&Öffnen", 8, 65)
GUICtrlSetState($hbtnOpen, $GUI_DISABLE)$list1 = _FileListToArray(@ScriptDir & "\Profiles", "*.ini", 1)
[/autoit] [autoit][/autoit] [autoit]If @error Then
[/autoit] [autoit][/autoit] [autoit]
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)
NextEndIf
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]
#EndRegion ### END Koda GUI section ###While 1
[/autoit] [autoit][/autoit] [autoit]
$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
EndIfEndSwitch
[/autoit]
WEndfalls du ein spezielles Problem hast, poste doch dein Skript,
mfg (Auto)Bert