Probleme mit Checkboxen

  • Hallo Leute, ich versuche jetzt schon den ganzen Vormittag dieses Problem zu lösen, aber es will einfach nicht funktionieren. Ich programmiere gerade ein kleines Programm, das aus einer XML Datei verschiedene Programm ausliest und in einer ListView darstellt. Dann kann der Benuter die Programm anwählen, welche er installieren möchte. Anschl. werden alle angewählten Programme nacheinander installiert. Mein Problem ist im Moment das Auslesen der Checkboxen, da diese ja dynamisch erzeugt werden. Ich hoffe ihr könnt mir da weiterhelfen:

    Hier der Code

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    #include <GUIConstantsEx.au3>
    #include "_XMLDomWrapper.au3"

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

    Dim $sXMLFile="files.xml"
    Dim $aproducer[1]
    Dim $aproduct[1]
    Dim $adescription[1]
    Dim $aurl[1]

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

    ; Read all files from the files.xml
    $result = _XMLFileOpen($sXMLFile)
    If $result = 0 Then Exit
    $sRet = _XMLSelectNodes("//item")

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

    ; Add all values into arrays
    For $k = 1 to $sRet[0]
    AddArrayItem($aproducer,_GetFirstValue("//item[" & $k & "]/producer"))
    AddArrayItem($aproduct,_GetFirstValue("//item[" & $k & "]/product"))
    AddArrayItem($adescription,_GetFirstValue("//item[" & $k & "]/description"))
    AddArrayItem($aurl,_GetFirstValue("//item[" & $k & "]/url"))
    Next

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

    ; Create the gui
    $main_GUI = GUICreate("Program Install Manager",500,400) ; will create a dialog box that when displayed is centered

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

    ;Menu
    Dim $menufile = GUICtrlCreateMenu ("File")
    Dim $itemexit = GUICtrlCreateMenuitem ("Exit",$menufile)
    Dim $menuhelp = GUICtrlCreateMenu ("Help")
    Dim $itemabout = GUICtrlCreateMenuitem ("About",$menuhelp)

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

    ; InfoLabel
    GUICtrlCreateLabel("Here you can simple install a various of programs.", 5, 10)

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

    ; Statistic Label
    GUICtrlCreateLabel("Count: " & $sRet[0] & " Items",450 , 10)

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

    ; Create ListView
    $listview = GUICtrlCreateListView("", 5, 40, 490, 300, -1, BitOR($LVS_SORTASCENDING,$LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES, $LVS_EX_REGIONAL))
    _GUICtrlListView_AddColumn($listview, " ", 30)
    _GUICtrlListView_AddColumn($listview, "Producer", 80)
    _GUICtrlListView_AddColumn($listview, "Product", 100)
    _GUICtrlListView_AddColumn($listview, "Description", 230)

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

    ; Array Size
    Dim $Checks[$sRet[0]]

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

    ; Add Items to ListView
    for $x = 0 to $sRet[0]-1
    $Checks[$x] = GUICtrlCreateListViewItem( "|" & $aproducer[$x] & "|" & $aproduct[$x] & "|" & $adescription[$x], $listview)
    ConsoleWrite("Object:" & $Checks[$x] & @CRLF)
    Next

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

    ; new line
    ConsoleWrite(@CRLF)

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

    ; Show the install button
    Dim $btn_install = GUICtrlCreateButton("Install", 200, 350, 100)
    GUISetState ()

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

    ;Copyright text
    $copyright = "Version 1.0"

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

    ; Run the GUI until the dialog is closed
    While 1
    $msg = GUIGetMsg()

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

    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $itemexit
    ExitLoop

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

    Case $msg = $itemabout
    Msgbox(0,"About", $copyright)

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

    Case $msg = $btn_install

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

    ConsoleWrite("btn_install is pressed" & @CRLF)
    ;Msgbox(4,"Install", "Do you want to install this programs?")

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

    for $x = 0 to $sRet[0]-1
    ConsoleWrite("Array Count:" & $x & @CRLF)
    ConsoleWrite("Object:" & $Checks[$x] & @CRLF)

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

    If _IsChecked($Checks[$x]) Then
    ConsoleWrite("Checked: true" & @CRLF)
    ; do something Run or ??
    Else
    ConsoleWrite("Checked: false" & @CRLF)
    EndIf
    Next

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

    EndSelect

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

    Wend
    Func _IsChecked($control)
    Return BitAnd(GUICtrlRead($control),$GUI_CHECKED) = $GUI_CHECKED
    EndFunc

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

    ; Add dynamic a array item
    Func AddArrayItem(ByRef $array,$newData)

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

    If $newData <> '' Then ; prüfen ob nicht leer

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

    ; der erste Eintrag soll in das bestehende 1. Array-Element eingetragen werden, z.Zt. das letzte
    ; für weiter Einträge muß das Array vorher um ein Element vergrößert werden
    If $array[Ubound($array)-1] <> '' Then ; ist das letzte Element NICHT leer (dann ist es NICHT das erste)
    ReDim $array[Ubound($array)+1] ; Arraygröße neu: 1 größer als aktuelle Größe Ubound($array)
    EndIf
    $array[Ubound($array)-1] = $newData ; Daten in das letzte Element schreiben, im ersten Durchlauf ist dies das erste.
    EndIf

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

    EndFunc

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

    ;Get the first real value returned from the _XMLGetValue() return array.
    Func _GetFirstValue($node)
    $ret_val = _XMLGetValue($node)
    If IsArray($ret_val) Then
    Return ($ret_val[1])
    Else
    Return SetError(1,3,0)
    EndIf
    EndFunc

    [/autoit]

    Edit BugFix: Bitte [ autoit ] statt [ code ] verwenden UND Spoiler! (habs geändert)

    3 Mal editiert, zuletzt von Fichte (9. September 2008 um 15:55)

    • Offizieller Beitrag

    Hi,
    du hast dir AddArrayItem() gebastelt. AutoIt hat die Funktion _ArrayAdd() ;)

    [autoit]

    for $x = 0 to $sRet[0]-1

    [/autoit]

    Hier hast du einen Fehler. $sRet[0] ist das erste Element in dem Array $sRet und führt die Anzahl der Elemente. Wenn du also alle Elemente durchlaufen möchtest mußt du von 1 bis $sRet[0] durchlaufen bzw. von 1 bis UBound($sRet) -1.
    Ich bevorzuge die UBound-Variante - damit vermeidest du solche Fehler von vornherein.

    Die Dynamik an sich ist kein Problem. Du fragst in der Schleife ab, ob das LV-Element per CheckBox markiert ist. Wenn ja liest du den Inhalt des ListView-Elements aus und arbeitest entsprechend damit weiter.

  • Hey Danke für den Tipp, ich habe das gleich mal abgeändert. Aber mein Problem ist immer noch vorhanden. Wenn ich auf den Button "Install" klicke dann sollte er alle Elemete die markiert (checked) sind installieren. Leider gibt er mir in der Konsole immer aus, dass kein Checkbox markiert ist :(

    Hier der aktuelle Quelltext:

    [autoit]


    #include <GuiListView.au3>
    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    #include "_XMLDomWrapper.au3"

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

    ; Read all files from the files.xml
    Dim $sXMLFile="files.xml"
    $result = _XMLFileOpen($sXMLFile)
    If $result = 0 Then Exit
    $sRet = _XMLSelectNodes("//item")

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

    Dim $aproducer[1]
    Dim $aproduct[1]
    Dim $adescription[1]
    Dim $aurl[1]
    Dim $Checks[1]

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

    Dim $Copyright
    Dim $main_GUI
    Dim $listview

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

    ; Add all values into arrays
    For $k = 1 to Ubound($sRet)
    _ArrayAdd($aproducer, _GetFirstValue("//item[" & $k & "]/producer"))
    _ArrayAdd($aproduct, _GetFirstValue("//item[" & $k & "]/product"))
    _ArrayAdd($adescription, _GetFirstValue("//item[" & $k & "]/description"))
    _ArrayAdd($aurl, _GetFirstValue("//item[" & $k & "]/url"))
    Next

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

    ; Create the gui
    $main_GUI = GUICreate("Program Install Manager",500,400) ; will create a dialog box that when displayed is centered

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

    ;Menu
    Dim $menufile = GUICtrlCreateMenu ("File")
    Dim $itemexit = GUICtrlCreateMenuitem ("Exit",$menufile)
    Dim $menuhelp = GUICtrlCreateMenu ("Help")
    Dim $itemabout = GUICtrlCreateMenuitem ("About",$menuhelp)

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

    ; InfoLabel
    GUICtrlCreateLabel("Here you can simple install a various of programs.", 5, 10)

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

    ; Statistic Label
    GUICtrlCreateLabel("Count: " & $sRet[0] & " Items",450 , 10)

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

    ; Create ListView
    $listview = GUICtrlCreateListView("", 5, 40, 490, 300, -1, BitOR($LVS_SORTASCENDING,$LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES, $LVS_EX_REGIONAL))
    _GUICtrlListView_AddColumn($listview, " ", 30)
    _GUICtrlListView_AddColumn($listview, "Producer", 80)
    _GUICtrlListView_AddColumn($listview, "Product", 100)
    _GUICtrlListView_AddColumn($listview, "Description", 230)

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

    ; Add Items to ListView
    For $x = 1 to Ubound($sRet)-1
    _ArrayAdd($Checks, GUICtrlCreateListViewItem( "|" & $aproducer[$x] & "|" & $aproduct[$x] & "|" & $adescription[$x], $listview))
    ConsoleWrite("Object:" & $Checks[$x] & @CRLF)
    Next

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

    ; new line
    ConsoleWrite(@CRLF)

    ; Show the install button
    Dim $btn_install = GUICtrlCreateButton("Install", 200, 350, 100)

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

    GUISetState ()

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

    ;Copyright text
    $copyright = "Version 1.0"

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

    ; Run the GUI until the dialog is closed
    While 1
    $msg = GUIGetMsg()

    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $itemexit
    ExitLoop

    Case $msg = $itemabout
    Msgbox(0,"About", $copyright)

    Case $msg = $btn_install

    ConsoleWrite("btn_install is pressed" & @CRLF)
    ;Msgbox(4,"Install", "Do you want to install this programs?")

    for $x = 1 to UBound($sRet) - 1
    ConsoleWrite("Array Count:" & $x & @CRLF)
    ConsoleWrite("Object:" & $Checks[$x] & @CRLF)

    If _IsChecked($Checks[$x]) Then
    ConsoleWrite("Checked: true" & @CRLF)
    ; do something Run or ??
    Else
    ConsoleWrite("Checked: false" & @CRLF)
    EndIf
    Next

    EndSelect

    Wend

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

    Func _IsChecked($control)
    Return BitAnd(GUICtrlRead($control),$GUI_CHECKED) = $GUI_CHECKED
    EndFunc

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

    ;Get the first real value returned from the _XMLGetValue() return array.
    Func _GetFirstValue($node)
    $ret_val = _XMLGetValue($node)
    If IsArray($ret_val) Then
    Return ($ret_val[1])
    Else
    Return SetError(1,3,0)
    EndIf
    EndFunc

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

    Einmal editiert, zuletzt von Fichte (8. September 2008 um 13:32)

    • Offizieller Beitrag

    Hier mal ein Muster, wie es funktioniert:

    Spoiler anzeigen
    [autoit]

    #include<GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    #include <GUIListView.au3>
    Global $sOut, $msg

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

    Global $gui = GUICreate('test')
    Global $hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200, -1, BitOR($LVS_SORTASCENDING,$LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES, $LVS_EX_REGIONAL))
    _GUICtrlListView_SetColumnWidth($hListView, 0, 146)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
    For $i = 1 To 10
    GUICtrlCreateListViewItem('Zeile ' & $i & ' Spalte 1|Zeile ' & $i & ' Spalte 2', $hListView)
    Next
    Global $btn = GUICtrlCreateButton('check', 10, 220, 60, 20)
    GUISetState()

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

    Do
    $msg = GUIGetMsg()
    If $msg = $btn Then
    $sOut = ''
    For $i = 0 To _GUICtrlListView_GetItemCount($hListView) -1
    If _GUICtrlListView_GetItemChecked($hListView, $i) Then _
    $sOut &= _GUICtrlListView_GetItemText($hListView, $i, 0) & ' / ' & _
    _GUICtrlListView_GetItemText($hListView, $i, 1) & @LF
    Next
    MsgBox(0, 'Markiert', $sOut)
    EndIf
    Until $msg = $GUI_EVENT_CLOSE

    [/autoit]
  • Danke BugFix funktioniert jetzt soweit. Jetzt wollte ich noch überprüfen ob das Programm korrekt ausgeführt wurde.
    Die Funktion runwait() liefert laut Hilfedatei bei einem Fehler eine 0 Zurück. Wenn alles ok war, dann liefert das Programm den Exit Code des Programms zurück.

    Bei mir liefert er immer 0 zurück, obwohl das Programm bzw. die Batch Datei erfolgreich abgearbeitet wurde.
    Würde mich freuen wenn ihr dafür auch noch eine Lösung bzw. einen Tipp hättet.

    [autoit]


    $sOut = ''
    For $i = 0 To _GUICtrlListView_GetItemCount($listview) -1

    If _GUICtrlListView_GetItemChecked($listview, $i) Then

    $producer=_GUICtrlListView_GetItemText($listview, $i, 1)
    $product=_GUICtrlListView_GetItemText($listview, $i, 2)
    $path = _GUICtrlListView_GetItemText($listview, $i, 4)
    $name = $producer & " " & $product

    $sOut &= $name & @CRLF

    if FileExists($path)=0 Then
    $sOut &= "The Path is not found" & @CRLF
    endif

    $var = RunWait($path, @ScriptDir, @SW_MAXIMIZE )

    if $var <> 0 Then
    $sOut &= "OK" & @CRLF
    Else
    $sOut &= "FALSE" & @CRLF
    EndIf

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

    EndIf

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

    Next

    MsgBox(0, "Install Status", $sOut)

    [/autoit]
    • Offizieller Beitrag

    bei einem Fehler eine 0 Zurück. Wenn alles ok war, dann liefert das Programm den Exit Code des Programms zurück.

    Bei mir liefert er immer 0 zurück, obwohl das Programm bzw. die Batch Datei erfolgreich abgearbeitet wurde.


    Prüf doch nicht den Rückgabewert - RunWait liefert doch @error, wenn was schiefgeht.

    [autoit]

    Runwait(....)
    If @error Then
    ; ....

    [/autoit]