Problem bei ListView mit neuer Version von AutoIt

  • Hi!

    Ich habe ein "altes" Skript von mir mal eben mit der neuen Version getestet und musste natürlich einiges umstellen, aber mit dem bloßen Umbenennen der Funktionen war´s nicht getan.

    Hier mein altes Skript:

    Spoiler anzeigen

    #Include <Constants.au3>
    #include <GUIConstants.au3>
    #include <file.au3>
    #Include <Misc.au3>
    #include <Array.au3>
    #include <GuiListView.au3>

    Dim $aAdmins[1] ;Array der auszulesenden Administrator-Profile
    Dim $programmmax
    Dim $profil_array
    Dim $edit
    Dim $aboutitem
    Dim $exititem
    Dim $item1
    Dim $item2
    Dim $item3
    Dim $optiondropbox
    Dim $optionmenu
    Dim $optiontraytip
    Dim $optionautostart
    Dim $optionpasswd
    Dim $optionpathcheck
    Dim $traytipflag
    Dim $passwdsaveflag = 0
    Dim $passwd
    Dim $exitflag = 0
    Dim $helpitem
    Dim $flagoptionsstartup

    _EditIni()

    ;----------------------------------------------------------------------
    ;FUNKTION _EditIni
    ;Erstellt eine GUI zum Bearbeiten der data.ini
    ;----------------------------------------------------------------------
    Func _EditIni()

    $nLVSBtnState = 0 ;Wird zum Aktivieren der Buttons benötigt

    TraySetState(2)

    ;GUI für die EditControl wird erzeugt, hierin findet die Bearbeitung der Ini-Datei statt
    $editinigui = GUICreate("AdminRun", 800, 335)

    GUICtrlCreateGraphic(0, 0, 800, 60)
    GUICtrlSetBkColor(-1, 0xffffff)
    GUICtrlCreatePic(@ScriptDir & "\img\addon.bmp", 15, 20, 16, 16)

    $label1 = GUICtrlCreateLabel("Menüeinträge bearbeiten", 45, 15, 300)
    GUICtrlSetBkColor($label1, 0xffffff)
    GUICtrlSetFont($label1, 9, 600)

    $label2 = GUICtrlCreateLabel("Fügen Sie neue Einträge hinzu oder löschen Sie Einträge", 45, 30, 300)
    GUICtrlSetBkColor($label2, 0xffffff)
    GUICtrlSetFont($label2, 8, 400, 2)

    $statuslabel1 = GUICtrlCreateLabel("", 0, 61, 801, 2, BitOR($SS_SIMPLE, $SS_SUNKEN))

    $EDITINI_LISTVIEW = GUICtrlCreateListView("Programmname|Programmpfad|Status", 0, 62, 800, 229, $LVS_SHOWSELALWAYS, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT,$LVS_EX_HEADERDRAGDROP))
    _GUICtrlListViewSetColumnWidth($EDITINI_LISTVIEW, 0, 200);SPALTENBREITE "Profilname" FESTLEGEN
    _GUICtrlListViewSetColumnWidth($EDITINI_LISTVIEW, 1, 520);SPALTENBREITE "Profilpfad" FESTLEGEN
    _GUICtrlListViewSetColumnWidth($EDITINI_LISTVIEW, 2, 59);SPALTENBREITE "Status" FESTLEGEN

    $EDITINI_AddBtn = GUICtrlCreateButton("Hinzufügen", 10, 300, 80)
    $EDITINI_EditBtn = GUICtrlCreateButton("Bearbeiten", 95, 300, 80)
    $EDITINI_DelBtn = GUICtrlCreateButton("Löschen", 180, 300, 80)
    $EDITINI_MoveUpBtn = GUICtrlCreateButton("Hoch", 265, 300, 80)
    $EDITINI_MoveDownBtn = GUICtrlCreateButton("Runter", 350, 300, 80)
    $EDITINI_CheckBtn = GUICtrlCreateButton("Testen", 435, 300, 80)

    $EDITINI_SaveBtn = GUICtrlCreateButton("Speichern", 585, 300, 100)
    GUICtrlSetState($EDITINI_SaveBtn, $GUI_DISABLE)
    $EDITINI_ExitBtn = GUICtrlCreateButton("Fertig", 690, 300, 100)

    GUISetState()

    Dim $B_DESCENDING[_GUICtrlListViewGetSubItemsCount($EDITINI_LISTVIEW)] ;Setzt die nötigen Voraussetzungen für das Sortieren

    ;~ ;Auslesen der Ini-Datei in Array
    $aDataIniContent = IniReadSectionNames(@ScriptDir & "\data.ini")
    For $i = 1 To $aDataIniContent[0]
    GUICtrlCreateListViewItem($aDataIniContent[$i] & "|" & IniRead(@ScriptDir & "\data.ini", $aDataIniContent[$i], "path", "Fehler") ,$EDITINI_LISTVIEW) ;Eventuell sollte ich doch Variable zuordnen
    Next

    While 1
    $msg1 = GUIGetMsg()
    $nLVSCountLines = _GUICtrlListViewGetSelectedCount($EDITINI_LISTVIEW) ;Wird zum Aktivieren der Buttons benötigt
    Select
    Case $msg1 = 0
    ContinueLoop
    ;Schalter für Buttons, wenn kein Item gewählt
    Case $nLVSBtnState <> 1 And $nLVSCountLines = 0
    GUICtrlSetState($EDITINI_EditBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_DelBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_MoveUpBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_MoveDownBtn, $GUI_DISABLE)
    $nLVSBtnState = 1
    ;Schalter für Buttons, wenn ein Item gewählt
    Case $nLVSBtnState <> 2 And $nLVSCountLines = 1
    GUICtrlSetState($EDITINI_EditBtn, $GUI_ENABLE)
    GUICtrlSetState($EDITINI_DelBtn, $GUI_ENABLE)
    GUICtrlSetState($EDITINI_MoveUpBtn, $GUI_ENABLE)
    GUICtrlSetState($EDITINI_MoveDownBtn, $GUI_ENABLE)
    $nLVSBtnState = 2
    ;Schalter für Buttons, wenn mehr als ein Item gewählt
    Case $nLVSBtnState <> 3 And $nLVSCountLines > 1
    GUICtrlSetState($EDITINI_EditBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_DelBtn, $GUI_ENABLE)
    GUICtrlSetState($EDITINI_MoveUpBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_MoveDownBtn, $GUI_DISABLE)
    $nLVSBtnState = 3
    ;Sortiert die Liste, wenn auf Spalte geklickt
    Case $msg1 = $EDITINI_LISTVIEW
    _EditFlag(1, $EDITINI_SaveBtn)
    ReDim $B_DESCENDING[_GUICtrlListViewGetSubItemsCount($EDITINI_LISTVIEW)] ;Setzt die nötigen Voraussetzungen für das Sortieren
    _GUICtrlListViewSort($EDITINI_LISTVIEW, $B_DESCENDING, GUICtrlGetState($EDITINI_LISTVIEW))
    ;Hinzufügen
    Case $msg1 = $EDITINI_AddBtn
    $sAddTitle = ""
    $sAddPath = ""
    $nAddNEditFlag = _AddNEdit("Eintrag hinzufügen", $sAddTitle, $sAddPath)
    If $nAddNEditFlag = 1 Then
    _EditFlag(1, $EDITINI_SaveBtn)
    _GUICtrlListViewInsertItem ($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), $sAddTitle & "|" & $sAddPath)
    ;Setzt die Sichtbarkeit des angefügten Items, wenn vorher in der Liste kein Ort ausgewählt
    If _GUICtrlListViewGetSelectedCount($EDITINI_LISTVIEW) = 0 Then _GUICtrlListViewEnsureVisible($EDITINI_LISTVIEW, _GUICtrlListViewGetItemCount($EDITINI_LISTVIEW)-1, 1)
    Else
    ContinueLoop
    EndIf
    ;Bearbeiten
    Case $msg1 = $EDITINI_EditBtn
    $sAddTitle = _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0)
    $sAddPath = _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1)
    $nAddNEditFlag = _AddNEdit("Eintrag bearbeiten", $sAddTitle, $sAddPath)
    ;Prüfung, ob Änderung
    If $nAddNEditFlag = 1 Then
    If $sAddTitle = _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0) And $sAddPath = _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1) Then
    ContinueLoop
    Else
    _EditFlag(1, $EDITINI_SaveBtn)
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0, $sAddTitle)
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1, $sAddPath)
    EndIf
    Else
    ContinueLoop
    EndIf
    ;Löschen
    Case $msg1 = $EDITINI_DelBtn
    _EditFlag(1, $EDITINI_SaveBtn)
    _GUICtrlListViewDeleteItemsSelected($EDITINI_LISTVIEW)
    ;Hoch
    Case $msg1 = $EDITINI_MoveUpBtn
    If _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW) <> -1 Then ;Wenn keine Auswahl, dann nichts tun
    ;Auslesen der zu verschiebenden Daten
    $aItemMoveUp1 = StringSplit(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)), "|")
    $aItemMoveUp2 = StringSplit(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1), "|")
    ;Tauschen der Daten in der Listview $aItemMoveUp2
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0, $aItemMoveUp2[1])
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1, $aItemMoveUp2[2])
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 2, $aItemMoveUp2[3])
    ;Tauschen der Daten in der Listview $aItemMoveUp1
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1, 0, $aItemMoveUp1[1])
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1, 1, $aItemMoveUp1[2])
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1, 2, $aItemMoveUp1[3])
    ;Auswahl aktualisieren
    If _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW) > 0 Then ;Damit nicht über die Auswahl hinaus gearbeitet wird
    _EditFlag(1, $EDITINI_SaveBtn)
    _GUICtrlListViewSetItemSelState ($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1)
    _GUICtrlListViewSetItemSelState ($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1, 0)
    EndIf
    _GUICtrlListViewEnsureVisible($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1)
    EndIf
    ;Runter
    Case $msg1 = $EDITINI_MoveDownBtn
    If _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW) <> -1 Then ;Wenn keine Auswahl, dann nichts tun
    If _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW) <= _GUICtrlListViewGetItemCount($EDITINI_LISTVIEW)-2 Then ;Damit nicht über die Auswahl hinaus gearbeitet wird
    _EditFlag(1, $EDITINI_SaveBtn)
    ;Auslesen der zu verschiebenden Daten
    $aItemMoveUp1 = StringSplit(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)), "|")
    $aItemMoveUp2 = StringSplit(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1), "|")
    ;Tauschen der Daten in der Listview $aItemMoveUp2
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0, $aItemMoveUp2[1])
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1, $aItemMoveUp2[2])
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 2, $aItemMoveUp2[3])
    ;Tauschen der Daten in der Listview $aItemMoveUp1
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1, 0, $aItemMoveUp1[1])
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1, 1, $aItemMoveUp1[2])
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1, 2, $aItemMoveUp1[3])
    ;Auswahl aktualisieren
    _GUICtrlListViewSetItemSelState ($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1)
    _GUICtrlListViewSetItemSelState ($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0)
    _GUICtrlListViewEnsureVisible($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1)
    EndIf
    EndIf
    ;Testen
    Case $msg1 = $EDITINI_CheckBtn
    For $i = 0 To _GUICtrlListViewGetItemCount($EDITINI_LISTVIEW)-1 ;-1, weil da irgendwie immer ein leeres Item mitgezählt wird
    If FileExists(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, $i, 1)) Then
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, $i, 2, "OK")
    Else
    _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, $i, 2, "ERROR")
    EndIf
    Next
    ;Speichern
    Case $msg1 = $EDITINI_SaveBtn
    _EditFlag(0, $EDITINI_SaveBtn)
    FileDelete(@ScriptDir & "\data.ini")
    For $i = 0 To _GUICtrlListViewGetItemCount($EDITINI_LISTVIEW)-1 ;-1, weil da irgendwie immer ein leeres Item mitgezählt wird
    IniWriteSection(@ScriptDir & "\data.ini", _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, $i, 0), "path=" & _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, $i, 1))
    Next
    ;~ programmdelete()
    ;~ programmcheck()
    ;Exit/Fertig
    Case $msg1 = $EDITINI_ExitBtn Or $msg1 = $GUI_EVENT_CLOSE
    If GUICtrlGetState($EDITINI_SaveBtn) = 80 Then ;Falls der Button aktiviert ist
    $nExitBox = MsgBox(4+32+256,"Datenänderung ignorieren?", "Die Daten wurden geändert. Wollen Sie dennoch das " & @CRLF & "Programm verlassen, ohne die Änderungen gepeichert zu haben?")
    If $nExitBox = 6 Then ;Ja
    ExitLoop
    Else
    ContinueLoop
    EndIf
    Else
    ExitLoop
    EndIf
    EndSelect
    WEnd

    GUIDelete($editinigui) ;Löscht die EditGUI, damit wieder nur mit dem Tray gearbeitet wird
    TraySetState(1)
    EndFunc

    ;----------------------------------------------------------------------
    ;FUNKTION _AddNEdit($sTitle, ByRef $sAddTitle, ByRef $sAddPath)
    ;Eingabemaske der Daten in der ListView
    ;----------------------------------------------------------------------
    Func _AddNEdit($sTitle, ByRef $sAddTitle, ByRef $sAddPath)
    $ADDEDIT_GUI = GUICreate($sTitle, 330, 165)

    GUICtrlCreateGraphic(0, 0, 330, 30)
    GUICtrlSetBkColor(-1, 0xffffff)

    $label1 = GUICtrlCreateLabel("Geben Sie die erforderlichen Daten ein:", 10, 8, 320)
    GUICtrlSetBkColor($label1, 0xffffff)
    GUICtrlSetFont($label1, 10, 550)

    $statuslabel1 = GUICtrlCreateLabel("", 0, 31, 331, 2, BitOR($SS_SIMPLE, $SS_SUNKEN))

    GUICtrlCreateLabel("Programmname:", 10, 48, 80)
    $sAddTitleInput = GUICtrlCreateInput($sAddTitle, 100, 45, 220)
    GUICtrlCreateLabel("Programmpfad:", 10, 78, 80)
    $sAddPathInput = GUICtrlCreateInput($sAddPath, 100, 75, 220)

    $AddWarn = GUICtrlCreateLabel("", 50, 102, 300)
    GUICtrlSetColor($AddWarn, 0xCD4F39)

    GUICtrlCreateLabel("", 0, 120, 331, 2, BitOR($SS_SIMPLE, $SS_SUNKEN))

    $OkBtn = GUICtrlCreateButton("OK", 10, 130, 100)
    $OpenBtn = GUICtrlCreateButton("Suchen...", 115, 130, 100)
    $CancelBtn = GUICtrlCreateButton("Abbrechen", 220, 130, 100)

    Guisetstate()

    While 1
    $msgadd = GUIGetMsg()
    Select
    Case $msgadd = $CancelBtn Or $msgadd = $GUI_EVENT_CLOSE
    $Return = 0
    ExitLoop
    Case $msgadd = $OkBtn
    ;Prüfung, ob leer
    If GUICtrlRead($sAddTitleInput) = "" Or GUICtrlRead($sAddPathInput) = "" Then
    GUICtrlSetData($AddWarn, "Achtung! Die Eingabefelder dürfen nicht leer sein.")
    ContinueLoop
    ;Prüfung, ob Pfad existiert
    ElseIf Not FileExists(GUICtrlRead($sAddPathInput)) Then
    GUICtrlSetData($AddWarn, "Achtung! Die angegebene Datei existiert nicht.")

    ContinueLoop
    ;Alles in Ordnung
    Else
    $sAddTitle = GUICtrlRead($sAddTitleInput)
    $sAddPath = GUICtrlRead($sAddPathInput)
    $Return = 1
    ExitLoop
    EndIf
    Case $msgadd = $OpenBtn
    $sFOD = FileOpenDialog("Ausführbare Datei suchen", Default, "Ausführbare Datei (*.exe;*.bat;*.com)", 1 + 2)
    If $sFOD <> "" Then
    GUICtrlSetData($sAddPathInput, $sFOD)
    $aFODSplit = StringSplit($sFOD, "\")
    GUICtrlSetData($sAddTitleInput, $aFODSplit[$aFODSplit[0]])
    EndIf
    EndSelect
    WEnd

    GUIDelete($ADDEDIT_GUI)

    Return $Return

    EndFunc


    ;----------------------------------------------------------------------
    ;FUNKTION _EditFlag
    ;Setzt die Flag und den Status des Speichern-Buttons
    ;----------------------------------------------------------------------
    Func _EditFlag($nFlag, $Btn)
    If $nFlag = 1 Then
    GUICtrlSetState($Btn, $GUI_ENABLE)
    ElseIf $nFlag = 0 Then
    GUICtrlSetState($Btn, $GUI_DISABLE)
    EndIf
    EndFunc

    Hier das neue, so weit ich es habe:

    Spoiler anzeigen

    #Include <Constants.au3>
    #include <GUIConstants.au3>
    #include <file.au3>
    #Include <Misc.au3>
    #include <Array.au3>
    #include <GuiListView.au3>

    Dim $aAdmins[1] ;Array der auszulesenden Administrator-Profile
    Dim $programmmax
    Dim $profil_array
    Dim $edit
    Dim $aboutitem
    Dim $exititem
    Dim $item1
    Dim $item2
    Dim $item3
    Dim $optiondropbox
    Dim $optionmenu
    Dim $optiontraytip
    Dim $optionautostart
    Dim $optionpasswd
    Dim $optionpathcheck
    Dim $traytipflag
    Dim $passwdsaveflag = 0
    Dim $passwd
    Dim $exitflag = 0
    Dim $helpitem
    Dim $flagoptionsstartup

    _EditIni()

    ;----------------------------------------------------------------------
    ;FUNKTION _EditIni
    ;Erstellt eine GUI zum Bearbeiten der data.ini
    ;----------------------------------------------------------------------
    Func _EditIni()

    $nLVSBtnState = 0 ;Wird zum Aktivieren der Buttons benötigt

    TraySetState(2)

    ;GUI für die EditControl wird erzeugt, hierin findet die Bearbeitung der Ini-Datei statt
    $editinigui = GUICreate("AdminRun", 800, 335)

    GUICtrlCreateGraphic(0, 0, 800, 60)
    GUICtrlSetBkColor(-1, 0xffffff)
    GUICtrlCreatePic(@ScriptDir & "\img\addon.bmp", 15, 20, 16, 16)

    $label1 = GUICtrlCreateLabel("Menüeinträge bearbeiten", 45, 15, 300)
    GUICtrlSetBkColor($label1, 0xffffff)
    GUICtrlSetFont($label1, 9, 600)

    $label2 = GUICtrlCreateLabel("Fügen Sie neue Einträge hinzu oder löschen Sie Einträge", 45, 30, 300)
    GUICtrlSetBkColor($label2, 0xffffff)
    GUICtrlSetFont($label2, 8, 400, 2)

    $statuslabel1 = GUICtrlCreateLabel("", 0, 61, 801, 2, BitOR($SS_SIMPLE, $SS_SUNKEN))

    $EDITINI_LISTVIEW = GUICtrlCreateListView("Programmname|Programmpfad|Status", 0, 62, 800, 229, $LVS_SHOWSELALWAYS, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT,$LVS_EX_HEADERDRAGDROP))
    _GUICtrlListView_SetColumnWidth($EDITINI_LISTVIEW, 0, 200);SPALTENBREITE "Profilname" FESTLEGEN
    _GUICtrlListView_SetColumnWidth($EDITINI_LISTVIEW, 1, 520);SPALTENBREITE "Profilpfad" FESTLEGEN
    _GUICtrlListView_SetColumnWidth($EDITINI_LISTVIEW, 2, 59);SPALTENBREITE "Status" FESTLEGEN

    $EDITINI_AddBtn = GUICtrlCreateButton("Hinzufügen", 10, 300, 80)
    $EDITINI_EditBtn = GUICtrlCreateButton("Bearbeiten", 95, 300, 80)
    $EDITINI_DelBtn = GUICtrlCreateButton("Löschen", 180, 300, 80)
    $EDITINI_MoveUpBtn = GUICtrlCreateButton("Hoch", 265, 300, 80)
    $EDITINI_MoveDownBtn = GUICtrlCreateButton("Runter", 350, 300, 80)
    $EDITINI_CheckBtn = GUICtrlCreateButton("Testen", 435, 300, 80)

    $EDITINI_SaveBtn = GUICtrlCreateButton("Speichern", 585, 300, 100)
    GUICtrlSetState($EDITINI_SaveBtn, $GUI_DISABLE)
    $EDITINI_ExitBtn = GUICtrlCreateButton("Fertig", 690, 300, 100)

    GUISetState()

    ;~ Dim $B_DESCENDING[_GUICtrlListViewGetSubItemsCount($EDITINI_LISTVIEW)] ;Setzt die nötigen Voraussetzungen für das Sortieren

    ;~ ;Auslesen der Ini-Datei in Array
    $aDataIniContent = IniReadSectionNames(@ScriptDir & "\data.ini")
    For $i = 1 To $aDataIniContent[0]
    GUICtrlCreateListViewItem($aDataIniContent[$i] & "|" & IniRead(@ScriptDir & "\data.ini", $aDataIniContent[$i], "path", "Fehler") ,$EDITINI_LISTVIEW) ;Eventuell sollte ich doch Variable zuordnen
    Next

    While 1
    $msg1 = GUIGetMsg()
    $nLVSCountLines = _GUICtrlListView_GetSelectedCount($EDITINI_LISTVIEW) ;Wird zum Aktivieren der Buttons benötigt
    Select
    Case $msg1 = 0
    ContinueLoop
    ;Schalter für Buttons, wenn kein Item gewählt
    Case $nLVSBtnState <> 1 And $nLVSCountLines = 0
    GUICtrlSetState($EDITINI_EditBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_DelBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_MoveUpBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_MoveDownBtn, $GUI_DISABLE)
    $nLVSBtnState = 1
    ;Schalter für Buttons, wenn ein Item gewählt
    Case $nLVSBtnState <> 2 And $nLVSCountLines = 1
    GUICtrlSetState($EDITINI_EditBtn, $GUI_ENABLE)
    GUICtrlSetState($EDITINI_DelBtn, $GUI_ENABLE)
    GUICtrlSetState($EDITINI_MoveUpBtn, $GUI_ENABLE)
    GUICtrlSetState($EDITINI_MoveDownBtn, $GUI_ENABLE)
    $nLVSBtnState = 2
    ;Schalter für Buttons, wenn mehr als ein Item gewählt
    Case $nLVSBtnState <> 3 And $nLVSCountLines > 1
    GUICtrlSetState($EDITINI_EditBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_DelBtn, $GUI_ENABLE)
    GUICtrlSetState($EDITINI_MoveUpBtn, $GUI_DISABLE)
    GUICtrlSetState($EDITINI_MoveDownBtn, $GUI_DISABLE)
    $nLVSBtnState = 3
    ;Sortiert die Liste, wenn auf Spalte geklickt
    Case $msg1 = $EDITINI_LISTVIEW
    ;~ _EditFlag(1, $EDITINI_SaveBtn)
    ;~ ReDim $B_DESCENDING[_GUICtrlListViewGetSubItemsCount($EDITINI_LISTVIEW)] ;Setzt die nötigen Voraussetzungen für das Sortieren
    ;~ _GUICtrlListViewSort($EDITINI_LISTVIEW, $B_DESCENDING, GUICtrlGetState($EDITINI_LISTVIEW))
    ;Hinzufügen
    Case $msg1 = $EDITINI_AddBtn
    $sAddTitle = ""
    $sAddPath = ""
    $nAddNEditFlag = _AddNEdit("Eintrag hinzufügen", $sAddTitle, $sAddPath)
    If $nAddNEditFlag = 1 Then
    _EditFlag(1, $EDITINI_SaveBtn)
    _GUICtrlListView_InsertItem($EDITINI_LISTVIEW, $sAddTitle, _GUICtrlListView_GetSelectionMark(GUICtrlGetHandle($EDITINI_LISTVIEW)))
    _GUICtrlListView_SetSelectionMark(GUICtrlGetHandle($EDITINI_LISTVIEW), _GUICtrlListView_GetSelectionMark(GUICtrlGetHandle($EDITINI_LISTVIEW))-1)
    _GUICtrlListView_SetItemText($EDITINI_LISTVIEW, _GUICtrlListView_GetSelectionMark(GUICtrlGetHandle($EDITINI_LISTVIEW)),$sAddPath, 1)
    ;Setzt die Sichtbarkeit des angefügten Items, wenn vorher in der Liste kein Ort ausgewählt
    ;~ If _GUICtrlListView_GetSelectedCount($EDITINI_LISTVIEW) = 0 Then _GUICtrlListView_EnsureVisible($EDITINI_LISTVIEW, _GUICtrlListView_GetSelectionMark(GUICtrlGetHandle($EDITINI_LISTVIEW))-1, 1)
    Else
    ContinueLoop
    EndIf
    ;Bearbeiten
    Case $msg1 = $EDITINI_EditBtn
    ;~ $sAddTitle = _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0)
    ;~ $sAddPath = _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1)
    ;~ $nAddNEditFlag = _AddNEdit("Eintrag bearbeiten", $sAddTitle, $sAddPath)
    ;~ ;Prüfung, ob Änderung
    ;~ If $nAddNEditFlag = 1 Then
    ;~ If $sAddTitle = _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0) And $sAddPath = _GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1) Then
    ;~ ContinueLoop
    ;~ Else
    ;~ _EditFlag(1, $EDITINI_SaveBtn)
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0, $sAddTitle)
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1, $sAddPath)
    ;~ EndIf
    ;~ Else
    ;~ ContinueLoop
    ;~ EndIf
    ;Löschen
    Case $msg1 = $EDITINI_DelBtn
    _EditFlag(1, $EDITINI_SaveBtn)
    _GUICtrlListView_DeleteItemsSelected(GUICtrlGetHandle($EDITINI_LISTVIEW))
    ;Hoch
    Case $msg1 = $EDITINI_MoveUpBtn
    ;~ If _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW) <> -1 Then ;Wenn keine Auswahl, dann nichts tun
    ;~ ;Auslesen der zu verschiebenden Daten
    ;~ $aItemMoveUp1 = StringSplit(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)), "|")
    ;~ $aItemMoveUp2 = StringSplit(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1), "|")
    ;~ ;Tauschen der Daten in der Listview $aItemMoveUp2
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0, $aItemMoveUp2[1])
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1, $aItemMoveUp2[2])
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 2, $aItemMoveUp2[3])
    ;~ ;Tauschen der Daten in der Listview $aItemMoveUp1
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1, 0, $aItemMoveUp1[1])
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1, 1, $aItemMoveUp1[2])
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1, 2, $aItemMoveUp1[3])
    ;~ ;Auswahl aktualisieren
    ;~ If _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW) > 0 Then ;Damit nicht über die Auswahl hinaus gearbeitet wird
    ;~ _EditFlag(1, $EDITINI_SaveBtn)
    ;~ _GUICtrlListViewSetItemSelState ($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)-1)
    ;~ _GUICtrlListViewSetItemSelState ($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1, 0)
    ;~ EndIf
    ;~ _GUICtrlListViewEnsureVisible($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1)
    ;~ EndIf
    ;Runter
    Case $msg1 = $EDITINI_MoveDownBtn
    ;~ If _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW) <> -1 Then ;Wenn keine Auswahl, dann nichts tun
    ;~ If _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW) <= _GUICtrlListViewGetItemCount($EDITINI_LISTVIEW)-2 Then ;Damit nicht über die Auswahl hinaus gearbeitet wird
    ;~ _EditFlag(1, $EDITINI_SaveBtn)
    ;~ ;Auslesen der zu verschiebenden Daten
    ;~ $aItemMoveUp1 = StringSplit(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)), "|")
    ;~ $aItemMoveUp2 = StringSplit(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1), "|")
    ;~ ;Tauschen der Daten in der Listview $aItemMoveUp2
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0, $aItemMoveUp2[1])
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1, $aItemMoveUp2[2])
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 2, $aItemMoveUp2[3])
    ;~ ;Tauschen der Daten in der Listview $aItemMoveUp1
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1, 0, $aItemMoveUp1[1])
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1, 1, $aItemMoveUp1[2])
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1, 2, $aItemMoveUp1[3])
    ;~ ;Auswahl aktualisieren
    ;~ _GUICtrlListViewSetItemSelState ($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW)+1)
    ;~ _GUICtrlListViewSetItemSelState ($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 0)
    ;~ _GUICtrlListViewEnsureVisible($EDITINI_LISTVIEW, _GUICtrlListViewGetCurSel($EDITINI_LISTVIEW), 1)
    ;~ EndIf
    ;~ EndIf
    ;Testen
    Case $msg1 = $EDITINI_CheckBtn
    ;~ For $i = 0 To _GUICtrlListViewGetItemCount($EDITINI_LISTVIEW)-1 ;-1, weil da irgendwie immer ein leeres Item mitgezählt wird
    ;~ If FileExists(_GUICtrlListViewGetItemText($EDITINI_LISTVIEW, $i, 1)) Then
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, $i, 2, "OK")
    ;~ Else
    ;~ _GUICtrlListViewSetItemText($EDITINI_LISTVIEW, $i, 2, "ERROR")
    ;~ EndIf
    ;~ Next
    ;Speichern
    Case $msg1 = $EDITINI_SaveBtn
    _EditFlag(0, $EDITINI_SaveBtn)
    FileDelete(@ScriptDir & "\data.ini")
    For $i = 0 To _GUICtrlListView_GetItemCount($EDITINI_LISTVIEW)-1 ;-1, weil da irgendwie immer ein leeres Item mitgezählt wird
    IniWriteSection(@ScriptDir & "\data.ini", _GUICtrlListView_GetItemText($EDITINI_LISTVIEW, $i, 0), "path=" & _GUICtrlListView_GetItemText($EDITINI_LISTVIEW, $i, 1))
    Next
    ;~ programmdelete()
    ;~ programmcheck()
    ;Exit/Fertig
    Case $msg1 = $EDITINI_ExitBtn Or $msg1 = $GUI_EVENT_CLOSE
    If GUICtrlGetState($EDITINI_SaveBtn) = 80 Then ;Falls der Button aktiviert ist
    $nExitBox = MsgBox(4+32+256,"Datenänderung ignorieren?", "Die Daten wurden geändert. Wollen Sie dennoch das " & @CRLF & "Programm verlassen, ohne die Änderungen gepeichert zu haben?")
    If $nExitBox = 6 Then ;Ja
    ExitLoop
    Else
    ContinueLoop
    EndIf
    Else
    ExitLoop
    EndIf
    EndSelect
    WEnd

    GUIDelete($editinigui) ;Löscht die EditGUI, damit wieder nur mit dem Tray gearbeitet wird
    TraySetState(1)
    EndFunc

    ;----------------------------------------------------------------------
    ;FUNKTION _AddNEdit($sTitle, ByRef $sAddTitle, ByRef $sAddPath)
    ;Eingabemaske der Daten in der ListView
    ;----------------------------------------------------------------------
    Func _AddNEdit($sTitle, ByRef $sAddTitle, ByRef $sAddPath)
    $ADDEDIT_GUI = GUICreate($sTitle, 330, 165)

    GUICtrlCreateGraphic(0, 0, 330, 30)
    GUICtrlSetBkColor(-1, 0xffffff)

    $label1 = GUICtrlCreateLabel("Geben Sie die erforderlichen Daten ein:", 10, 8, 320)
    GUICtrlSetBkColor($label1, 0xffffff)
    GUICtrlSetFont($label1, 10, 550)

    $statuslabel1 = GUICtrlCreateLabel("", 0, 31, 331, 2, BitOR($SS_SIMPLE, $SS_SUNKEN))

    GUICtrlCreateLabel("Programmname:", 10, 48, 80)
    $sAddTitleInput = GUICtrlCreateInput($sAddTitle, 100, 45, 220)
    GUICtrlCreateLabel("Programmpfad:", 10, 78, 80)
    $sAddPathInput = GUICtrlCreateInput($sAddPath, 100, 75, 220)

    $AddWarn = GUICtrlCreateLabel("", 50, 102, 300)
    GUICtrlSetColor($AddWarn, 0xCD4F39)

    GUICtrlCreateLabel("", 0, 120, 331, 2, BitOR($SS_SIMPLE, $SS_SUNKEN))

    $OkBtn = GUICtrlCreateButton("OK", 10, 130, 100)
    $OpenBtn = GUICtrlCreateButton("Suchen...", 115, 130, 100)
    $CancelBtn = GUICtrlCreateButton("Abbrechen", 220, 130, 100)

    Guisetstate()

    While 1
    $msgadd = GUIGetMsg()
    Select
    Case $msgadd = $CancelBtn Or $msgadd = $GUI_EVENT_CLOSE
    $Return = 0
    ExitLoop
    Case $msgadd = $OkBtn
    ;Prüfung, ob leer
    If GUICtrlRead($sAddTitleInput) = "" Or GUICtrlRead($sAddPathInput) = "" Then
    GUICtrlSetData($AddWarn, "Achtung! Die Eingabefelder dürfen nicht leer sein.")
    ContinueLoop
    ;Prüfung, ob Pfad existiert
    ElseIf Not FileExists(GUICtrlRead($sAddPathInput)) Then
    GUICtrlSetData($AddWarn, "Achtung! Die angegebene Datei existiert nicht.")

    ContinueLoop
    ;Alles in Ordnung
    Else
    $sAddTitle = GUICtrlRead($sAddTitleInput)
    $sAddPath = GUICtrlRead($sAddPathInput)
    $Return = 1
    ExitLoop
    EndIf
    Case $msgadd = $OpenBtn
    $sFOD = FileOpenDialog("Ausführbare Datei suchen", Default, "Ausführbare Datei (*.exe;*.bat;*.com)", 1 + 2)
    If $sFOD <> "" Then
    GUICtrlSetData($sAddPathInput, $sFOD)
    $aFODSplit = StringSplit($sFOD, "\")
    GUICtrlSetData($sAddTitleInput, $aFODSplit[$aFODSplit[0]])
    EndIf
    EndSelect
    WEnd

    GUIDelete($ADDEDIT_GUI)

    Return $Return

    EndFunc


    ;----------------------------------------------------------------------
    ;FUNKTION _EditFlag
    ;Setzt die Flag und den Status des Speichern-Buttons
    ;----------------------------------------------------------------------
    Func _EditFlag($nFlag, $Btn)
    If $nFlag = 1 Then
    GUICtrlSetState($Btn, $GUI_ENABLE)
    ElseIf $nFlag = 0 Then
    GUICtrlSetState($Btn, $GUI_DISABLE)
    EndIf
    EndFunc

    Im Anhang findet ihr die ini, die ich benutze.

    Eines der Probleme ist, dass ich, wenn ein Eintrag hinzugefügt wurde und diesen auswähle, Buttons ausgelöst werden. Ich verstehe nicht einmal im Ansatz, was die Buttons mit der ListView zu tun haben sollten. Zum Beispiel wird "automatisch" gespeichert.

    Außerdem verstehe ich nicht, wozu ich noch GuiCtrlCreateListView brauche, wenn es _GuiCtrlListView_Create gibt?

    Vielen Dank für die Hilfe!