Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Psyke1 en 21 Octubre 2011, 10:18 am



Título: [RETO] Recortar cadena.
Publicado por: Psyke1 en 21 Octubre 2011, 10:18 am
Código
  1. Public Function DeleteString(ByVal sString As String, ByVal PosComienzo As Long, ByVal Longitud As Long) As String

Ej:
Código:
Hola hoy estoy cansado

Código:
Call Recortar(s, 4, 4)

Código:
Hola estoy cansado

Vale todo el más rápido gana.

DoEvents! :P


Título: Re: [RETO] Recortar cadena.
Publicado por: Sanlegas en 21 Octubre 2011, 10:44 am
Código
  1. Public Function DeleteString_TV1(ByVal sString As String, ByVal PosComienzo As Long, ByVal Longitud As Long)
  2. DeleteString = Replace$(sString, Mid(sString, PosComienzo, Longitud), vbNullString)
  3. End Function

Salu2


Título: Re: [RETO] Recortar cadena.
Publicado por: 79137913 en 21 Octubre 2011, 13:49 pm
HOLA!!!

Esto es la funcion inversa a un mid :S

Aca mi codigo:
Con primera letra POS 0:
Código
  1. Public Function DeleteString7913(ByVal sString As String, ByVal PosComienzo As Long, ByVal Longitud As Long) As String
  2.    DeleteString7913 = LeftB$(sString, PosComienzo + PosComienzo) & RightB$(sString, LenB(sString) - (PosComienzo + PosComienzo + Longitud + Longitud))
  3. End Function
  4.  

GRACIAS POR LEER!!!


Título: Re: [RETO] Recortar cadena.
Publicado por: Elemental Code en 21 Octubre 2011, 16:27 pm
a = PosComienzo + PosComienzo

a = PosComienzo *2


 :huh: :huh: :huh:


Título: Re: [RETO] Recortar cadena.
Publicado por: 79137913 en 21 Octubre 2011, 16:31 pm
HOLA!!!

@Elemental:
Sumar x valores iguales es mas rapido que multiplicar por x
;)

GRACIAS POR LEER!!!


Título: Re: [RETO] Recortar cadena.
Publicado por: BlackZeroX en 21 Octubre 2011, 17:57 pm
Se supone que el primer indice de un caracter es el 1 no el 0... respecto a la string claro...

Ej:
Hola hoy estoy cansado

Código:
Call Recortar(s, 4, 4)

Código:
Holy estoy cansado

Vale todo el más rápido gana.

Dulces Lunas!¡.


Título: Re: [RETO] Recortar cadena.
Publicado por: 79137913 en 21 Octubre 2011, 18:22 pm
HOLA!!!

Se supone que el primer indice de un caracter es el 1 no el 0... respecto a la string claro...

Ej:
Hola hoy estoy cansado

Código:
Call Recortar(s, 4, 4)

Código:
Holy estoy cansado

Vale todo el más rápido gana.

Dulces Lunas!¡.

Respetando el enunciado y ejemplos...

La primera letra es Pos = 0

GRACIAS POR LEER!!!


Título: Re: [RETO] Recortar cadena.
Publicado por: CAR3S? en 21 Octubre 2011, 18:49 pm
 ;D

Funcion -> Eliminar pedazo de cadena, con su INICIO (VARIABLE) y su fin (VARIABLE)

Código
  1. Function nico(ByVal testo As String, ByVal posini As Long, ByVal posfin As Long)
  2. final = Replace$(testo, (Mid(testo, posini, posfin)), "")
  3. MsgBox final
  4.  

Uso:

Código
  1.  
  2. sData = "-Viernes-21/10/2011"
  3.  
  4.    inicio = 1 'Desde la primera letra hasta.......
  5.    fin = Len(sData) - 10 'Contamos los caracteres y le sacamos 10, que son los unicos que quiero dejar. Si sabemos que empieza en la primera letra, y que los ultimos 10 caracteres quiero dejar, sacara todo y dejara solo los ultimos 10 XD
  6.  
  7. nico (sData), inicio, fin


offffffffffffffffffff: creo que no entendi la consigna XD, pero me di cuenta que...

Código
  1. sData = "-Viernes-21/10/2011"
  2. inicio = 1
  3. fin = Len(sData) - 10
  4. cancer = Replace(sData, Mid(sData, inicio, fin), "")
  5. MsgBox cancer


Título: Re: [RETO] Recortar cadena.
Publicado por: BlackZeroX en 21 Octubre 2011, 19:27 pm
Vale todo el más rápido gana.

 >:D

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Sub RtlMoveMemory Lib "kernel32" (ByVal pDst As Any, ByVal pSrc As Any, ByVal ByteLen As Long)
  5. Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
  6. Private Declare Sub PutMem2 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Integer)
  7. Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)
  8.  
  9. Public Function DeleteString_BZX(ByVal sString As String, ByVal lPosIni As Long, ByVal lSize As Long) As String
  10. Dim lLnb    As Long
  11. Dim lpStr   As Long
  12.  
  13.    If ((lSize Or lPosIni) And &H80000000) Then Exit Function
  14.    lLnb = LenB(sString)
  15.    if (lLnb = &H0) then exit function
  16.    lSize = (lSize + lSize)
  17.    lPosIni = (lPosIni + lPosIni)
  18.  
  19.    If (lPosIni >= lLnb) Then Exit Function
  20.    lpStr = (lPosIni + lSize)
  21.  
  22.    If (lpStr > lLnb) Then
  23.        lSize = (lLnb - lPosIni)
  24.    End If
  25.  
  26.    GetMem4 VarPtr(sString), VarPtr(lpStr)
  27.  
  28.    If (lSize > &H0) Then
  29.        lLnb = (lLnb - lSize)
  30.        If (lLnb > lPosIni) Then
  31.            RtlMoveMemory (lPosIni + lpStr), ((lPosIni + lpStr) + lSize), (lLnb - lPosIni)
  32.            'MidB$(sString, (lPosIni + 1), (lLnb - lPosIni)) = MidB$(sString, (lPosIni + lSize + 1), (lLnb - lPosIni))
  33.        End If
  34.    End If
  35.  
  36.    PutMem2 ByVal (lpStr + lLnb), &H0
  37.    PutMem4 ByVal (lpStr - &H4), lLnb
  38.    PutMem4 VarPtr(DeleteString_BZX), lpStr
  39.    PutMem4 VarPtr(sString), &H0
  40. End Function
  41.  
  42.  

Código
  1.  
  2. Private Sub Form_Load()
  3.    Debug.Print DeleteString_BZX("BlackZeroX", -1, 4), Len(DeleteString_BZX("BlackZeroX", -1, 4))
  4.    Debug.Print DeleteString_BZX("BlackZeroX", 9, 4), Len(DeleteString_BZX("BlackZeroX", 9, 4))
  5.    Debug.Print DeleteString_BZX("BlackZeroX", 0, -4), Len(DeleteString_BZX("BlackZeroX", 0, -4))
  6.    Debug.Print DeleteString_BZX("BlackZeroX", 1, 4), Len(DeleteString_BZX("BlackZeroX", 1, 4))
  7.    Debug.Print DeleteString_BZX("BlackZeroX", 0, 4), Len(DeleteString_BZX("BlackZeroX", 0, 4))
  8.    Debug.Print DeleteString_BZX("BlackZeroX", 0, 400), Len(DeleteString_BZX("BlackZeroX", 0, 400))
  9. End Sub
  10.  
  11.  

Temibles Lunas!¡.


Título: Re: [RETO] Recortar cadena.
Publicado por: Psyke1 en 23 Octubre 2011, 13:38 pm
Más tarde publico la mía.


DoEvents! :P


Título: Re: [RETO] Recortar cadena.
Publicado por: Psyke1 en 23 Octubre 2011, 15:55 pm
Vale todo el más rápido gana.
>:D

 >:D

Código
  1. Option Explicit
  2. Private Declare Sub RtlMoveMemory Lib "kernel32" (ByVal pDst As Long, ByVal pSrc As Long, ByVal ByteLen As Long)
  3. Private Declare Function SysAllocStringByteLen Lib "oleaut32.dll" (ByVal oleStr As Long, ByVal BLen As Long) As Long
  4.  
  5. Public Static Function RemoveStr_Psyke1(ByVal sText As String, ByVal lPosIni As Long, ByVal lLen As Long) As String
  6. Dim lLenB                                   As Long
  7. Dim lpString                                As Long
  8.  
  9.    lLenB = LenB(sText)
  10.    If lLenB Then
  11.        If (lPosIni Or lLen) And &H80000000 Then Exit Function
  12.  
  13.        lLen = (lLen + lLen)
  14.        lPosIni = (lPosIni + lPosIni)
  15.  
  16.        If (lPosIni + lLen) = lLenB Then lLen = lLenB
  17.  
  18.        If (lLen = lLenB) And (lPosIni = 0&) Then
  19.            RemoveStr_Psyke1 = sText
  20.            Exit Function
  21.        End If
  22.  
  23.        lpString = StrPtr(sText)
  24.  
  25.        RtlMoveMemory (lpString + lPosIni), (lpString + lPosIni + lLen), (lLenB - lPosIni + lLen)
  26.        RtlMoveMemory VarPtr(RemoveStr_Psyke1), VarPtr(SysAllocStringByteLen(lpString, lLenB - lLen)), 4&
  27.    End If
  28. End Function
  29.  
  30. Private Sub Form_Load()
  31.    MsgBox RemoveStr_Psyke1("hola amigo 123456789", 4, 6)
  32. End Sub

DoEvents! :P


Título: Re: [RETO] Recortar cadena.
Publicado por: BlackZeroX en 23 Octubre 2011, 21:35 pm
@Psyke1

Tu funcion Crashea!¡.

Código
  1.  
  2.    Debug.Print RemoveStr_Psyke1("BlackZeroX", -1, 4), Len(RemoveStr_Psyke1("BlackZeroX", -1, 4))
  3.    Debug.Print RemoveStr_Psyke1("BlackZeroX", 9, 4), Len(RemoveStr_Psyke1("BlackZeroX", 9, 4))
  4.    Debug.Print RemoveStr_Psyke1("BlackZeroX", 0, -4), Len(RemoveStr_Psyke1("BlackZeroX", 0, -4))
  5.    Debug.Print RemoveStr_Psyke1("BlackZeroX", 1, 4), Len(RemoveStr_Psyke1("BlackZeroX", 1, 4))
  6.    Debug.Print RemoveStr_Psyke1("BlackZeroX", 0, 4), Len(RemoveStr_Psyke1("BlackZeroX", 0, 4))
  7.    Debug.Print RemoveStr_Psyke1("BlackZeroX", 0, 400), Len(RemoveStr_Psyke1("BlackZeroX", 0, 400))
  8.  
  9.  

Dulces Lunas!¡.


Título: Re: [RETO] Recortar cadena.
Publicado por: Psyke1 en 23 Octubre 2011, 21:50 pm
A mí no me crashea con más de tres llamadas... :rolleyes:
Prueba a quitar el Static por si acaso...

DoEvents! :P


Título: Re: [RETO] Recortar cadena.
Publicado por: BlackZeroX en 23 Octubre 2011, 22:25 pm
A mí no me crashea con más de tres llamadas... :rolleyes:

... Nada tiene que ver static (Que por cierto static para procesos carece de la funcionalidad habitual de llamada a funcion/proceso sin instanciar la clase y por ende esta demas en una funcion miembro static para variables (http://www.zator.com/Cpp/E4_1_8c.htm) muy diferente a static para miembros de clases (http://www.zator.com/Cpp/E4_11_7.htm) y TODO esto deberia ser lo mismo para vb6, pero no es asi).

 * El unico uso que le preveo es una Generalizacion de la declaracion static para las declaraciones internas para EVITAR que se autodestruyan las variables.
 
Mira este codigo:

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Sub Form_Load()
  5.    Debug.Print holaNoStatic, holaStatic
  6.    Debug.Print holaNoStatic, holaStatic
  7.    Debug.Print holaNoStatic, holaStatic
  8.    Debug.Print holaNoStatic, holaStatic
  9.    Debug.Print holaNoStatic, holaStatic
  10.    Debug.Print holaNoStatic, holaStatic
  11.    Debug.Print holaNoStatic, holaStatic
  12.    Debug.Print holaNoStatic, holaStatic
  13. End Sub
  14.  
  15. Public Function holaNoStatic() As String
  16. Dim a As Integer
  17.    Debug.Print "[a=" & VarPtr(a) & "]",
  18.    holaNoStatic = a
  19.    a = a + 1
  20. End Function
  21.  
  22. Public Static Function holaStatic() As String
  23. Dim a As Integer
  24.    Debug.Print "[a=" & VarPtr(a) & "]"
  25.    holaStatic = a
  26.    a = a + 1
  27. End Function
  28.  
  29.  

Revisa tu funcion con las 6 pruebas que deje en el anterior post.

Dulces Lunas!¡.


Título: Re: [RETO] Recortar cadena.
Publicado por: BlackZeroX en 29 Octubre 2011, 02:22 am
Cuando se Hacen los Test?

Dulces Lunas!¡.