vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Variablen/Strings · Arrays   |   VB-Versionen: VB4, VB5, VB623.01.04
Element aus String-Array löschen

Zwei Möglichkeiten ein beliebiges Element aus ein Array zu eliminieren: eine langsame und eine sehr schnelle Methode :-)

Autor:   Dieter OtterBewertung:  Views:  44.895 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10kein Beispielprojekt 

In unserem letzten Tipp haben wir Ihnen gezeigt, wie man mit Hilfe der RtlMoveMemory API-Funktion neue Elemente in ein String-Array einreiht. Heute zeigen wir den umgekehrten Weg: Das Löschen eines Elements aus einem Array, wobei alle nachfolgenden Elemente nach vorne rutschen sollen.

Auch hierfür haben wir wieder zwei Möglichkeiten parat.

Zunächst die erste, langsamere, Methode - mit VB-Boardmitteln realisiert:

Public Sub ArrayDelete(ByRef sArray() As String, _
  ByVal nDelPos As Long, _
  Optional ByVal nSize As Variant, _
  Optional ByVal bRedimSize As Variant)
 
  Dim i As Long
 
  ' Größe des Arrays bestimmen, falls nicht angegeben
  If IsMissing(nSize) Then nSize = UBound(sArray)
 
  If nDelPos < nSize Then
    ' Element aus Array löschen und alle 
    ' nachfolgende Elemente nach vorne schieben
    For i = nDelPos To nSize - 1
      sArray(i) = sArray(i + 1)
    Next i
  End If
 
  ' Array ggf. autom. um 1 Element verkleinern
  If IsMissing(bRedimSize) Then bRedimSize = True
  If bRedimSize Then
    nSize = nSize - 1
    If nSize < 0 Then nSize = 0
    ReDim Preserve sArray(nSize)
  Else
    sArray(nSize) = ""
  End If
End Sub

Das ganze funktioniert schon ganz gut, nur lässt die Perfomance bei großen Daten-Arrays sehr zu wünschen übrig - vor allem dann, wenn sich das zu löschende Element ziemlich weit vorne im Array befindet.

Deshalb haben wir auch heute wieder eine zweite Möglichkeit auf Lager. Diesmal verschieben wir nicht die einzelne Array-Elemente via For..Next-Schleife, sondern verwenden die RtlMoveMemory API-Funktion, d.h. wir arbeiten direkt mit Zeigern!

' Benötigte API-Deklaration
Private Declare Sub CopyMemoryPtr Lib "kernel32" _
  Alias "RtlMoveMemory" ( _
  ByVal Destination As Long, _
  ByVal Source As Long, _
  ByVal Length As Long)
Public Sub ArrayDelete(ByRef sArray() As String, _
  ByVal nDelPos As Long, _
  Optional ByVal nSize As Variant, _
  Optional ByVal bRedimSize As Variant)
 
  Dim nPtr As Long
 
  ' Größe des Arrays bestimmen, falls nicht angegeben
  If IsMissing(nSize) Then nSize = UBound(sArray)
 
  If nDelPos < nSize Then
    ' Element aus Array löschen und alle 
    ' nachfolgende Elemente nach vorne schieben
    nPtr = StrPtr(sArray(nDelPos))
    CopyMemoryPtr VarPtr(sArray(nDelPos)), VarPtr(sArray(nDelPos + 1)), _
      VarPtr(sArray(nSize)) - VarPtr(sArray(nDelPos))
    CopyMemoryPtr VarPtr(sArray(nSize)), VarPtr(nPtr), Len(nPtr)
  End If
 
  ' Array ggf. autom. um 1 Element verkleinern
  If IsMissing(bRedimSize) Then bRedimSize = True
  If bRedimSize Then
    nSize = nSize - 1
    If nSize < 0 Then nSize = 0
    ReDim Preserve sArray(nSize)
  Else
    sArray(nSize) = ""
  End If
End Sub

Die zweite Möglichkeit arbeitet im Gegensatz zur For...Next-Schleifenmethode um ein vielfaches schneller!

Beispiel für den Aufruf:

' Array erstellen
ReDim sArray(3) As String
sArray(0) = "Anton"
sArray(1) = "Berta"
sArray(2) = "Christa"
sArray(3) = "Dietmar"
 
' Element 1 entfernen
ArrayDelete sArray(), 1
 
' Array in ListBox ausgeben
Dim i As Long
For i = 0 To UBound(sArray)
  List1.AddItem sArray(i)
Next i



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2019 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.