(por ejemplo) si el dato ingresado es menor al tercer elemento
copie desde el tercer al final en la posicion 4 de la matriz y en la posicion numero 3 ponga los nuevos datos. pero sin tener que recorrer un bucle, sino mas bien utilzando CopyMemory para hacelerar la funcion.
se que podria poner dos bucles y ordenarlo de la forma tradicional pero esto se haria muy lento si ablamos de 10000 elementos
pongo un ejemplo de lo que intento hacer, pero bien no estoy haciendo buen uso de CopyMemory
Código:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Type Datos
Nombre As String
Apellido As String
End Type
Dim dPersona() As Datos
Dim lCount As Long
Private Sub Command1_Click()
AddList "bbb", "bbb"
ImprimirListado
End Sub
Private Sub Form_Load()
Me.Show
ReDim dPersona(0)
AddList "aaa", "aaa"
AddList "bbb", "bbb"
AddList "ccc", "ccc"
AddList "ddd", "ddd"
AddList "fff", "fff"
ImprimirListado
End Sub
Private Sub ImprimirListado()
Dim i As Long
Cls
For i = 0 To lCount
Print dPersona(i).Nombre, dPersona(i).Apellido
Next
End Sub
Private Sub AddList(Nombre As String, Apellido As String)
Dim i As Integer
Dim Ubicado As Boolean
lCount = UBound(dPersona)
If lCount = 0 Then
dPersona(lCount).Nombre = Nombre
dPersona(lCount).Apellido = Apellido
Else
For i = 0 To lCount
If Nombre < dPersona(i).Nombre Then
'deberia copiar toda la matriz desde dPersona(i) a al siguiente dPersona(i + 1) todo el resto
'de la extructura, pero no funciona :(
CopyMemory ByVal dPersona(i + 1), ByVal dPersona(i), 8 * (lCount - i)
'luego depositaria los nuevos datos en dPersona(i)
dPersona(i).Nombre = Nombre
dPersona(i).Apellido = Apellido
Ubicado = True
Exit For
End If
Next
If Ubicado = False Then
dPersona(lCount).Nombre = Nombre
dPersona(lCount).Apellido = Apellido
End If
End If
ReDim Preserve dPersona(lCount + 1)
End Sub
si alguien sabe como solucionar esto o conoce alguna otra forma se los agradezco
Saludos