elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [SRC] cCollectionEx.cls
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [SRC] cCollectionEx.cls  (Leído 8,546 veces)
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
[SRC] cCollectionEx.cls
« en: 20 Agosto 2010, 13:36 pm »

¿Todavía sigues usando Collections? :¬¬
¡¡Ahora lo que se lleva es cCollectionEx.cls!! :laugh:



Propiedades:

Add
Código
  1. Add(ByRef Item As Variant, Optional ByVal Index As Long)
¿A qué has adivinado que hace? :laugh: pero incluyo la opcion de insertarlo en un Index especifico.

Contains
Código
  1. Contains(ByRef Item As Variant, Optional ByVal StartIndex As Long = 1)
Sirve para comprbar si un Item ya esta contenido dentro de nuestra cCollectionEx, tambien puedes empezar a buscarlo desde un Index especifico.

Count

Código
  1. Count()
Devuelve la cantidad de Items almacenados.

Item
Código
  1. Item(ByVal Index As Long)
Indica el contenido de in Item en concreto a partir de su Index.

DeleteItem
Código
  1. DeleteItem(ByVal Index As Long)
Borra un Item determinado a partir de el Index ingresado.

SwapItem
Código
  1. SwapItem(ByVal ActualIndex As Long, ByVal DestinationIndex As Long)
Intercambia dos Items.

Sorted ;)
Código
  1. Sorted(Optional ByVal Order As EnuListOrder = DecendentOrder) ' by BlackZeroX
  2.  
Ordena la cCollectionEx alfanumericamente y ademas puedes indicar el orden [descendente/ascendente].

Reverse
Código
  1. Reverse()
Invierte la posicion del contenido de cCollectionEx.

Clear
Código
  1. Clear()
Borra el contenido de cCollectionEx.



Aquí la clase:
Código
  1. Option Explicit
  2. Option Base 1
  3. '=====================================================================
  4. ' º Class         : cCollectionEx.cls
  5. ' º Author        : Psyke1
  6. ' º Mail          : vbpsyke1@mixmail.com
  7. ' º Date          : 17/8/10
  8. ' º Last modified : 01/06/12
  9. ' º Purpose       : Replace and improve the vb6 Collection Object
  10. ' º Greets        : BlackZer0x & xkiz
  11. ' º Sorted by BlackZer0x :
  12. '           http://bit.ly/M5zCKw
  13. ' º Recommended Websites :
  14. '           http://foro.h-sec.org/
  15. '           http://www.frogcheat.com.ar/
  16. '           http://infrangelux.sytes.net/
  17. '=====================================================================
  18. Private Declare Sub RtlMoveMemory Lib "ntdll.dll" (ByVal pDest As Long, ByVal pSrc As Long, ByVal lBytes As Long)
  19.  
  20. Public Enum EnuListOrder
  21.    AcendetOrder = 0
  22.    DecendentOrder = 1
  23. End Enum
  24.  
  25. Private vColl()                             As Variant
  26. Private lCount                              As Long
  27. Private lLimit                              As Long
  28. Private ReverseMode                         As Boolean
  29.  
  30.  
  31. '// Inizialice the matrix.
  32. Private Sub Class_Initialize()
  33.    lLimit = &H400
  34.    ReDim vColl(lLimit)
  35. End Sub
  36.  
  37. '// It returns the number of items contained in the matrix.
  38. Public Property Get Count() As Long
  39.    Count = lCount
  40. End Property
  41.  
  42. '// It returns an specific item form there index.
  43. Public Property Get Item(ByVal Index As Long) As Variant
  44.    If ReverseMode Then FixIndex Index
  45.    Item = vColl(Index)
  46. End Property
  47.  
  48. '// It returns the index of an item if exists in the matrix.
  49. Public Function Contains(ByRef Item As Variant, Optional ByVal StartIndex As Long = 1) As Long
  50. Dim Q                                       As Long
  51.  
  52.    If (StartIndex < lCount) And (StartIndex > 0) Then
  53.        For Q = StartIndex To lCount
  54.            If vColl(Q) = Item Then
  55.                If ReverseMode Then
  56.                    Contains = lCount + 1 - Q
  57.                Else
  58.                    Contains = Q
  59.                End If
  60.  
  61.                Exit Function
  62.            End If
  63.        Next
  64.    End If
  65. End Function
  66.  
  67. '// Add a new item to the cCollection, if you specify the index so you can add in a particular position.
  68. Public Function Add(ByRef Item As Variant, Optional ByVal Index As Long) As Long
  69.    If IsObject(Item) = False Then
  70.        If ReverseMode Then FixIndex Index
  71.  
  72.        lCount = lCount + 1
  73.  
  74.        If lCount > lLimit Then
  75.           lLimit = lLimit + lLimit
  76.           ReDim Preserve vColl(lLimit)
  77.        End If
  78.  
  79.        If Index > 0 And Index <= lCount Then
  80.            RtlMoveMemory VarPtr(vColl(Index + 1)), VarPtr(vColl(Index)), (lCount - Index) * 16&
  81.            Add = Index
  82.        Else
  83.            Add = lCount
  84.        End If
  85.  
  86.        vColl(Add) = Item
  87.    End If
  88. End Function
  89.  
  90. '// Delete an specific item from its index.
  91. Public Function DeleteItem(ByVal Index As Long) As Long
  92.    If (Index > 0) And (Index <= lCount) Then
  93.        If ReverseMode Then FixIndex Index
  94.  
  95.        If (Index < lCount) Then
  96.            RtlMoveMemory VarPtr(vColl(Index)), VarPtr(vColl(Index + 1)), (lCount - Index) * 16&
  97.        End If
  98.  
  99.        If (lCount - 1) > 0 Then
  100.            lCount = lCount - 1
  101.        Else
  102.            Clear
  103.        End If
  104.  
  105.        DeleteItem = Index
  106.    End If
  107. End Function
  108.  
  109. '// Swaps the contents of two items entering its index.
  110. Public Function SwapItem(ByVal FirstIndex As Long, ByVal DestIndex As Long) As Long
  111. Dim vSwap                                   As Variant
  112.  
  113.    If (FirstIndex <= lCount And FirstIndex > 0) And (DestIndex <= lCount And DestIndex > 0) And (FirstIndex <> DestIndex) Then
  114.        If ReverseMode Then
  115.            FixIndex FirstIndex
  116.            FixIndex DestinationIndex
  117.        End If
  118.  
  119.        vSwap = vColl(FirstIndex)
  120.        vColl(FirstIndex) = vColl(DestIndex)
  121.        vColl(DestIndex) = vSwap
  122.        SwapItem = DestIndex
  123.    End If
  124. End Function
  125.  
  126. '// Reverse all Items.
  127. Public Sub Reverse()
  128.    ReverseMode = Not ReverseMode
  129. End Sub
  130.  
  131. '// Deletes all items.
  132. Public Sub Clear()
  133.    Erase vColl
  134.    lCount = 0&
  135. End Sub
  136.  
  137. '// To simplify code, it's to reverse the index.
  138. Private Sub FixIndex(ByRef lIndex As Long)
  139.    lIndex = lCount + 1 - lIndex
  140. End Sub
  141.  
  142. '// Sort items alphanumerically and you can specify the order too [desdendent or ascendent].
  143. Public Sub Sorted(Optional ByVal Order As EnuListOrder = DecendentOrder)
  144.    If (Not (vColl)) = -1 Then Exit Sub
  145.    Call QSort(1, lCount, Order)
  146. End Sub
  147.  
  148. Private Sub QSort(ByVal lb As Long, ByVal ub As Long, Optional ByVal Order As EnuListOrder = DecendentOrder)
  149. Dim k                                As Long
  150.    If lb < ub Then
  151.        Call PreSort(lb, ub, k, Order)
  152.        Call QSort(lb, k - 1, Order)
  153.        Call QSort(k + 1, ub, Order)
  154.    End If
  155. End Sub
  156.  
  157. Private Sub PreSort(ByVal lb As Long, ByVal ub As Long, ByRef k As Long, Optional ByVal Order As EnuListOrder = DecendentOrder)
  158. Dim i                               As Long
  159. Dim j                               As Long
  160. Dim il                              As Long
  161. Dim jl                              As Long
  162.    il = 0: jl = -1
  163.    i = lb: j = ub
  164.    While i < j
  165.        If Order = DecendentOrder Then
  166.            If IsNumeric(vColl(i)) And IsNumeric(vColl(j)) Then
  167.                If Val(vColl(i)) > Val(vColl(j)) Then Call AuxOrden(i, j, il, jl)
  168.            Else
  169.                If vColl(i) > vColl(j) Then Call AuxOrden(i, j, il, jl)
  170.            End If
  171.        Else
  172.            If IsNumeric(vColl(i)) And IsNumeric(vColl(j)) Then
  173.                If Val(vColl(i)) < Val(vColl(j)) Then Call AuxOrden(i, j, il, jl)
  174.            Else
  175.                If vColl(i) < vColl(j) Then Call AuxOrden(i, j, il, jl)
  176.            End If
  177.        End If
  178.        i = i + il
  179.        j = j + jl
  180.    Wend
  181.    k = i
  182. End Sub
  183.  
  184. Private Sub AuxOrden(ByVal i As Long, ByVal j As Long, ByVal il As Long, ByVal jl As Long)
  185. Dim c                               As String
  186. Dim c2                              As Long
  187.    c = vColl(j)
  188.    vColl(j) = vColl(i)
  189.    vColl(i) = c
  190.    c2 = il
  191.    il = -jl
  192.    jl = -c2
  193. End Sub
  194.  



¿No crees que sea más rapido?  :-(

Pon esto en un form, añade la clase y compílalo:
Código
  1. Option Explicit
  2. Private Declare Function GetTickCount Lib "Kernel32" () As Long
  3.  
  4. ' Con Collection
  5. Public Function Check_Lucky_Number(ByVal lNumber As Long) As Boolean
  6.    Dim cTemp                   As New Collection
  7.    Dim NextElim                As Long
  8.    Dim m                       As Long
  9.    Dim x                       As Long
  10.  
  11.    If lNumber = 1 Or lNumber = 3 Then
  12.        GoTo IsLucky
  13.    ElseIf (lNumber > 1) And (lNumber Mod 2 <> 0) Then
  14.        With cTemp
  15.            For x = 1 To lNumber Step 2
  16.                .Add x
  17.            Next
  18.            NextElim = 3: m = 2
  19.            Do
  20.                x = NextElim
  21.                Do While x <= .Count
  22.                    .Remove (x)
  23.                    x = x + (NextElim - 1)
  24.                Loop
  25.                If .Item(.Count) = lNumber Then
  26.                    m = m + 1
  27.                    NextElim = .Item(m)
  28.                Else
  29.                    Exit Function
  30.                End If
  31.            Loop While Not NextElim > .Count
  32.        End With
  33. IsLucky: Check_Lucky_Number = True
  34.    End If
  35. End Function
  36.  
  37. ' Con cCollectionEx
  38. Public Function Check_Lucky_Number2(ByVal lNumber As Long) As Boolean
  39.    Dim cTemp                   As New cCollectionEx
  40.    Dim NextElim                As Long
  41.    Dim m                       As Long
  42.    Dim x                       As Long
  43.  
  44.    If lNumber = 1 Or lNumber = 3 Then
  45.        GoTo IsLucky
  46.    ElseIf (lNumber > 1) And (lNumber Mod 2 <> 0) Then
  47.        With cTemp
  48.            For x = 1 To lNumber Step 2
  49.                .Add x
  50.            Next
  51.            NextElim = 3: m = 2
  52.            Do
  53.                x = NextElim
  54.                Do While x <= .Count
  55.                    Call .DeleteItem(x)
  56.                    x = x + (NextElim - 1)
  57.                Loop
  58.                If .Item(.Count) = lNumber Then
  59.                    m = m + 1
  60.                    NextElim = .Item(m)
  61.                Else
  62.                    Exit Function
  63.                End If
  64.            Loop While Not NextElim > .Count
  65.        End With
  66. IsLucky: Check_Lucky_Number2 = True
  67.    End If
  68. End Function
  69.  
  70. Private Sub Form_Load()
  71.    Dim T1          As Long
  72.    Dim T2          As Long
  73.    Dim x           As Long
  74.    Dim sResult     As String
  75.  
  76.    If App.LogMode = 0 Then
  77.        MsgBox "Prueba con proyecto compilado¡!", vbCritical
  78.        End
  79.    End If
  80.  
  81.    T1 = GetTickCount
  82.    For x = 5000 To 7000
  83.        If Check_Lucky_Number(x) Then
  84.            sResult = sResult & x & " "
  85.        End If
  86.    Next
  87.    T2 = GetTickCount
  88.    MsgBox "With Collection -> " & (T2 - T1)
  89.    MsgBox sResult
  90.  
  91.    '*************************************************************************
  92.    sResult = ""
  93.    '*************************************************************************
  94.  
  95.    T1 = GetTickCount
  96.    For x = 5000 To 7000
  97.        If Check_Lucky_Number2(x) Then
  98.            sResult = sResult & x & " "
  99.        End If
  100.    Next
  101.    T2 = GetTickCount
  102.    MsgBox "With cCollectionEx -> " & (T2 - T1)
  103.  
  104.    MsgBox sResult
  105. End Sub

La diferencia suele oscilar entre los 2500/3000 ms  ::)
EDIT: He mejorado la clase, ahora será bastante mayor.

DoEvents¡! :P


« Última modificación: 5 Junio 2012, 12:58 pm por Psyke1 » En línea

Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: [SRC] cCollectionEx.cls [by *PsYkE1*]
« Respuesta #1 en: 20 Agosto 2010, 13:51 pm »

No uso VB pero reconozco que hay un curraco impresionante, es mas, yo hasta la pondria como funcion oficial...

Saludos


En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] cCollectionEx.cls [by *PsYkE1*]
« Respuesta #2 en: 20 Agosto 2010, 13:55 pm »

Guau!  :D
Muchas gracias Debci!  ;)

DoEvents¡! :P
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [SRC] cCollectionEx.cls [by *PsYkE1*]
« Respuesta #3 en: 20 Agosto 2010, 14:01 pm »

.
Ojo no acepta Objetos (Form, UC, C, Class, etc...), te falto agregar el isobject en el Swapitem entre otros!¡.

Dulces Lunas!¡.
« Última modificación: 20 Agosto 2010, 19:30 pm por BlackZeroX » En línea

The Dark Shadow is my passion.
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] cCollectionEx.cls [by *PsYkE1*]
« Respuesta #4 en: 20 Agosto 2010, 14:40 pm »

.
Ojo no acepta Objetos (Form, UC, C, Class, etc...), te falto agregar el isobject en el Swapitem entre otros!¡.

Dulces Lunas!¡.
Exacto, pero una cosa:
Porque tengo que comprobar que no sea objeto en SwapItem, si a la hora de añadir un Item no dejo que sea objeto?¿  :huh:


EDITO:
Soy tonto  :¬¬ entendi lo contrario, estoy trabajando en ello...  ;)

DoEvents¡! :P
« Última modificación: 20 Agosto 2010, 16:19 pm por *PsYkE1* » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [SRC] cCollectionEx.cls [by *PsYkE1*]
« Respuesta #5 en: 20 Agosto 2010, 19:32 pm »

.
Te falto algo asi como un Replace ITem, un AfterItem BeforItem a la hora de agregar el Item es decir que si se desea agregar el item entre X Items, o suplantar un item por uno que no exista en la coleccion!¡.

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: [SRC] cCollectionEx.cls [by *PsYkE1*]
« Respuesta #6 en: 20 Agosto 2010, 23:24 pm »

Lo vi por encima y se ve muy bien! Lo mejor es que mejoras el performance. Si tienes tiempo y si es posible, agregale algo como AddRange, para agregar otra collection a una ya existente. También un Reverse. xD no se me ocurre más nada :)

Saludos!
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] cCollectionEx.cls [by *PsYkE1*]
« Respuesta #7 en: 21 Agosto 2010, 00:20 am »

Gracias por las sugerencias, lo tendre en cuenta... ;)

DoEvents¡! :P
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] cCollectionEx.cls [by *PsYkE1*]
« Respuesta #8 en: 22 Agosto 2010, 01:26 am »

Bueno, he añadido la funcion Reverse! :)
Gracias por la sugerencia [D4N93R]! ;)

@BlackZer0x
La clase no acepta objetos, pero ¿porque dices que lo compruebe en SwapItem o en Contains si ya se que no los va ha haber, puesto que al añadirlos prescindo de los mismos?  :huh:

DoEvents¡! :P
« Última modificación: 22 Agosto 2010, 02:39 am por *PsYkE1* » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [SRC] cCollectionEx.cls [by *PsYkE1*]
« Respuesta #9 en: 22 Agosto 2010, 02:44 am »

Cuando una frase esta asi significa que se retiro lo dicho, pero esto no lo retiro ¬¬"

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines