# Doppelte Einträge im ListView löschen



## olek (19. Februar 2005)

Servus,

 Habe ein ListView das mir die installierte Software des PCs ausgibt.
 Hin und wieder treten doppelte Einträge auf. Wie kann ich diese löschen bzw. ignorieren in meinem Fall
 Ein Ansatz von mir in rot:

 Private Sub Form_Load()
   Dim SO As SearchOptions
   Dim Gefunden() As String
   Dim i As Integer
   Dim Daten() As String
   Dim DisplayName As String
   Dim RegKey As String
   Dim Folder As String
   Dim itemX As ListItem

   ' Registry in der die deinstallierbare Software aufzufinden ist
   RegKey = "Software\Microsoft\Windows\CurrentVersion\Uninstall\"

   With ListView1
     .ListItems.Clear
     .Sorted = True                 
     .SortKey = 0                   
     .SortOrder = lvwAscending   

     ' Alle Einträge im Schlüssel
     ' Software\Microsoft\Windows\CurrentVersion\Uninstall ermitteln
     With SO
       .HowToSearch = StringExists
       .SearchMainKey = HKEY_LOCAL_MACHINE
       .SearchString = "DisplayName"
       .StartSearchPath = RegKey
       .SearchSubfolders = True
       .FindKeys = True
       .FindValueNames = True
       .FindValues = True
     End With

     ' Suche starten
     FindString SO, Gefunden
     On Error Resume Next
     For i = 0 To UBound(Gefunden)
     Daten = Split(Gefunden(i), vbCrLf)

       ' SubKey definieren
       Folder = Mid$(Daten(0), InStrRev(Daten(0), "\") + 1)

         DisplayName = Get_ValueString(HKEY_LOCAL_MACHINE, _
                                       RegKey & Folder, "DisplayName")

         If DisplayName = "" Then DisplayName = Folder

       ' ListView1 Daten in ein .txt schreiben
       Dim Filenum As Integer
       Dim j As Integer

* ' Doppelte Einträge ignorieren
        Dim neuerEintrag As String
        Dim doppelt As Boolean
        Dim d As Long

        neuerEintrag = "Eintrag"
        doppelt = False
        For d = 0 To ListView1.ListItems.Count
        If ListView1.ListItems(d) = neuerEintrag Then doppelt = True
        Next d
        If doppelt = False Then ListView1.ListItems.Add (neuerEintrag)*

       ' Ausgelesene Daten in ein .txt File schreiben
        Filenum = FreeFile
        Open "C:\" & GetDomain & "_software.txt" For Output As #Filenum
        For j = 0 To ListView1.ListItems.Count
        Print #Filenum, ListView1.ListItems(j).Text
        Next j
        Close #Filenum

       Set itemX = .ListItems.Add(, Daten(0), DisplayName)
       itemX.SubItems(1) = Daten(2)

     Next i
   End With
 End Sub

 DANKE für jede Hilfe!
 Gruß alex


----------



## Shakie (19. Februar 2005)

Der Startindex bei den Items des ListView-Control liegt bei 1 und nicht bei Null.
Probier es mal so:
	
	
	



```
Dim strNeuerEintrag As String
strNeuerEintrag = "Mein neuer Eintrag"
Dim blnDoppelt As Boolean
Dim lngZähler As Long
For lngZähler = 1 To ListView1.ListItems.Count
	If Me.ListView1.ListItems(lngZähler).Text = strNeuerEintrag Then
		blnDoppelt = True
		Exit For
	End If
Next
If Not blnDoppelt Then ListView1.ListItems.Add , , strNeuerEintrag
```


----------



## olek (19. Februar 2005)

Habe deinen Code wie oben angegeben eingefügt, jedoch leider keine Wirkung.
 Was ist mit "Mein neuer Eintrag gemeint" ... muss ich statt dem etwas einfügen oder wat

 DANKE.

 cya


----------



## Shakie (19. Februar 2005)

Du musst logischerweise in die Variable "strNeuerEintrag" den Text des zu erstellenden Eintrags reinschreiben. Ich weiß ja nicht wie der Eintrag bei dir heißt, deswegen habe ich einfach "Mein neuer Eintrag" verwendet.


----------



## Fingers (19. Februar 2005)

Hallo,

"mein neuer Eintrag" ist der String, den Du neu eintragen willst, also der Softwareeintrag, von dem Du nicht weißt, ob er doppelt ist.

Shakie: Wie kirege ich die tollen Code-Frames in meine Antworten?

Gruß
Fingers


----------



## Shakie (20. Februar 2005)

@Fingers: Mit [ Code ] und [ /Code ] (ohne Leerzeichen), kannst du auch alles hier nachlesen: http://www.tutorials.de/misc.php?do=bbcode


----------



## Filone (20. Februar 2005)

Wenn ich mich nicht irre, müsst ihr hierbei bedenken daß nach dem Löschen eines ListItems das Steuerelement modifiziert wurde und damit die Schleife


```
For i = 1 To frmSonstWas.lvSonstWas.ListItems.Count
```

einen geänderten Wert hat. Sonst kommt es zu Fehlermeldungen (berechtigterweise).


----------

