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

https://www.vbarchiv.net
Rubrik: Variablen/Strings · Arrays   |   VB-Versionen: VB4, VB5, VB622.01.04
Element in String-Array einfügen

Zwei Möglichkeiten ein neues Element in ein Array einzureihen: eine langsame und eine sehr schnelle Methode :-)

Autor:   Dieter OtterBewertung:  Views:  35.850 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein Beispielprojekt 

Wenn man mit String-Arrays arbeitet kommt es hin und wieder vor, dass man ein neues Element an eine bestimmte Position innerhalb des Arrays einfügen muss, d.h.: alle Einträge ab Position x müssen nach "hinten" verschoben werden.

Mit normalen VB-Boardmitteln würde man das wie folgt realisieren:

Public Sub ArrayInsert(ByRef sArray() As String, _
  ByVal nInsPos As Long, _
  Optional ByVal sValue As String = "", _
  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)
 
  ' Array ggf. autom. um 1 Element vergrößern
  If IsMissing(bRedimSize) Then bRedimSize = True
  If bRedimSize Then
    nSize = nSize + 1
    ReDim Preserve sArray(nSize)
  End If
 
  If nInsPos < nSize Then
    ' neues Element an Position "nInsPos" einfügen
    For i = nSize To nInsPos + 1 Step -1
      sArray(i) = sArray(i - 1)
    Next i
    sArray(nInsPos) = sValue
 
  ElseIf nInsPos = nSize Then
    ' neues Element hinten anfügen
    sArray(nSize) = sValue
  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 man neue Elemente ziemlich weit vorne im Array einfügt.

Deshalb möchten wir Ihnen noch eine zweite Möglichkeit aufzeigen. 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 ArrayInsert(ByRef sArray() As String, _
  ByVal nInsPos As Long, _
  Optional ByVal sValue As String = "", _
  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)
 
  ' Array ggf. autom. um 1 Element vergrößern
  If IsMissing(bRedimSize) Then bRedimSize = True
  If bRedimSize Then
    nSize = nSize + 1
    ReDim Preserve sArray(nSize)
  End If
 
  If nInsPos < nSize Then
    ' neues Element an Position "nInsPos" einfügen
    nPtr = StrPtr(sArray(nSize))
    CopyMemoryPtr VarPtr(sArray(nInsPos + 1)), VarPtr(sArray(nInsPos)), _
      VarPtr(sArray(nSize)) - VarPtr(sArray(nInsPos))
    CopyMemoryPtr VarPtr(sArray(nInsPos)), VarPtr(nPtr), Len(nPtr)
    sArray(nInsPos) = sValue
 
  ElseIf nInsPos = nSize Then
    ' neues Element hinten anfügen
    sArray(nSize) = sValue
  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(2) As String
sArray(0) = "Anton"
sArray(1) = "Christa"
sArray(2) = "Dietmar"
 
' Neues Element an Position 1 einfügen
ArrayInsert sArray(), 1, "Berta"
 
' 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-2024 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.