Listview Überprüfungs Problem

  • Vorneweg:
    Ziel ist es eine Überprüfung zu haben welche mir Kontrolliert ob der Benutzer eine Auswahl getroffen hat.
    Sollte dies nicht der Fall sein, so soll eine MSG Box erscheinen die den Benutzer dazu auffordert genau dies zu tun und zeitgleich das erste auf der Liste farblich hinterlegt.

    dazu habe ich

    [autoit]

    Local $iListViewStyle = BitOr($LVS_SORTASCENDING, $LVS_SINGLESEL,$LVS_REPORT, $LVS_SHOWSELALWAYS )

    [/autoit]

    sowie

    [autoit]

    $Programmliste = GUICtrlCreateListView("Installierte Programme", 30, 30, 240, 230, $iListViewStyle )
    _GUICtrlListView_SetColumnWidth($Programmliste, 0, 215)
    for $i = 1 to UBound($aListcheck)-1
    $item = GUICtrlCreateListViewItem($aListcheck[$i], $Programmliste)
    next

    [/autoit]

    die Abfrage lautet gegenwärtig

    [autoit]

    $count = _GUICtrlListView_GetItemCount($Programmliste)
    for $i = 0 to $count -1
    $check = _GUICtrlListView_GetItemSelected($Programmliste, $i)
    if $check == True Then
    $Column = _GUICtrlListView_GetItemTextString($Programmliste,-1)
    ;MsgBox(0, "", '"' & $Column & '" gefunden.')

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

    EndIf
    Next

    [/autoit]

    Ich habe bereits eine If Version versucht die so aussieht:

    [autoit]

    $Column = _GUICtrlListView_GetItemTextString($Programmliste,-1)
    If $Column = "" Then _GUICtrlListView_SetItemChecked($Programmliste, 0, True)

    [/autoit]

    Nur ist das Problem das gleiche.
    Sobald nichts usgewählt ist, beendet sich mein Programm (stürzt ab)
    Ist etwas ausgewählt passt alles einwandfrei. Sozusagen happert es gerade beim Exception Handling.
    Was mich "wundert" (als Laie) das bei meiner IF Abfrage wenn die $Column ja genau das ausliefert was ich gefragt habe nämlich "" das Programm abstürzt ohne das besagter Wert gesetzt wird.

    Bin gegenwärtig mit meinem Latein etwas am ende, vielleicht hat ja jemand eine Idee.

    Einmal editiert, zuletzt von Vincinzerei (3. November 2010 um 15:14)

  • Praktisch wäre die Fehlermeldung die du erhälst bzw das komplette Script.
    Dann ist das Problem bestimmt schnell gelöst ;)

    Edit:
    Oh ich glaube der Fehler liegt am Case-sensitiv Vergleich
    Probier statt dem:

    [autoit]

    if $check == True Then

    [/autoit]


    Einfach mal das:

    [autoit]

    if $check = True Then

    [/autoit]
  • das sollte nicht das Problem sein
    aber ohne dein Skript/die fehlermeldung wirds schwer werden zu helfen

  • Ich versuchs jetzt nochmal anders herum.
    Sollte es dann noch immer nichts werden werd ich mal das komplette Script reinballern.

  • Genau darum mag ich das Forum.
    Da wird Amateuren wie mir genau das gezeigt was sie trotz Intensiver Hilfe durchsuchen schlichtweg nicht gefunden haben.

    Jetzt muss ich nur noch rausfinden was ich falsch mache das trotz Checkboxes obige Anweisung mir ein leeres Array zurückgibt.

  • das kommt davon das ich (ratlos wie ich bin) verschiedene Sachen ausprobiert habe.
    Anbei nun das Script, ich bin noch am rumbasteln da ich vor kurzem erst hinter ein paar sachen gekommen bin..
    wie also Oscar schon sagte.. ein paar sachen sind sicher sehr umständlich geschrieben

    [autoit]

    #RequireAdmin

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

    Opt("GUIOnEventMode", 0)

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

    ;Includes
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <Array.au3>
    #include <ListViewConstants.au3>
    #Include "C:\Program Files\AutoIt3\Include\Outlook.au3"
    #include <Inet.au3>
    #Include <GuiListView.au3>
    #Include <File.au3>
    #include <Constants.au3>

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

    ;Temporäre Datei mit den Registrywerten
    if FileExists (@TempDir & '\' & @ComputerName & '.txt') Then FileDelete(@TempDir & '\' & @ComputerName & '.txt')
    if FileExists (@TempDir & '\' & @ComputerName & '.txt') Then FileDelete(@TempDir & '\' & @ComputerName & '_registry.txt')

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

    Local Const $sPathini = @TempDir & '\' & @ComputerName & '.txt'
    Local Const $sPathini2 = @TempDir & '\' & @ComputerName & '_registry.txt'
    Local $iListViewStyle = BitOr($LVS_SORTASCENDING, $LVS_SINGLESEL,$LVS_SHOWSELALWAYS )
    Local $iexListViewStyle = BitOr($LVS_EX_CHECKBOXES, $LVS_REPORT, $LVS_EX_FULLROWSELECT )

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

    _Programsread("x86")
    ;Switch to 64Bit OS, gegenwärtig abgedreht
    ;If @OSArch = "x64" Then _Programsread("x64")
    If @OSArch = "x64" Then
    MsgBox(0, "Error", "Das Programm untersützt gegenwärtig keine 64Bit Architektur")
    Exit
    EndIf

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

    ; Registrywerte werden ausgelesen
    Func _Programsread($sOsArch)
    If $sOsArch = "x86" Then $sRegkey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    If $sOsArch = "x64" Then $sRegkey = "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
    $i = 0
    While 1
    $i +=1
    $sReturnkeyname = RegEnumKey($sRegkey, $i)
    If @error Then ExitLoop
    $sReturnDisplayVersion = RegRead($sRegkey & $sReturnkeyname, "DisplayVersion")
    $sReturnDisplayName = RegRead($sRegkey & $sReturnkeyname, "DisplayName")
    $sReturnPublisherName = RegRead($sRegkey & $sReturnkeyname, "Publisher")
    If StringInStr($sReturnPublisherName,'Mein Computer') <> 0 Then
    FileWriteLine($sPathini,$sReturnDisplayName & ' ' & $sReturnDisplayVersion)
    ElseIf StringInStr($sReturnPublisherName,'Mein-Computer') <> 0 Then
    FileWriteLine($sPathini, $sReturnDisplayName & ' ' & $sReturnDisplayVersion)
    ElseIf StringInStr($sReturnPublisherName,'Mein Software') <> 0 Then
    FileWriteLine($sPathini,$sReturnDisplayName & ' ' & $sReturnDisplayVersion)
    EndIf
    WEnd
    EndFunc

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

    _Programsuninstall("x86")

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

    Func _Programsuninstall($sOsArch2)
    If $sOsArch2 = "x86" Then $sRegkey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    If $sOsArch2 = "x64" Then $sRegkey = "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
    $i = 0
    While 1
    $i +=1
    $sReturnkeyname = RegEnumKey($sRegkey, $i)
    If @error Then ExitLoop
    $sReturnDisplayVersion = RegRead($sRegkey & $sReturnkeyname, "DisplayVersion")
    $sReturnDisplayName = RegRead($sRegkey & $sReturnkeyname, "DisplayName")
    $sReturnPublisherName = RegRead($sRegkey & $sReturnkeyname, "Publisher")
    $SilentUninstall = RegRead($sRegkey & $sReturnkeyname, "UninstallString")
    If StringInStr($sReturnPublisherName,'Mein Computer') <> 0 Or StringInStr($sReturnPublisherName,'Mein-Computer') <> 0 OR StringInStr($sReturnPublisherName,'Mein Software') <> 0 Then
    If StringInStr($SilentUninstall, 'msiexec.exe') = 0 Then
    $SilentUninstall = 'Alte Version welche von hand zu deinstallieren ist.'
    Else
    $SilentUninstall = StringReplace($SilentUninstall, '/I', '/X')
    EndIf
    FileWriteLine($sPathini2,$sReturnDisplayName & ' ' & $sReturnDisplayVersion & ' ' & $SilentUninstall )
    EndIf
    WEnd
    EndFunc

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

    Dim $aListcheck2
    If Not _FileReadToArray($sPathini2, $aListcheck2) Then
    MsgBox(4096, "Fehler", "Fehler beim Einlesen der Datei!" & @CRLF & "Fehlercode: " & @error)
    Exit
    EndIf

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

    ;Array wird erstellt mit den Registrywerten
    Dim $aListcheck
    If Not _FileReadToArray($sPathini, $aListcheck) Then
    MsgBox(4096, "Fehler", "Fehler beim Einlesen der Datei!" & @CRLF & "Fehlercode: " & @error)
    Exit
    EndIf

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

    ;Lädt die temp. Datei mit der Programmliste
    $datei = FileOpen($sPathini, 0)
    If $datei = -1 Then
    MsgBox(0, "Error", "Konnte Programmliste nicht finden")
    Exit
    EndIf
    $Liste = FileRead($datei)
    If @error = -1 Then Exit
    FileClose($datei)

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

    ;Gui start
    #Region ### START Koda GUI section ### Form=C:\Users\harry\Desktop\Form1.kxf
    $titel_support = GUICreate("Mein Support Plugin", 527, 289, 308, 88)
    $obergruppe_support = GUICtrlCreateGroup("mein_support", 24, 16, 465, 249)
    $Programmliste = GUICtrlCreateListView("Installierte Programme", 30, 30, 240, 230, $iListViewStyle, $iexListViewStyle )
    _GUICtrlListView_SetColumnWidth($Programmliste, 0, 215)
    for $i = 1 to UBound($aListcheck)-1
    $item = GUICtrlCreateListViewItem($aListcheck[$i], $Programmliste)
    next
    $copy_list = GUICtrlCreateButton("Liste auf Desktop kopieren", 272, 32, 195, 25, $WS_GROUP)
    $email = GUICtrlCreateButton("Per e-mail versenden", 272, 96, 195, 25, $WS_GROUP)
    $update = GUICtrlCreateButton("Auf Updates Prüfen", 272, 128, 195, 25, $WS_GROUP)
    $un_install = GUICtrlCreateButton("Uninstaller", 272, 160, 195, 25, $WS_GROUP)
    $bugreport = GUICtrlCreateButton("Einen Fehler melden!", 272, 195, 195, 25, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ; GUI-Schleife
    While 1
    $nMsg = GUIGetMsg()

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

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    FileDelete ($sPathini)
    FileDelete ($sPathini2)
    Exit
    ;Datei kopieren auf Desktop
    Case $copy_list
    $filecopy = FileOpen($sPathini, 1)
    FileWrite($filecopy, @CRLF & "Es wird Windows "& @OSVersion & " Verwendet.")
    FileClose($filecopy)
    FileCopy($sPathini,@DesktopDir & '\' & "Dateiliste.txt" ,1)

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

    ;Standard Email Programm öffnen und direkt Email vorbereiten
    Case $email
    $Call= InputBox('Telnummer', 'Geben Sie bitte ihre Telnummer mit Landesvorwahl ein:')
    $Address = "support@dummymail.com"
    $Subject = "Supportanfrage"
    $Body = " Bitte kontaktieren Sie mich unter der Rufnummer:" & $Call & @CRLF & "Es wird Windows "& @OSVersion & " Verwendet." & @CRLF & $Liste
    ;MsgBox(0, 'Das E-Mail-Programm wirde geöffnet', _INetMail($Address, $Subject, $Body),1)
    _INetMail($Address, $Subject, $Body)

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

    ;Update funktion (to come)
    Case $update

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

    ;gegenwärtiger versuch mit Indices
    $aread = _GUICtrlListView_GetSelectedIndices($Programmliste,true)
    _ArrayDisplay($aread,"")

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

    Case $un_install

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

    _softwareuninstall()

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

    EndSwitch

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

    WEnd

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

    Func _softwareuninstall()

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

    ;Markierter Wert wird ausgelesen
    ;Alterversuch mit String auslesen.. funktioniert teilweise, Programm stürzt ab wenn
    ;keine Auswahl getroffen wurde (auswahl ohne Checkboxes)

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

    ;~ $count = _GUICtrlListView_GetItemCount($Programmliste)
    ;~ for $i = 0 to $count -1
    ;~ $check = _GUICtrlListView_GetItemSelected($Programmliste, $i)
    ;~ if $check == True Then
    ;~ $Column = _GUICtrlListView_GetItemTextString($Programmliste,-1)
    ;~ ;MsgBox(0, "", '"' & $Column & '" gefunden.')

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

    ;~ EndIf
    ;~ Next

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

    ;_GUICtrlListView_SetItemSelected(GUICtrlGetHandle($listview), $i, True)

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

    $Column = _GUICtrlListView_GetItemTextString($Programmliste,-1)

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

    If $Column = "" Then _GUICtrlListView_SetItemChecked($Programmliste, 0, True)

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

    ;~ If $Column = "" Then
    ;~ _GUICtrlListView_SetItemFocused($Programmliste, 0)
    ;~ MsgBox(4160, "Information", "Item 2 hat den Fokus: " & _GUICtrlListView_GetItemFocused($Programmliste, 0))
    ;~ EndIf

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

    ;MsgBox(0, "", '"' & $Column & '" gefunden.')

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

    ;~ $count = _GUICtrlListView_GetItemCount($Programmliste)
    ;~ for $i = 0 to $count -1
    ;~ $check = _GUICtrlListView_GetItemSelected($Programmliste, $i)
    ;~ if $check = True Then
    ;~ $id = _GUICtrlListView_GetItemText($Programmliste, $i, 10)
    ;~ $Column = _GUICtrlListView_GetItemTextString($Programmliste,-1)
    ;~
    ;~ _GUICtrlListView_SetItemSelected($Programmliste, $id)
    ;~ EndIf
    ;~ Next

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

    ;markierter Wert wird gesucht
    $iIndex = _ArraySearch($aListcheck2,$Column, 0, 0, 0, 1)
    ;MsgBox(0, "", '"' & $iIndex & '" gefunden.')
    ;Registry Eintrag wird um den gefunden Wert gelöscht damit nur der MSI befehl übrig bleibt
    $ssuche= $aListcheck2[$iIndex]
    Local $sOutput = StringRegExpReplace($ssuche, $Column, "")
    ;MsgBox(0,"",$sOutput)
    RunWait(@ComSpec & " /c " & $sOutput)

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

    EndFunc

    [/autoit]

    Edit:
    Weis nicht ob das jetzt "ok" so ist..
    aber mit

    [autoit]

    For $i = 0 To _GUICtrlListView_GetItemCount($Programmliste)
    If _GUICtrlListView_GetItemChecked($Programmliste, $i) Then
    MsgBox(0,"",_GUICtrlListView_GetItemText($Programmliste, $i) & " is checked!")
    EndIf
    Next

    [/autoit]

    Funktioniert es :) Und das Programm erschiesst sich auch nicht wenn man nichts auswählt

    3 Mal editiert, zuletzt von Vincinzerei (3. November 2010 um 15:04)