_GUICtrlListView_DeleteAllItems Parameter falsch erklärt

  • Link : _GUICtrlListView_DeleteAllItems
    Falsch ist folgendes:

    Zitat


    Bemerkungen
    Falls diese Funktion mit einem Listview, welches durch die Funktion GUICtrlCreateListView erstellt wurde, angewendet wird, muss der Befehl _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($ListView)) heißen, da sonst eine Fehlermeldung erscheint. ($ListView ist die Variable wie das Listview heißt)


    Richtig stehts in den Kommentaren vom Beispiel:

    Zitat


    ; Die Items wurden mit Hilfe der Grundfunktionen erstellt. Die Control-ID ist an die Funktion zu übergeben
    ; Die Items wurden mit Hilfe von UDF Funktionen erstellt. Das Handle ist an das Control zu übergeben


    Ich hab das in meinem Programm falsch gemacht - wenn man mit _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($guiListView)) den Inhalt löscht und dann mit GUICtrlCreateListViewItem("wasauchimmer",$guiListView) wieder Items hinzufügt... und das viele male wiederholt, ist der Listview irgendwann leer und es lässt sich nichts mehr hinzufügen. GUICtrlCreateListViewItem gibt dann null zurück.

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

    • Offizieller Beitrag

    Ich hab das in meinem Programm falsch gemacht - wenn man mit _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($guiListView)) den Inhalt löscht und dann mit GUICtrlCreateListViewItem("wasauchimmer",$guiListView) wieder Items hinzufügt... und das viele male wiederholt, ist der Listview irgendwann leer und es lässt sich nichts mehr hinzufügen. GUICtrlCreateListViewItem gibt dann null zurück.


    Kann ich nicht bestätigen. Das ist völlig korrekt.
    Ausserdem brauchst du nicht das GUI-Handle, sondern das Handle des LV-Ctrl. ( GUICtrlGetHandle($guiListView) ??? )

    Ich benutze zur Erstellung immer

    [autoit]

    $LV = GuiCtrlCreateListview('Spalte1|Spalte2', ....)
    $hLV = GuiCtrlGetHandle($LV)

    [/autoit]

    Aktualisieren (neuer Inhalt) immer mit:

    [autoit]

    _GuiCtrlListview_DeleteAllItems($hLV)
    ; neue Item wieder mit
    GuiCtrlCreateListviewItem('Bla|Blub', $LV)

    [/autoit]

    Setze das seit Jahren in produktiver Umgebung ein, ohne jedes Problem.

    Wenn du vermeintliche Fehler zeigen möchtest, packe bitte ein Codebsp. dabei, mit dem der Fehler nachvollziehbar ist.

  • Lass das hier mal 1-2Minuten laufen, dann ist der Listview plötzlich leer.

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    GUICreate("Dings", 220, 250, 100, 200, -1)
    GUISetState(@SW_SHOW)
    $LV = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 200, 150)
    $hLV = GUICtrlGetHandle($LV)
    While True
    _GUICtrlListView_DeleteAllItems($hLV)
    For $i = 0 To 1234
    GUICtrlCreateListViewItem('Bla|Blub', $LV)
    Next
    WEnd

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


    Übrigens, bei mir war "$guiListView" so benannt, weil die Variable zur GUI gehört -
    ich muss dummerweise viele Globals verwenden und kriege so etwas mehr Ordnung rein.

    Zitat


    Setze das seit Jahren in produktiver Umgebung ein, ohne jedes Problem.


    Tja... das mag gutgehen, wenn du nicht extrem viele Elemente aus der ListView löscht. Zeitbombe. :P

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

    • Offizieller Beitrag

    Ja, der Fehler ist reproduzierbar.
    Ursache: Item werden gelöscht, aber nicht die genutzen Ctrl-ID freigegeben, sodass bei neuen Item irgendwann die max. Anzahl an Ctrl von 65535 erreicht wird. Danach kann kein Item/Ctrl mehr erstellt werden.
    Einen Zusammenhang mit dem Handle besteht aber nicht. Dasselbe passiert, wenn die ID verwendet wird für _GUICtrlListView_DeleteAllItems.
    Insofern ist das sicherlich ein Bug, aber nicht in der Hilfe, sondern in der Funktion: _GUICtrlListView_DeleteAllItems.

  • Wen ich folgendes Program laufen lasse, komme ich fehlerfrei über 500.000 Items(dauert ewig):

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    GUICreate("Dings", 220, 250, 100, 200, -1)
    GUISetState(@SW_SHOW)
    $LV = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 200, 150)
    $hLV = GUICtrlGetHandle($LV)
    $items=0
    While True
    _GUICtrlListView_DeleteAllItems($LV)
    For $i = 1 To 32768
    GUICtrlCreateListViewItem('Bla|Blub', $LV)
    $items+=1
    Next
    ConsoleWrite("items: " & $items & @CRLF)
    WEnd

    [/autoit]

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

    • Offizieller Beitrag

    Tweaky
    Ich denke das spielt keine Rolle, da die UDF (wie etliche andere auch) sowieso einige Bugs hat an deren Behebung niemand Interesse zeigt (auf BugReports reagiert man ja eh nicht).
    Mag sein, dass ausgerechnet diese Funktion nur mit ID funktioniert, für den Rest brauchst du aber das Handle, also lass es, wie es ist würde ich sagen.

  • Also ich würde es schon ändern. Gerade deswegen finden viele AutoIt so super, weil die Hilfe immer gepflegt wird.