GUI dynamisch erstellen

  • Hallo!

    Folgendes Problem:
    Aus einer Datei lese ich die Zeilen in ein Array aus. Diese Zeilen möchte ich jetzt mit Checkboxen versehen und in einer GUI anzeigen.

    $check1 = GUICtrlCreateCheckbox($x[1], 10, 10, 120, 20)

    Wie kann ich die Variable $check dynamisch erstellen ($check1, $check 2, ...) und wie bekomme ich alle Zeilen des Arrays dynamisch dargestellt?

    Das Ergebnis in der GUI sollte dann wie folgt aussehen (#=Checkbox):

    # Zeile 1
    # Zeile 2
    # Zeile 3
    # ... (soviele Zeilen es eben gibt)

    Danke.

    • Offizieller Beitrag

    @ zemkedesign: Das nützt ihm wenig, da es eine zusätzliche Verwaltung des GUI-Aufbaus erfordert. Er kann ja auf einer fix definierten Fläche keine variable Anzahl an Objekten erstellen. Beliebig vergrößern ließe sich das auch nicht, es müßte evtl. mit Tabs gearbeitet werden.
    Daher mein Tipp mit dem ListView. Fixe Größe und alles paßt rein ;)

  • Dank dieses Hinweises bin ich ein gewaltiges Stück weitergekommen - Danke.

    Ein Problem habe ich jetz mit der Listview noch.
    Wie bekomme ich einen Wert zurück, welches Element markiert wurde?
    Mein derzeitiger Code hat da wohl einen Fehler.

    Grundsätzlich soll es möglich sein, mehrere Felder zu markieren, die dann jeweils abefragt werden.
    Ist die Checkbox aktiv, möchte ich für den markierten Eintrag eine Aktion ausführen (Druckerinstallation per rundll).

    [autoit]

    #include <GuiConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>

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

    Dim $arCSV
    $csvFile = "array.csv"
    _FileReadToArray($csvFile, $arCSV)

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

    For $i = 1 To $arCSV[0]
    $arCSV[$i] = StringSplit($arCSV[$i], ";")
    Next

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

    opt('MustDeclareVars', 1)
    Dim $listview, $Btn_Get, $Btn_Exit, $msg, $Status, $ret, $SS_SUNKEN, $SS_CENTER, $is_Checked
    GUICreate("Druckerinstallation", 900, 800)

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

    GUICtrlSetFont (-1,20, 400, 4, "MS Sans Serif")
    GUICtrlCreateLabel("Druckerinstallation", 10, 10, 200, 20)

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

    $listview = GUICtrlCreateListView("#|Modell|Abt.|Standort|IP|Name|Freigabe", 10, 40, 880, 720)
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_CHECKBOXES, $LVS_EX_CHECKBOXES)

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

    For $x = 1 to $arCSV[0]
    $i = $arCSV[$x]
    GUICtrlCreateListViewItem($x & "|" & $i[1] & "|" & $i[2] & "|" & $i[3] & "|" & $i[4] & "|" & $i[5] & "|" & $i[6], $listview)
    Next

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

    _GUICtrlListView_SetColumnWidth ($listview, 0, 100)
    $Btn_Get = GUICtrlCreateButton("Installieren", 10, 765, 90, 30)
    $Btn_Exit = GUICtrlCreateButton("Exit", 820, 765, 70, 30)
    $Status = GUICtrlCreateLabel("", 200,780, 400, 20, BitOR($SS_SUNKEN, $SS_CENTER))

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

    GUISetState()
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $Btn_Exit
    ExitLoop
    Case $msg = $Btn_Get
    GUICtrlSetData($Status, $is_Checked)
    Local $is_Checked = _GUICtrlListView_GetItemChecked ($listview, 1)
    If ($is_Checked <> $LV_ERR) Then
    If $is_Checked = TRUE Then
    GUICtrlSetData($Status, $is_Checked)
    Else
    GUICtrlSetData($Status, $is_Checked)
    EndIf
    EndIf
    EndSelect
    WEnd
    Exit

    [/autoit]

    Dazu noch meine array.csv:

    Code
    1. Drucker;1. Abteilung;1. Standort;1. IP;1. SAP;1. Freigabe
    2. Drucker;2. Abteilung;2. Standort;2. IP;2. SAP;2. Freigabe
    3. Drucker;3. Abteilung;3. Standort;3. IP;3. SAP;3. Freigabe
    4. Drucker;4. Abteilung;4. Standort;4. IP;4. SAP;4. Freigabe
    • Offizieller Beitrag

    Du hast die Anzahl der Einträge mit .._GetItemCount()
    Also gehst du in einer Schleife alle Einträge durch (Achtung: Eintrag 1 hat Index 0!) und prüfst ob gecheckt. Wenn ja führst du das Programm aus, aber mit RunWait() oder ShellexecuteWait().

  • Herzlichen Dank - echt spitze Unterstützung!

    Eine Frage hätte ich noch:

    Ich habe einen Button eingebaut, der mir alle Drucker anzeigen soll (Systemsteuerung -> Drucker)

    [autoit]

    Case $msg = $Btn_Printer ;Drucker aufrufen
    run("rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder")

    [/autoit]

    Dieser Button öffnet mir das Fenster jetzt unendlich oft, bis es von Fehlermeldungen nur so wimmelt.

    Wie kann ich erreichen, dass dieses Fenster geöffnet wird, ich aber meine GUI weiterhin bedienen kann, sprich nicht in einen Wait-Zustand komme?

    Danke.

  • Hier mal mein kompletter Code, da stecken bestimmt einige Anfängerfehler drin, aber die anderen Funktionen arbeiten soweit.
    Eine Überprüfung der Eingaben usw. habe ich nicht eingeplant, da es nur für meine interne Verwendung gedacht ist.

    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=Printer 2.ico
    #AutoIt3Wrapper_Compression=4
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GuiConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>

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

    ;Drucker-Daten aus drucker.csv einlesen
    ;Format:
    ;Nr.;Drucker;Abt.;Standort;IP;SAP-Name;Freigabe-Name;Bemerkung
    Dim $arCSV
    $csvFile = "drucker.csv"
    _FileReadToArray($csvFile, $arCSV)

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

    ;Felder am ";" trennen
    For $i = 1 To $arCSV[0]
    $arCSV[$i] = StringSplit($arCSV[$i], ";")
    Next

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

    opt('MustDeclareVars', 1)
    Dim $listview, $Btn_Get, $Btn_Exit, $Btn_Help, $Btn_Printer, $Icon1, $msg, $i, $Status, $ret, $is_Checked, $SS_NOTIFY, $WS_GROUP, $SS_SUNKEN, $SS_CENTER, $drucker, $drucker1, $y, $server, $serverini, $radio1, $radio2

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

    ;Vorauswahl Server aus drucker.ini auslesen
    $serverini = IniRead("drucker.ini", "Server", "Servername", "Server2")

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

    ;GUI erstellen
    GUICreate("Druckerinstallation", 900, 800) ; Name, Größe GUI
    GUISetIcon("Printer 2.ico") ;Icon einbinden
    GUICtrlCreateLabel("Druckerinstallation", 10, 10, 500, 25) ; Überschrift
    GUICtrlSetFont(-1, 18, 400, 0, "Arial") ;Format Überschrift

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

    ;Radiobuttons für Serverauswahl
    GUICtrlCreateLabel("Server:", 675, 22, 35, 25)
    $radio1 = GUICtrlCreateRadio ("Server1", 720, 20, 80, 20)
    $radio2 = GUICtrlCreateRadio ("Server2", 820, 20, 80, 20)

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

    ;Vorbelegen der Radiobuttons je nach Eintrag in drucker.ini
    Switch $serverini
    Case "Server1"
    GUICtrlSetState($radio1, $GUI_CHECKED)
    Case "Server2"
    GUICtrlSetState($radio2, $GUI_CHECKED)
    EndSwitch

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

    ;Liste aufbauen
    $listview = GUICtrlCreateListView("#|Modell |Abteilung|Standort |IP-Adresse |SAP-Name |Freigabe-Name |Bemerkung ", 10, 40, 880, 720) ;Listenkopf
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_CHECKBOXES, $LVS_EX_CHECKBOXES)

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

    ;Einträge in Liste schreiben, dabei erste Zeile der drucker.csv wegen Spaltenköpfen ignorieren
    For $x = 2 to $arCSV[0]
    $i = $arCSV[$x]
    GUICtrlCreateListViewItem($x-1 & "|" & $i[2] & "|" & $i[3] & "|" & $i[4] & "|" & $i[5] & "|" & $i[6] & "|" & $i[7]& "|" & $i[8], $listview)
    Next

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

    ;Buttons platziern
    _GUICtrlListView_SetColumnWidth ($listview, 0, 100)
    $Btn_Get = GUICtrlCreateButton("Installieren", 10, 765, 90, 30) ;Button Installieren
    ;$Btn_Help = GUICtrlCreateButton("Drucker", 620, 765, 70, 30) ; Button Drucker
    $Btn_Help = GUICtrlCreateButton("Hilfe", 720, 765, 70, 30) ; Button Hilfe
    $Btn_Exit = GUICtrlCreateButton("Beenden", 820, 765, 70, 30) ;Button Beenden

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

    ;Statuszeile für Hinweise
    $Status = GUICtrlCreateLabel("Bitte Drucker wählen", 370,780, 200, 20, BitOR($SS_SUNKEN, $SS_CENTER))
    GUISetState()

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

    ;Abfrage
    While 1
    $msg = GUIGetMsg()

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

    ;Welcher Radiobutton ist markiert?
    For $i = $Radio1 To $Radio2
    If GUICtrlRead($i) = $GUI_CHECKED Then
    Switch $i
    Case $Radio1 ;Button 1 aktiv
    $serverini = "Server1"
    Case $Radio2 ;Button 2 aktiv
    $serverini = "Server2"
    EndSwitch
    ExitLoop
    EndIf
    Next

    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $Btn_Exit ;Programm mit Beenden oder X beenden
    ExitLoop

    Case $msg = $Btn_Help ;Hilfe aufrufen
    MsgBox(0, "Hilfe", "Druckerinstallation" & @CRLF & @CRLF & "Ermöglicht das Installieren der an den Servern 'Server1' und 'Server2' freigegebenen Netzwerkdrucker." & @CRLF & @CRLF & "1. Server wählen" & @CRLF & "2. Drucker wählen" & @CRLF & "3. Installieren" & @CRLF & @CRLF & "Die Daten werden aus der Datei 'drucker.csv' geholt, welche folgendes Format (Kopfzeile) hat:" & @CRLF & @CRLF & "Nr.;Drucker;Abt.;Standort;IP;SAP-Name;Freigabe-Name;Bemerkung"& @CRLF & @CRLF & "Trennung durch Semikolon, keine Anführungszeichen für den Text!"& @CRLF)

    Case $msg = $Btn_Printer ;Drucker aufrufen
    ;ShellExecute("rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder")

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

    Case $msg = $Btn_Get ;Installieren
    GUICtrlSetData($Status, "Bitte Drucker wählen ") ; Status setzen
    For $x = 0 to $arCSV[0]-2 ;alle Listeneinträge überprüfen - beginnend bei 0!
    Local $is_Checked = _GUICtrlListView_GetItemChecked ($listview, $x)

    If $is_Checked = TRUE Then ;Checkbox gesetzt?
    GUICtrlSetData($Status, "Drucker wird installiert")
    $y = $x+2
    $drucker = $arCSV[$y]
    $drucker1 = $drucker[7] ;Freigabename ermitteln
    If $drucker1 = "" Then ;Fehlt der Freigabename?
    MsgBox(48, "Fehler", "Freigabe-Name fehlt!")
    Else
    Runwait("rundll32 printui.dll,PrintUIEntry /in /n \\" & $serverini & "\" & $drucker1) ;Drucker installieren, warten bis Vorgang abgeschlossen
    MsgBox(0, "Fertig", "Drucker installiert: \\" & $serverini & "\" & $drucker1)
    EndIf
    Else
    GUICtrlSetData($Status, "Bitte Drucker wählen") ; Status setzen
    EndIf
    Next
    IniWrite("drucker.ini", "Server", "Servername", $serverini) ; $Radiobutton wird in die Ini Datei geschrieben
    EndSelect
    WEnd
    Exit

    [/autoit]

    Schonmal Danke.

  • Ich hab's mal ein bisschen abgeändert, habe den Fehler nicht simulieren können, aber vielleicht passts jetzt! :)

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=Printer 2.ico
    #AutoIt3Wrapper_Compression=4
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GuiConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>

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

    ;Drucker-Daten aus drucker.csv einlesen
    ;Format:
    ;Nr.;Drucker;Abt.;Standort;IP;SAP-Name;Freigabe-Name;Bemerkung
    Dim $arCSV
    $csvFile = "drucker.csv"
    _FileReadToArray($csvFile, $arCSV)

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

    ;Felder am ";" trennen
    For $i = 1 To $arCSV[0]
    $arCSV[$i] = StringSplit($arCSV[$i], ";")
    Next

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

    Opt('MustDeclareVars', 1)
    Dim $listview, $Btn_Get, $Btn_Exit, $Btn_Help, $Btn_Printer, $Icon1, $msg, $i, $Status, $ret, $is_Checked, $SS_NOTIFY, $WS_GROUP, $SS_SUNKEN, $SS_CENTER, $drucker, $drucker1, $y, $server, $serverini, $radio1, $radio2

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

    ;Vorauswahl Server aus drucker.ini auslesen
    $serverini = IniRead("drucker.ini", "Server", "Servername", "Server2")

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

    ;GUI erstellen
    GUICreate("Druckerinstallation", 900, 800) ; Name, Größe GUI
    GUISetIcon("Printer 2.ico") ;Icon einbinden
    GUICtrlCreateLabel("Druckerinstallation", 10, 10, 500, 25) ; Überschrift
    GUICtrlSetFont(-1, 18, 400, 0, "Arial") ;Format Überschrift

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

    ;Radiobuttons für Serverauswahl
    GUICtrlCreateLabel("Server:", 675, 22, 35, 25)
    $radio1 = GUICtrlCreateRadio ("Server1", 720, 20, 80, 20)
    $radio2 = GUICtrlCreateRadio ("Server2", 820, 20, 80, 20)

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

    ;Vorbelegen der Radiobuttons je nach Eintrag in drucker.ini
    Switch $serverini
    Case "Server1"
    GUICtrlSetState($radio1, $GUI_CHECKED)
    Case "Server2"
    GUICtrlSetState($radio2, $GUI_CHECKED)
    EndSwitch

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

    ;Liste aufbauen
    $listview = GUICtrlCreateListView("#|Modell |Abteilung|Standort |IP-Adresse |SAP-Name |Freigabe-Name |Bemerkung ", 10, 40, 880, 720) ;Listenkopf
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_CHECKBOXES, $LVS_EX_CHECKBOXES)

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

    ;Einträge in Liste schreiben, dabei erste Zeile der drucker.csv wegen Spaltenköpfen ignorieren
    For $x = 2 to $arCSV[0]
    $i = $arCSV[$x]
    GUICtrlCreateListViewItem($x-1 & "|" & $i[2] & "|" & $i[3] & "|" & $i[4] & "|" & $i[5] & "|" & $i[6] & "|" & $i[7]& "|" & $i[8], $listview)
    Next

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

    ;Buttons platziern
    _GUICtrlListView_SetColumnWidth ($listview, 0, 100)
    $Btn_Get = GUICtrlCreateButton("Installieren", 10, 765, 90, 30) ;Button Installieren
    $Btn_Printer = GUICtrlCreateButton("Drucker", 620, 765, 70, 30) ; Button Drucker
    $Btn_Help = GUICtrlCreateButton("Hilfe", 720, 765, 70, 30) ; Button Hilfe
    $Btn_Exit = GUICtrlCreateButton("Beenden", 820, 765, 70, 30) ;Button Beenden

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

    ;Statuszeile für Hinweise
    $Status = GUICtrlCreateLabel("Bitte Drucker wählen", 370,780, 200, 20, BitOR($SS_SUNKEN, $SS_CENTER))
    GUISetState()

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

    ;Abfrage
    While 1
    $msg = GUIGetMsg()

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

    ;Welcher Radiobutton ist markiert?
    If GUICtrlRead($Radio1) = $GUI_CHECKED Then
    $serverini = "Server1"
    Else
    $serverini = "Server2"
    EndIf

    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $Btn_Exit ;Programm mit Beenden oder X beenden
    ExitLoop

    Case $msg = $Btn_Help ;Hilfe aufrufen
    MsgBox(0, "Hilfe", "Druckerinstallation" & @CRLF & @CRLF & "Ermöglicht das Installieren der an den Servern 'Server1' und 'Server2' freigegebenen Netzwerkdrucker." & @CRLF & @CRLF & "1. Server wählen" & @CRLF & "2. Drucker wählen" & @CRLF & "3. Installieren" & @CRLF & @CRLF & "Die Daten werden aus der Datei 'drucker.csv' geholt, welche folgendes Format (Kopfzeile) hat:" & @CRLF & @CRLF & "Nr.;Drucker;Abt.;Standort;IP;SAP-Name;Freigabe-Name;Bemerkung"& @CRLF & @CRLF & "Trennung durch Semikolon, keine Anführungszeichen für den Text!"& @CRLF)
    Case $msg = $Btn_Printer ;Drucker aufrufen
    Run("rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder")
    Case $msg = $Btn_Get ;Installieren
    GUICtrlSetData($Status, "Bitte Drucker wählen ") ; Status setzen
    For $x = 0 to $arCSV[0]-2 ;alle Listeneinträge überprüfen - beginnend bei 0!
    Local $is_Checked = _GUICtrlListView_GetItemChecked ($listview, $x)
    If $is_Checked = TRUE Then ;Checkbox gesetzt?
    GUICtrlSetData($Status, "Drucker wird installiert")
    $y = $x+2
    $drucker = $arCSV[$y]
    $drucker1 = $drucker[7] ;Freigabename ermitteln
    If $drucker1 = "" Then ;Fehlt der Freigabename?
    MsgBox(48, "Fehler", "Freigabe-Name fehlt!")
    Else
    Runwait("rundll32.exe printui.dll,PrintUIEntry /in /n \\" & $serverini & "\" & $drucker1) ;Drucker installieren, warten bis Vorgang abgeschlossen
    MsgBox(0, "Fertig", "Drucker installiert: \\" & $serverini & "\" & $drucker1)
    EndIf
    Else
    GUICtrlSetData($Status, "Bitte Drucker wählen") ; Status setzen
    EndIf
    Next
    IniWrite("drucker.ini", "Server", "Servername", $serverini) ; $Radiobutton wird in die Ini Datei geschrieben
    EndSelect
    WEnd
    Exit

    [/autoit]