Rubrik: Variablen/Strings · Arrays | VB-Versionen: VB4, VB5, VB6 | 22.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 Otter | Bewertung: | Views: 35.850 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein 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