So geht es:
$ObjList = ObjCreate("System.Collections.ArrayList") ; create
$ObjList.Add("Wort")
$ObjList.Add("Test")
$ObjList.Add("Hallo")
$ObjList.Add("Ja")
_ArrayListRemoveIf($ObjList, "e")
For $sVal in $ObjList
ConsoleWrite($sVal&@crlf)
Next
Func _ArrayListRemoveIf(ByRef $oList, $sStringContained)
Local $iIndex = 0
while $iIndex<$oList.count
If StringInStr($oList.item($iIndex), $sStringContained) Then
$oList.removeAt($iIndex)
Else
$iIndex+=1
EndIf
WEnd
EndFunc
Alles anzeigen
Das Problem ist, dass ein For ... In ... intern einen Iterator nutzt. Während des durchlaufens der For-Schleife, darf das iterierte Objekt aber nicht verändert werden. (Wundert mich hier nur, dass es nicht mit einer Fehlermeldung beendet, sondern weiterläuft... AutoIt schluckt den Fehler wohl).
Deshalb darfst du innerhalb der For ... In ... Schleife, das Objekt, über das iteriert wird nicht verändern (Hier $ObjList).
Um das zu umgehen kannst du über den Index auf das Objekt zugreifen, wie ich in dem Beispiel gemacht habe. Dadurch, dass ich immer nur mit dem Index einzelne Objekte abfrage und lösche, kann ich die ArrayList währenddessen verändern.
Nebenbei: Es ist in vielen Programmiersprachen so, dass man während der Nutzung eines Iterators das Objekt nicht verändern darf, da der Iterator dann probleme bekommt. Also einfach merken: Beim verändern; besonders beim Löschen; keine Schleife verwenden, die intern einen Iterator verwenden würde, sondern immer über den Index,... die einzelnen Zugriffe selbst verwalten.