TreeView auswerten

  • Hallo!

    Ich habe zu Treeview eine Frage.
    Wie kann man Einträge in ein Treeview vernünftig auswerten wenn man es zuvor mit einer For Schleife automatisch befüllt hat.

    Beispiel:

    eintrag1
    ______ itme1
    ______ itme2
    ______ item3
    eintrag2
    ______ irgendwas
    ______ nochwas

    Wie bekomme ich jetzt heraus wieviele Einträge in (eintrag1) sind und ebenso in (eintrag2)?
    Und wenn jetzt ein Eintrag ein bestimmtes Kriterium erfüllt wie kann ich das herausfiltern?

    Danke im Vorhinein

    If not :?: then ?( else :thumbup:

  • HI!

    Danke für die Antwort, habe schon gedacht das keiner drauf antwortet.
    Zu meinem Problem.

    Spoiler anzeigen
    [autoit]

    For $ii = 1 To $var1[0][0]
    If $ip = $var1[$ii][1] And $line <>"" Then
    liste($line & " - " & $ip & $i, $generalitem[$ii])
    EndIf
    Next

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

    Func liste($a, $b)
    ReDim $data[UBound($data) + 1]
    $data[UBound($data) - 1] = GUICtrlCreateTreeViewitem($a, $b)
    GUICtrlSetColor(-1, $c)
    EndFunc

    [/autoit]

    Das ist ein Auszug aus meinem Programm. ( wie bekomme ich den spoiler Bund und mit den Leerzeichen in meinem Code?)

    Edit BugFix
    Habs eingefügt: [ spoiler ][ autoit ] code [ /autoit ][ /spoiler ] (ohne Leerzeichen)

    Ich erstelle die treeviewitem mit einer For Schleife und lass das alles einem array zuweisen. Aber wenn ich jetzt eine z.B. Case $msg = $data[1] im Programm verwende dann kommt natürlich: Array variable has incorrect number of subscripts or subscript dimension range exceeded
    Also kann ich nicht das item auswerten.
    Hab keine Ahnung wie ich das sonst irgendwie lösen könnte.
    Froh um jede Hilfe

    If not :?: then ?( else :thumbup:

    • Offizieller Beitrag
    Zitat

    Original von Concara
    Aber wenn ich jetzt eine z.B. Case $msg = $data[1] im Programm verwende dann kommt natürlich: Array variable has incorrect number of subscripts or subscript dimension range exceeded
    Also kann ich nicht das item auswerten.

    Warum soll das "natürlich" kommen ?
    Genauso funktioniert das. Die Größe des Array (und somit die Anzahl der Einträge) kennst du - Ubound.
    Ob du die Arraygröße vorher festlegst oder zur Laufzeit mit ReDim aktualisierst, ist hierfür völlig unerheblich.

    Hier mal ein Bsp., das genauso funktioniert:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Dim $arItem[6]

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("AForm1", 633, 454, 193, 115)
    $TreeView1 = GUICtrlCreateTreeView(144, 68, 337, 265)

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

    For $i = 0 To UBound($arItem)-1
    $arItem[$i] = GUICtrlCreateTreeViewItem($i, $TreeView1)
    Next

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $arItem[0]
    MsgBox(0, '', "Item 0")
    Case $arItem[1]
    MsgBox(0, '', "Item 1")
    Case $arItem[2]
    MsgBox(0, '', "Item 2")
    Case $arItem[3]
    MsgBox(0, '', "Item 3")
    Case $arItem[4]
    MsgBox(0, '', "Item 4")
    Case $arItem[5]
    MsgBox(0, '', "Item 5")
    EndSwitch
    WEnd

    [/autoit]
  • OK ich weiß nicht mehr wie ich es genau erklären soll.
    Deshalb stell ich mal mein ganzes Programm hier ein.
    Was ich möchte: Ein Programm das per port scann nachsieht ob VNC auf einigen PC´s drauf läuft.
    Die Ergebnisse sollen in einer Treeview dargestellt werden.
    Das Programm soll per INI File die jeweiligen IP Bereiche zur Verfügung gestellt bekommen.
    Wenn man in der Treeview dann auf einen PC klickt soll dann ein VNC Viewer gestartet werden und eine Verbindung hergestellt werden.
    Wenn man einen Button anklickt dann sollte das gescannte exportiert werden.
    Die Orte die die IP Adressen angeben werden zu einem Ordner auf der Festplatte und die PC´s werden dann im jeweiligen Ordner zu Verknüpfungsdateien für den VNC Viewer (pc_xy.vnc)

    Und weil das Ganze so dynamisch ist verliere ich langsam den Plan.

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GuiTreeView.au3>

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

    GuiCreate("VNC Control", 800, 600,-1, -1);+ $WS_SIZEBOX,$WS_MAXIMIZEBOX+$WS_MINIMIZEBOX

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

    $Input_1 = GuiCtrlCreateInput("", 10, 10, 60, 20)
    $Input_2 = GuiCtrlCreateInput("", 10, 30, 60, 20)
    $Input_3 = GuiCtrlCreateInput("", 10, 50, 60, 20)

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

    $Button_1 = GuiCtrlCreateButton("Start", 75, 10, 55, 20)
    $Button_2 = GuiCtrlCreateButton("Alle", 75, 30, 55, 20)
    $Button_3 = GuiCtrlCreateButton("Liste", 130, 10, 55, 20)
    $statebutton = GUICtrlCreateButton("Col./Exp.", 75, 50, 55, 20)

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

    $combo = GUICtrlCreateCombo ("", 680, 10, 80, 20)

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

    $filemenu = GUICtrlCreateMenu ("&Datei")
    $fileitem = GUICtrlCreateMenuitem ("Öffnen",$filemenu)
    $fileitem2 = GUICtrlCreateMenuitem ("Speichern",$filemenu)
    $fileitem3 = GUICtrlCreateMenuitem ("Exit",$filemenu)
    $helpmenu = GUICtrlCreateMenu ("?")
    $infoitem = GUICtrlCreateMenuitem ("Info",$helpmenu)

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

    $treeview = GUICtrlCreateTreeView(10, 80, 220, 400, BitOr($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)

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

    $statusa = GUICtrlCreateLabel ("", 10, 480, 170, 20)

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

    Dim $itemtest[2]
    Dim $combodate, $c
    Dim $status
    Dim $x = 1
    Dim $data[1]
    Dim $nn

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

    $nslookup = @WindowsDir & '\System32\nslookup.exe -retry=10'
    $filename = @TempDir & "\VNCMASTER.txt"

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

    $var1 = IniReadSection(@ScriptDir & "\config.ini", "Standorte")
    $var2 = IniReadSection(@ScriptDir & "\config.ini", "IPStart")
    $var3 = IniReadSection(@ScriptDir & "\config.ini", "IPEnd")
    If @error Then
    MsgBox(4096, "", "Keine INI Datei vorhanden, es wird eine Beispiel INI erzeugt." & @CR & "Nach klick auf Ok wird das Programm neu gestartet.")
    IniWrite(@ScriptDir & "\config.ini", "Standorte", "testort", "10.80.0.")
    IniWrite(@ScriptDir & "\config.ini", "IPStart", "testort", "2")
    IniWrite(@ScriptDir & "\config.ini", "IPEnd", "testort", "10")
    If FileExists(@ScriptDir & "\config.ini") Then
    run(@ScriptDir & "\vncmaster.exe")
    Else
    MsgBox(4096, "", "Die INI Datei konnte nicht erstellt werden." & @CR & "Das Programm wird beendet.")
    EndIf
    Exit
    Else
    Global $generalitem[UBound($var1)]
    For $i = 1 To $var1[0][0]
    GUICtrlSetData($combo,$var1[$i][0],$var1[1][0])
    $generalitem[$i] = GUICtrlCreateTreeViewitem($var1[$i][0], $treeview)
    GUICtrlSetColor(-1, 0x0000C0)
    Next
    EndIf
    GUICtrlSetData($Input_1, $var1[1][1])
    GUICtrlSetData($Input_2, $var2[1][1])
    GUICtrlSetData($Input_3, $var3[1][1])

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

    GuiSetState()
    While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $fileitem3
    ExitLoop
    Case $msg = $combo ; Ort aus Combo auswählen und die Inputfelder setzen
    For $i = 1 To $var1[0][0]
    If GUICtrlRead($combo) = $var1[$i][0] Then
    GUICtrlSetData($Input_1, $var1[$i][1])
    GUICtrlSetData($Input_2, $var2[$i][1])
    GUICtrlSetData($Input_3, $var3[$i][1])
    EndIf
    Next

    Case $msg = $infoitem
    Msgbox(0,"Info","VNC Control"&@cr&"Version 0.1 Beta"&@cr&"Copyright by Hornsteiner Florian 2007")

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

    Case $msg = $Button_1 ; einzeln scannen
    $ip = GUICtrlRead($Input_1)
    $von = GUICtrlRead($Input_2)
    $bis = GUICtrlRead($Input_3)
    scann($ip, $von, $bis)

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

    Case $msg = $Button_2 ; Alle scannen
    For $i = 1 To $var1[0][0]
    $ip = $var1[$i][1]
    $von = $var2[$i][1]
    $bis = $var3[$i][1]
    scann($ip, $von, $bis)
    Next


    Case $msg = $statebutton ; Col./Exp.
    If $x = 1 Then
    _GUICtrlTreeViewExpand($treeview)
    $x = 2
    ElseIf $x = 2 Then
    _GUICtrlTreeViewExpand($treeview, 0)
    $x = 1
    EndIf

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

    ;Case $msg = $data[1]

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


    EndSelect
    WEnd

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

    Func scann($ip, $von, $bis)
    $status2 = $bis - $von + 1
    GUICtrlSetData ($Button_1, "Stop")
    For $i = $von to $bis
    $msg = GuiGetMsg()
    If $msg = $Button_1 Then
    ExitLoop
    Else
    $status = $status + 1
    GUICtrlSetData ($statusa, "Status " & $status & " von " & $status2 & " Einträge:" & _GUICtrlTreeViewGetCount ($treeview) - $var1[0][0] + 1)
    $var = Ping($ip & $i,100)
    If $var Then
    $commandline = @ComSpec & ' /A /C "' & $nslookup & '" ' & $ip & $i & ' > ' & $filename
    RunWait($commandline,"", @SW_HIDE)
    $file = FileOpen($filename, 0)
    $line2 = StringMid(FileReadLine($file, 4), 10)
    $line = StringReplace($line2, "." & @LogonDNSDomain, "")
    FileClose($file)
    ; damit es schneller läuft
    ;~ If $line <>"" Then
    ;~ $p = PortScan(5800, $ip & $i)
    ;~ EndIf
    For $ii = 1 To $var1[0][0]
    If $ip = $var1[$ii][1] And $line <>"" Then
    liste($line & " - " & $ip & $i, $generalitem[$ii])
    EndIf
    Next
    EndIf
    EndIf
    Next
    GUICtrlSetData ($Button_1, "Start")
    $status = ""
    EndFunc

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

    Func liste($a, $b)
    ReDim $data[UBound($data) + 1]
    $data[UBound($data) - 1] = GUICtrlCreateTreeViewitem($a, $b)
    GUICtrlSetColor(-1, $c)
    EndFunc

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

    Func PortScan($port, $ip)
    TCPStartUp()
    Opt("TCPTimeout",50)
    $socket = TCPConnect($ip, $port)
    If $socket = -1 Then
    $c = "0x000000"
    Return $c
    Else
    TCPCloseSocket($socket)
    $c = "0x00bf00"
    Return $c
    EndIf
    TCPShutdown()
    EndFunc

    [/autoit]


    Könnt ihr mir sagen wie ich $data mit case dynamisch auswerten kann?
    Dem Array $data sind die item´s zugewiesen worden.
    Ich kann ja nicht im vorhinein schon alle Case fälle angeben weil ich ja nicht weiß wie viele item´s erstellt werden. Das hängt ja davon ab wie viele PC´s auf den Ping antworten.
    Ahh das Erklären ist einfach nicht so einfach.
    Ich hoff ihr wisst halbwegs was ich meine.

    If not :?: then ?( else :thumbup:

    • Offizieller Beitrag
    Zitat

    Original von Concara
    Könnt ihr mir sagen wie ich $data mit case dynamisch auswerten kann?

    Ja sag doch das gleich ;)

    Ich hab mal den Teil aus meinem Bsp. auf dynamische Abfrage geändert.
    Guckst du:

    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    If $nMsg = $GUI_EVENT_CLOSE Then Exit
    For $i = 0 To UBound($arItem)-1
    If $nMsg = $arItem[$i] Then _
    MsgBox(0, '', "Das ist Item: " & $i)
    Next
    WEnd

    [/autoit]