ListView fragen

  • Hey,

    ich würde gerne ein ListView bauen (ist ja mehrspaltig) und dort einträge hinzufügen, entfernen oder die liste komplett löschen bzw auslesen.
    jetzt die fragen, wie machen?

    bei ner normalen List hatte ich das mit guictrlsetdata usw gemacht.

    geht das immernoch so, und wofür sind die ganzen teile wie _GUICtrlListView_DeleteAllItems($list) ???

  • _GUICtrlListView_DeleteAllItems($list) ist dafür da, dass alle Items in der Liste gelöscht werden ;) Bei mir funzen dir aber nur wenn du die Liste mit_GUICtrlListView_Create machst. Ansonsten noch _GUICtrlListView_AddItem und _GUICtrlListView_AddSubitem fürs hinzufügen und zum löschen... Schau in die Hilfe hab ich grad nich im Kopf ^^

  • ah, thx carsten, da war der entscheidende tip =)

    soweit klappt jetzt alles, bis auf:

    _guictrllistview_AddSubItem($list, 0, $addip, 1)

    also beim ersten mal geht das. da fügt er den wert in spalte 2 an stelle 1 ein.
    beim 2ten mal soll er theoretisch in spalte 2 zeile 2 schreiben, aber er überschreibt nun IMMER spalte 2 zeile 1 ...

    wie sagt man der funktion, dass es immer hinten dran soll?
    bei AddItem geht das automatisch oO

  • du hast da nen Syntaxfehler drinne:
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $sText, $iSubItem)
    du hast ja
    _guictrllistview_AddSubItem($list, 0, $addip, 1)
    $iIndex (bei dir 0) gibt an in welcher Zeile das SubItem hinzugefügt werden soll (ist ZeroBased. D.h. 0 ist die erste Zeile 1 die zweite usw.)

    Ich hab das Problem so gelöst:

    [autoit]

    If FileExists("data.ini") Then
    $count = IniReadSectionNames("data.ini")
    _GUICtrlListView_DeleteAllItems($ListView1)
    $dataname = IniReadSectionNames("data.ini")
    For $i = 1 to $dataname[0]
    $datatyp = IniRead("data.ini", $dataname[$i], "typ", "Error")
    _GUICtrlListView_AddItem($ListView1, $dataname[$i], $i)
    _GUICtrlListView_AddSubItem($ListView1, $i - 1, " X", 1)
    _GUICtrlListView_AddSubItem($ListView1, $i - 1, " X", 2)
    _GUICtrlListView_AddSubItem($ListView1, $i - 1, " X", 3)
    Next
    EndIf

    [/autoit]


    Meine data.ini sieht so aus:

    Code
    [Das soll in Spalte 1]
    typ=Das in Spalte 2,3 und 4
  • hmm, dank dir, aber das is irgendwie umständlich.
    dachte die funktionen sollen alte sachen vereinfachen *g*

    dann werd ich das mal probieren bzw nach weiteren möglichkeiten ausschau halten =)

    thx

    PS: so, dank dir carsten, durch deine erklärung hab ich die funktion endlich richtig verstanden *g*

    und dann hab ich mir auch die passende lösung dazu gebastelt, vllt kannst du sie auch verwenden, ist nen tick einfacher als deine =)
    funzt bis jetzt ganz gut ...

    [autoit]


    _guictrllistview_AddSubItem($list, _GUICtrlListView_GetItemCount($list) - 1, $addip, 1)

    [/autoit]
  • jetzt bin ich an nem neuen prob angelangt. und zwar würde ich gerne die komplette liste abspeichern ... in einer txt mit | als trennzeichen.
    probiert habe ich es so

    [autoit]


    Func _SaveIP()
    $anz = _GUICtrlListView_GetItemTextArray($list)
    For $i = 1 To $anz[0]
    $SaveIPs[$i] = _GUICtrlListView_GetItemTextArray($list, 1) & '|' & _GUICtrlListView_GetItemText($list, 2) & "|"
    Next
    _FileWriteFromArray($pathIPs, $SaveIPs)
    EndFunc

    [/autoit]

    das ganze bricht auch nicht ab, wenn ich Dim $SaveIPs[100] mache
    dann habe ich aber 100 leerzeilen in der Datei, jedoch nicht die werte, die im ListView sind oO

  • ok, so schaut es zZ aus ...

    [autoit]

    #Include <GuiConstants.au3>
    #include <Array.au3>
    #include <GuiListBox.au3>
    #include <file.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>

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

    Global $Paused
    Global $urllist
    Global $SaveIPs

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

    $pathIPs = @ScriptDir & "\Destinys"
    $script = "WhoIsOn RelOadEd"
    $ini = @ScriptDir & "\Settings.ini"
    $error1 = 0
    $error2 = 0

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

    $GuiIP = GUICreate($script & " Destiny IPs", 345, 310)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_ExitSettings")

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

    $list = _GUICtrlListView_Create($GuiIP,"Name |IP ", 5, 5, 250, 300)

    $badd = GUICtrlCreateButton("add", 260, 10, 80)
    GUICtrlSetOnEvent(-1, "_AddIP")
    $bremove = GUICtrlCreateButton("remove", 260, 50, 80)
    GUICtrlSetOnEvent(-1, "_RemoveIP")
    $bclear = GUICtrlCreateButton("clear", 260, 90, 80)
    GUICtrlSetOnEvent(-1, "_ClearIP")
    $bok = GUICtrlCreateButton("ok", 260, 280, 80)
    GUICtrlSetOnEvent(-1, "_SaveIP")

    GUISetState(@SW_SHOW, $GuiIP)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _AddIP()
    Do
    $addname = InputBox("Name", "Please enter a name", "", "", 100, 130)
    If @error = 1 Then
    $error1 = 1
    ExitLoop
    Else
    EndIf
    until $addname <> ""
    If $error1 = 1 Then
    Else
    Do
    $addip = InputBox("IP", "Please enter the IP", "", "", 100, 130)
    If @error = 1 Then
    $error2 = 1
    ExitLoop
    Else
    EndIf
    Until StringRegExp($addip, "[0-9]+")
    If $error2 <> 1 Then
    _GUICtrlListView_AddItem($list, $addname)
    _guictrllistview_AddSubItem($list, _GUICtrlListView_GetItemCount($list) - 1, $addip, 1)
    Else
    EndIf
    EndIf
    $error1 = 0
    $error2 = 0
    EndFunc

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

    Func _RemoveIP()
    _GUICtrlListView_DeleteItemsSelected($list)
    EndFunc

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

    Func _ClearIP()
    _GUICtrlListView_DeleteAllItems($list)
    EndFunc

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

    Func _SaveIP()
    $anz = _GUICtrlListView_GetItemTextArray($list)
    For $i = 1 To $anz[0]
    $SaveIPs[$i] = _GUICtrlListView_GetItemTextArray($list, 1) & '|' & _GUICtrlListView_GetItemText($list, 2) & "|"
    Next
    _FileWriteFromArray($pathIPs, $SaveIPs)
    EndFunc

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

    Func _ExitSettings()
    Exit
    ;GUISetState(@SW_HIDE, $GuiSettings)
    EndFunc

    Func _OnExitFunc()
    Exit
    EndFunc

    [/autoit]
  • Warum schreibst du

    [autoit]

    "Name |IP "

    [/autoit]


    und nicht mit _GUICtrlListView_ColumnSetWeidth (oder wie auch immer)? ^^

    Naja b2t:
    Du willst also in die TXT Datei
    Name|IP|Name|IP usw. oder?
    Machs doch so:

    [autoit]

    Func _SaveIP()
    $anz = _GUICtrlListView_GetItemTextArray($list)
    For $i = 1 To $anz[0]
    FileWrite("test.txt", $anz[1] & "|" & $anz[2] & "|")
    Next
    EndFunc

    [/autoit]


    Einen Versuch ist es Wert ;)

  • habs jetzt so hinbekommen =)
    wiedermal dank eines guten tips *g*

    Spoiler anzeigen
    [autoit]

    Func _SaveIP()
    FileDelete($SaveIPs)
    $anz = _GUICtrlListView_GetItemCount($list)
    For $i = 1 To $anz
    $SaveIPs = _GUICtrlListView_GetItemText($list, $i - 1) & '|' & _GUICtrlListView_GetItemText($list, $i - 1, 1) & "|" & @CRLF
    FileWrite($pathIPs, $SaveIPs)
    Next
    EndFunc

    [/autoit]

    aber is das eine prob gelöst, folgt natürlich das nächste.
    das listview soll jetzt mit den einträgen, die gespeichert wurde, erstellt werden.
    folgendes geht iwie nicht ...

    [autoit]

    If FileExists($pathIPs) Then
    _FileReadToArray($pathIPs, $ips)
    For $i = 1 To $ips[0]
    _GUICtrlListView_AddItem($list, $ips[$i]) ;oder _guictrllistview_additem/array
    Next
    Else
    EndIf

    [/autoit]

    hat jmd ne idee wie ich das managen kann?
    die daten werden aus einer txt gelesen, in der sie (extra) wie folgt abgespeichert sind:

    Daten1|Daten2 ....

    damals ging es mit guictrlsetdata, dass er aus einem solchen array direkt 2 spalten gefüllt hat. jetzt geht es nicht mehr =/

    • Offizieller Beitrag

    Hi sc4ry,

    hier die Lösung. Du mußt das zweistufig eintragen. Den Wert für die erste Spalte mit ...AddItem() und den/die Werte für die zweite/weitere Spalte(n) mit ...AddSubItem.
    Bei mehr als zwei Spalten mußt du die SubItem-Erstellung dann in einer Schleife führen.

    [autoit]

    If FileExists($pathIPs) Then
    _FileReadToArray($pathIPs, $ips)
    $lineIndex = 0
    For $i = 1 To $ips[0]
    $str = StringSplit($ips[$i], '|')
    _GUICtrlListView_AddItem($list, $str[1])
    _GUICtrlListView_AddSubItem($list, $lineIndex, $str[2], 1)
    $lineIndex += 1
    Next
    Else
    ;...
    EndIf

    [/autoit]
  • danke bugfix, ich werd es gleich mal ausprobieren.

    @ carsten, ich war kurz davor, wieder auf ini umzusteigen.
    warum ich aber ne txt genommen habe, und der die einträge mit | getrennt waren, liegt an nem alten tip ... der auch von bugfix stammen könnte.
    und zwar kann man so mit nur einem befehl EIGENTLICH mehrere spalten füllen. guictrlsetdata und der text mit | getrennt füllt so automatisch mehrere spalten. scheint durch das neue autoit aber leider nicht mehr zu funktionieren.

    gemacht habe ich es so zB beim grundbuch creater, da kannste es dir mal angucken. im grunde ganz easy ... aber wie gesagt, es geht wohl nimmer =(

    • Offizieller Beitrag

    Hi,
    da hab ich mich etwas irritieren lassen. Du kannst natürlich weiterhin GUICtrlCreateListViewItem() verwenden.
    Dann geht das in einem Schritt.

    [autoit]

    If FileExists($pathIPs) Then
    _FileReadToArray($pathIPs, $ips)
    For $i = 1 To $ips[0]
    GUICtrlCreateListViewItem($ips[$i], $list)
    Next
    Else
    ;...
    EndIf

    [/autoit]