Alle CheckBoxes aktivieren nach einer bestimmten Checkbox

  • Hallo,
    ich habe gleich zwei Anliegen:
    1. In meinem Script gibt es x-viele und eine zusätzliche Checkbox ("Alle Installieren"). Leider weiss ich nicht, wie ich es handlen muss, dass nach dem aktivieren der zusätzl. Checkbox alle anderen ebenfalls gecheckt werden.
    Ich vermute, dass ich auf das Event des Checkens der zusätzlichen reagieren muss, leider bin ich noch zu neu in dem Bereich als dass ich ads hinbekommen könnte.

    Könnte mir dafür jemand Anstöße / Tipps geben wie ich dabei vorgehen muss? (Lösung + Herleitung wäre auch ok)


    2. Jede gecheckte Box steht für eine DLL-Datei, die erst von A nach B kopiert und dann mit dem regsvr32 befehl registriert werden muss.
    Wie binde ich es am Besten ein, dass möglichst wenig Aktionen / Code entsteht?

    Achja hier der Code:

    Spoiler anzeigen
    [autoit]

    ; 01 September 2008 - Norman Schlorke

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

    ; GUI erstellen
    #include <GuiConstantsEx.au3>
    Opt("GUIOnEventMode",1)

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

    GuiCreate("Mesap 4.8.4 AddIns installieren", 400, 430)
    ; ========================================================================
    ; Funktionen / Events
    ; =======================================================================
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")
    Func _Install()
    $all = (GUICtrlRead($CheckboxAll) = $GUI_CHECKED)
    If $all Then MsgBox(64, "AddIn Setup", "Es werden alle AddIns installiert!")
    For $o = 0 To $CntFiles-1
    If $all Or GUICtrlRead($CheckboxID[$o]) = $GUI_CHECKED Then
    MsgBox(48, "AddIn Install", "Dieses AddIn wurde installiert: " & $Files[$o])
    ;~ DLLs-Kopierern & Registrieren

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

    EndIf
    Next
    EndFunc

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

    Func _ReadFiles()
    $search = FileFindFirstFile("./aktuellste AddIns/*.dll")
    Global $CntFiles = 0
    Global $Files[1]
    While 1
    $DLL = FileFindNextFile($search)
    If @error Then ExitLoop
    $CntFiles = $CntFiles + 1
    ReDim $Files[$CntFiles]
    $Files[$CntFiles-1] = $DLL
    WEnd
    FileClose($search)
    EndFunc

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

    Func _CreateWindow()
    $height = 40
    Global $CheckboxID[$CntFiles]
    For $i = 0 To $CntFiles-1
    If $i = 12 Then $height = 40
    If $i < 12 Then
    $left = 55
    Else
    $left = 245
    EndIf
    $CheckboxID[$i] = GuiCtrlCreateCheckbox($Files[$i], $left, $height, 100, 20)
    $height = $height + 26
    Next

    Global $CheckboxAll = GUICtrlCreateCheckbox("Alle Installieren",55, 357, 100, 20)

    $Install = GuiCtrlCreateButton("Installieren", 15, 392, 70, 25)
    GUICtrlSetOnEvent(-1, "_Install")
    GUICtrlSetState(-1,$GUI_FOCUS)
    $Exit = GuiCtrlCreateButton("Abbrechen", 315, 392, 70, 25)
    GUICtrlSetOnEvent(-1, "_Close")
    EndFunc

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

    Func _Close()
    GUIDelete()
    Exit
    EndFunc
    ; ========================================================================
    ; Starten des Scriptes
    ; ========================================================================

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

    _ReadFiles()
    _CreateWindow()
    GuiSetState()

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

    $msg = GUIGetMsg()
    While True
    WEnd

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

    Exit

    [/autoit]

    Einmal editiert, zuletzt von DJScorpion (8. September 2008 um 14:14)

  • Moinsen,

    so zum Beispiel ...

    Spoiler anzeigen
    [autoit]

    ; ========================================================================
    ; Starten des Scriptes
    ; ========================================================================

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

    _ReadFiles()
    _CreateWindow()

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

    While True

    $msg = GUIGetMsg()

    Switch $msg
    Case $CheckboxAll
    If GUICtrlGetState ($CheckboxAll, $GUI_CHECKED) Then
    For $i = 0 To $CheckboxID[$CntFiles-1]
    GUICtrlSetState ($CheckboxID[$i], $GUI_UNCHECKED)
    Next
    Else
    For $i = 0 To $CheckboxID[$CntFiles-1]
    GUICtrlSetState ($CheckboxID[$i], $GUI_CHECKED)
    Next
    EndIf
    Case $CheckboxID[0] To $CheckboxID[$CntFiles-1]
    If GUICtrlGetState ($msg, $GUI_CHECKED) Then
    GUICtrlSetState ($msg, $GUI_UNCHECKED)
    Else
    GUICtrlSetState ($msg, $GUI_CHECKED)
    EndIf
    EndSwitch

    WEnd

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

    ;*********************************************************************************

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

    Func _Install()
    For $o = 0 To $CntFiles-1
    If GUICtrlRead($CheckboxID[$o]) == $GUI_CHECKED Then
    MsgBox(48, "AddIn Install", "Dieses AddIn wurde installiert: " & $Files[$o])
    ;~ DLLs-Kopierern & Registrieren
    RunWait ('regsrv32.exe "D:\Bla\Bli\' & $Files[$o] & '"')
    EndIf
    Next
    EndFunc

    [/autoit]


    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (1. September 2008 um 12:26)

  • Hast du es getestet?

    Bei dir fehlt in Zeile 7 das GUISetState() oder? Ohne das wird das Fenster gar nicht erst erstellt.

    Und das

    [autoit]

    RunWait ('regsrv32.exe "C:\Programme\Mesap4\' & $Files[$o] & '"')

    [/autoit]

    führt er nicht aus, allerdings wenn ich das ' & Files[$o] & '" mit einem namen der DLL ersetze führt er es korrekt aus (die Meldung der erfolgreichen Registrierung kommt).

    **EDIT**
    Achja... wenn ich es so wie du es mir geschrieben hast Starten will (F5) dann passiert nichts (nur das Icon wird im Systemtray angezeigt).

    Einmal editiert, zuletzt von DJScorpion (1. September 2008 um 16:03)

  • Also ich hab das mit dem kopieren jetzt folgendermaßen gelöst:

    Spoiler anzeigen
    [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")
    Func _Install()
    ;~ Dateien kopieren
    $all = (GUICtrlRead($CheckboxAll) = $GUI_CHECKED)
    For $i = 0 To $CntFiles-1
    If GUICtrlRead($CheckboxID[$i]) = $GUI_CHECKED Then
    $CheckboxArr = True
    If $CheckboxArr Then ExitLoop
    EndIf
    Next
    If $all Or $CheckboxArr Then
    $LoadWindow = GUICreate("AddIn Installation", 300, 100, $MainWindow_Pos[0]+50, $MainWindow_Pos[1]+165, "", "", $MainWindow)
    GUICtrlCreateLabel("Dateien werden kopiert...", 90, 25)
    GUISetState(@SW_SHOW, $LoadWindow)
    For $o = 0 To $CntFiles-1
    If $all Or GUICtrlRead($CheckboxID[$o]) = $GUI_CHECKED Then
    Run('cmd.exe /c copy "P:\Mesap Setup TEST\Mesap 484\aktuellste AddIns\' & $Files[$o] & '" "C:\Programme\Mesap4\"', "", @SW_HIDE)
    EndIf
    Next
    Sleep(1000)
    GUIDelete($LoadWindow)
    EndIf
    ;~ Dateien registrieren
    ;~ Run('regsvr32.exe "C:\Programme\Mesap4\' & $Files[$o] & '"')
    EndFunc

    [/autoit]

    Das kann man sicherlich eleganter lösen, aber für meine Verhältnisse bin ich durchaus zufrieden.

    ...trotzdem funktioniert das immernoch nicht mit dem Haken für alle setzten.

    ...und das Registrieren der DLLs bekommt ncoh einen Sonderpart! ...also das ist jetzt mal außen vor.

    Gruß Scorp

  • Hi, meinst du soetwas

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    $Form1 = GUICreate("Form1", 204, 134, 193, 125)
    $Checkbox1 = GUICtrlCreateCheckbox("Check ALL", 16, 16, 97, 17)
    $Checkbox2 = GUICtrlCreateCheckbox("Checkbox", 16, 40, 97, 17)
    $Checkbox3 = GUICtrlCreateCheckbox("Checkbox", 16, 64, 97, 17)
    $Checkbox4 = GUICtrlCreateCheckbox("Checkbox", 16, 88, 97, 17)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Checkbox1
    If GUICtrlRead($Checkbox1) = 1 Then
    GUICtrlSetState($Checkbox2, $GUI_CHECKED)
    GUICtrlSetState($Checkbox3, $GUI_CHECKED)
    GUICtrlSetState($Checkbox4, $GUI_CHECKED)
    else
    GUICtrlSetState($Checkbox2, $GUI_UNCHECKED)
    GUICtrlSetState($Checkbox3, $GUI_UNCHECKED)
    GUICtrlSetState($Checkbox4, $GUI_UNCHECKED)
    EndIf
    EndSwitch
    WEnd

    [/autoit]
  • Also ich habs jetzt so:

    Spoiler anzeigen
    [autoit]

    Func _CreateWindow()
    $height = 40
    Global $CheckboxID[$CntFiles]
    For $i = 0 To $CntFiles-1
    If $i = 12 Then $height = 40
    If $i < 12 Then
    $left = 55
    Else
    $left = 245
    EndIf
    $CheckboxID[$i] = GUICtrlCreateCheckbox($Files[$i], $left, $height, 100, 20)
    $height = $height + 26
    Next

    Global $CheckboxAll = GUICtrlCreateCheckbox("Alle Installieren",55, 357, 100, 20)

    $Install = GUICtrlCreateButton("Installieren", 15, 392, 70, 25)
    GUICtrlSetOnEvent(-1, "_Install")
    GUICtrlSetState(-1,$GUI_FOCUS)
    $Exit = GUICtrlCreateButton("Abbrechen", 315, 392, 70, 25)
    GUICtrlSetOnEvent(-1, "_Close")
    EndFunc
    ;=========================================================================

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _Close()
    Case $CheckboxAll
    If GUICtrlRead($CheckboxAll) = 1 Then
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_CHECKED)
    Next
    else
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_UNCHECKED)
    Next
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Leider geht er nicht in den Case $CheckboxAll... wo ist der Fehler?
    Wieso deklariert er die Variable nicht richtig?

    2 Mal editiert, zuletzt von DJScorpion (3. September 2008 um 16:57)

  • Spoiler anzeigen
    [autoit]

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _Close()
    Case $CheckboxAll
    If BitAnd(GUICtrlGetState($CheckboxAll), $GUI_CHECKED) Then
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_CHECKED)
    Next
    else
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_UNCHECKED)
    Next
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    ...geht leider auch nicht.

    Könnte es sein, dass er in das Case nicht reingeht?

  • Ok also er geht nicht in das Case rein.

    Ich hab mir gestern schon 3 Stunden den Kopf darüber zerbrochen, leider reichen meine Kenntnisse über Funktionen / Übergabe der Variablen nicht aus um zu wissen wieso er das $CheckboxAll nicht anerkennt...
    Könntet ihr mal rüberschauen?

    Ich weiss es ist ein wenig viel... aber strukturiert und eigentlich eindeutig:

    Spoiler anzeigen
    [autoit]

    ; 01 September 2008 - Norman Schlorke

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

    ; GUI erstellen
    #include <GuiConstantsEx.au3>
    Opt("GUIOnEventMode",1)
    Global $CheckboxAll
    $MainWindow = GuiCreate("Mesap 4.8.4 AddIns installieren", 400, 430)
    $MainWindow_Pos = WinGetPos($MainWindow)
    ; ========================================================================
    ; Funktionen / Events
    ; =======================================================================
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")
    Func _Install()
    ;~ Dateien kopieren
    $all = (GUICtrlRead($CheckboxAll) = $GUI_CHECKED)
    For $i = 0 To $CntFiles-1
    If GUICtrlRead($CheckboxID[$i]) = $GUI_CHECKED Then
    $CheckboxArr = True
    If $CheckboxArr Then ExitLoop
    EndIf
    Next
    If $all Or $CheckboxArr Then
    $LoadWindow = GUICreate("AddIn Installation", 300, 100, $MainWindow_Pos[0]+50, $MainWindow_Pos[1]+165, "", "", $MainWindow)
    GUICtrlCreateLabel("Dateien werden kopiert...", 90, 25)
    GUISetState(@SW_SHOW, $LoadWindow)
    For $o = 0 To $CntFiles-1
    If $all Or GUICtrlRead($CheckboxID[$o]) = $GUI_CHECKED Then
    Run('cmd.exe /c copy "P:\Mesap Setup TEST\Mesap 484\aktuellste AddIns\' & $Files[$o] & '" "C:\Programme\Mesap4\"', "", @SW_HIDE)
    EndIf
    Next
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Close", $LoadWindow)
    Sleep(300)
    GUIDelete($LoadWindow)
    EndIf
    ;~ Dateien registrieren
    ;~ Run('regsvr32.exe "C:\Programme\Mesap4\' & $Files[$o] & '"')
    EndFunc

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

    Func _ReadFiles()
    $search = FileFindFirstFile("./aktuellste AddIns/*.dll")
    Global $CntFiles = 0
    Global $Files[1]
    While 1
    $DLL = FileFindNextFile($search)
    If @error Then ExitLoop
    $CntFiles = $CntFiles + 1
    ReDim $Files[$CntFiles]
    $Files[$CntFiles-1] = $DLL
    WEnd
    FileClose($search)
    EndFunc

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

    Func _CreateWindow()
    $height = 40
    Dim $CheckboxID[$CntFiles]
    For $i = 0 To $CntFiles-1
    If $i = 12 Then $height = 40
    If $i < 12 Then
    $left = 55
    Else
    $left = 245
    EndIf
    $CheckboxID[$i] = GUICtrlCreateCheckbox($Files[$i], $left, $height, 100, 20)
    $height = $height + 26
    Next

    Global $CheckboxAll = GUICtrlCreateCheckbox("Alle Installieren",55, 357, 100, 20)

    $Install = GUICtrlCreateButton("Installieren", 15, 392, 70, 25)
    GUICtrlSetOnEvent(-1, "_Install")
    GUICtrlSetState(-1,$GUI_FOCUS)
    $Exit = GUICtrlCreateButton("Abbrechen", 315, 392, 70, 25)
    GUICtrlSetOnEvent(-1, "_Close")
    EndFunc

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

    Func _Close()
    GUIDelete()
    Exit
    EndFunc
    ; ========================================================================
    ; Starten des Scriptes
    ; ========================================================================

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

    _ReadFiles()
    _CreateWindow()
    GUISetState(@SW_SHOW, $MainWindow)

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _Close()
    Case $CheckboxAll
    MsgBox(48, "Hallo", "test")
    If BitAnd(GUICtrlGetState($CheckboxAll), $GUI_CHECKED) Then
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_CHECKED)
    Next
    else
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_UNCHECKED)
    Next
    EndIf
    EndSwitch
    WEnd

    [/autoit]


    Achja.,.. mal noch ne Frage nebenbei:
    Wie bekommt man die Beschreibung einer Datei raus? Unter den FileGet's finde ich nichts, was mir das ausgibt.

    Einmal editiert, zuletzt von DJScorpion (4. September 2008 um 10:54)

  • Was hat es mit dem MessageLoopModus aufsich?

    ...wie muss man das verstehen? (Das ist mein erstes Projekt mit AutoIt)

    • Offizieller Beitrag

    In Zeile 5 schaltest Du den OnEvent-Mode ein, sodass Du in den Zeilen 12, 31, 70 und 73 die Event-Befehle benutzen kannst.

    Nach den Funktionen (in der While...WEnd-Schleife) benutzt Du aber GUIGetMsg():

    [autoit]


    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    _Close()
    Case $CheckboxAll
    MsgBox(48, "Hallo", "test")
    If BitAnd(GUICtrlGetState($CheckboxAll), $GUI_CHECKED) Then
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_CHECKED)
    Next
    else
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_UNCHECKED)
    Next
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Also den MessageLoop-Modus. Und das ist nicht erlaubt. Du musst Dich für einen Modus entscheiden.

  • Ok das hab ich jetzt verstanden.
    Und wie erstelle ich die GUI bzw. scheibe es so, dass ich keinen Messageloop benutze?

    • Offizieller Beitrag

    Wie Du das bei den Buttons auch gemacht hast. Mit GUICtrlSetOnEvent eine Funktion (siehe unten) aufrufen, wenn die Checkbox angeklickt wurde.
    Innerhalb der Funktion kannst Du mit @GUI_CtrlId auf die Control-IDs zugreifen:

    Spoiler anzeigen
    [autoit]


    Func _SwitchCheckboxes()
    Switch @GUI_CtrlId
    Case $CheckboxAll
    If BitAnd(GUICtrlRead($CheckboxAll), $GUI_CHECKED) Then
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_CHECKED)
    Next
    else
    For $i = 0 To $CntFiles-1
    GUICtrlSetState($CheckboxID[$i], $GUI_UNCHECKED)
    Next
    EndIf
    EndSwitch
    EndFunc

    [/autoit]
  • AAAhhhh ok.
    Klingt soweit richtig logisch und ergibt für mich jetzt auch nen Sinn!
    Danke vielmals - jetzt gehts!

    PS: Bleibt allerdings immernoch die Frage (auch wenns nichtmehr zu dem Topic gehört):
    Wie lese ich die Beschreibung einer Datei aus? (Denn mit FileGet.. komm ich nicht weiter...)

  • Vielen Dank nochmal an alle!
    Mein erstes Tool ist damit fertiggestellt und funktioniert einwandfrei auf XP.

    Jetzt gehts noch darum rauszufinden wo die Probleme für Vista liegen ^^