Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: extreme69 en 11 Mayo 2012, 09:14 am



Título: Borrar última línea de un textbox
Publicado por: extreme69 en 11 Mayo 2012, 09:14 am
Alguien me dice como se hace esto en VB6:

http://foro.elhacker.net/empty-t335521.0.html

Tengo el número de linea que quiero borrar, ¿como la borro?


Título: Re: Borrar última línea de un textbox
Publicado por: extreme69 en 11 Mayo 2012, 09:16 am
Ta, olvidense, lo hago con un listbox y a la ***** :P


Título: Re: Borrar última línea de un textbox
Publicado por: 79137913 en 11 Mayo 2012, 13:31 pm
HOLA!!!

Código
  1. Private sub DeleteLine (XLine as long, TXT as TextBox)
  2. Dim Aux() as string
  3. Aux = Split(TXT.Text, VbNewLine)
  4. Txt.text=Vbnullstring
  5. For X = 0 to ubound(aux)
  6.    if X <> XLine then txt.text = txt.text & Aux(x) & VbNewLine
  7. Next
  8. End Sub

(no lo testee pero debe funcinar)

GRACIAS POR LEER!!!


Título: Re: Borrar última línea de un textbox
Publicado por: Saberuneko en 11 Mayo 2012, 14:06 pm
Ta, olvidense, lo hago con un listbox y a la ***** :P

Así lo arreglé yo en su momento :3


Título: Re: Borrar última línea de un textbox
Publicado por: Deeo Raiser en 11 Mayo 2012, 18:35 pm
Hola extreme69, como estas ?

Aca tengo tu solución testeada  ;D, estuve mirando el codigo de 79137913 y no me funciono   :-(, así que le hice unas modificaciones y te agrego 2 funciones para poder contar las lineas de los TextBox o algún String


ELIMINAR UNA LINEA POR SU NUMERO
Código
  1.    Dim Lineas() As String 'Auxiliar donde se guardan las lineas
  2.    Dim I  As Long 'Variable del contador
  3.  
  4.    Lineas = Split(Texto.Text, vbNewLine)
  5.  
  6.    'Borro el contenido de Texto
  7.    Texto.Text = vbNullString
  8.  
  9.    For I = 0 To UBound(Lineas)
  10.        If I <> NumeroLinea Then
  11.            'Si la linea es distinta a la que quiero eliminar la agrego, sino la omito
  12.            Texto.Text = Texto.Text & Lineas(I) & vbCrLf
  13.        End If
  14.    Next
  15.    Borrar_Linea = Texto.Text
  16.  

CONTAR LINEAS EN UN STRING [FORMA ABSURDA]
Código
  1. Private Function Contar_Lineas_A_Lo_Loco(Texto As TextBox)
  2.    'HAGO UN FOR QUE RECORRA TODOS LOS CARACTERES DEL TEXTO
  3.    For I = 0 To Len(Texto.Text)
  4.        'SI EL CARACTER LEIDO ES UN SALTO DE LINEA CON RETORNO DE CARRO, CUENTO UNA LINEA.
  5.        If Mid(Texto.Text, I, 1) = vbCrLf Then
  6.            Contar_Lineas = Contar_Lineas + 1
  7.        End If
  8.    Next
  9. End Function
  10.  


CONTAR LINEAS EN UN STRING [FORMA GROSA]
Código
  1. Private Function Contar_Lineas_A_Lo_Pro(Texto As TextBox) As Long
  2.    Dim Lineas() As String 'Auxiliar donde se guarda los saltos de linea
  3.    'Corto el texto por los saltos de linea....
  4.    Lineas = Split(Texto.Text, vbNewLine)
  5.    'Y luego cuento la dimencion de la matriz
  6.    Contar_Lineas_A_Lo_Pro = UBound(Lineas)
  7. End Function
  8.  



Bueno, eso es todo, espero que te sea de utilidad.
Saludos


Título: Re: Borrar última línea de un textbox
Publicado por: 79137913 en 11 Mayo 2012, 20:13 pm
HOLA!!!

...

Mi codigo funciona el problema es que no le puse el End Sub al final por eso no te andaba.

En tu codigo la unica diferencia es que expandiste mi if.

Aparte...

Tu codigo para contar lineas es erroneo, aca abajo lo corregí.

Código
  1. Private Function XLines(TXT As TextBox) As Long
  2.    XLineas = UBound(Split(TXT.Text, vbNewLine))+1
  3. End Function

Primero, mucho codigo sin sentido ahi arriba lo optimice al maximo.

Aparte como el array empieza de 0 siempre tu codigo va a contar una linea menos por eso el +1.

Igual me agrada que haya alguien que se anime a postear codigo, falta gente asi en este subforo.

GRACIAS POR LEER!!!


Título: Re: Borrar última línea de un textbox
Publicado por: Deeo Raiser en 11 Mayo 2012, 21:06 pm
Primero, mucho codigo sin sentido ahi arriba lo optimice al máximo.

La idea es que el código sea fácil y rápidamente legible, en cuanto a "mucho codigo sin sentido", no lo comprendo, el cogido esta y cumple una función, en poner un if en una sola linea no se optimiza nada, mas que ahorrar renglones.
En cuanto a tu código, no solo le falto en End Sub, declaraste un procedimiento y le pasaste parámetros en ves de declarar una función, tampoco devuelve ningún valor, ademas faltan declarar variables. La idea estaba y funcionaba, pero el código estaba incompleto.


Tu codigo para contar lineas es erroneo, aca abajo lo corregí.
Aparte como el array empieza de 0 siempre tu codigo va a contar una linea menos por eso el +1.

Eso es correcto, no lo tuve en cuenta-

Igual me agrada que haya alguien que se anime a postear codigo, falta gente asi en este subforo.

De este foro aprendí mucho y quiero (aunque sean pequeñeces) devolver algo.

Saludos y Gracias Por leer. !!!




Título: Re: Borrar última línea de un textbox
Publicado por: raul338 en 11 Mayo 2012, 21:29 pm
La idea es que el código sea fácil y rápidamente legible, en cuanto a "mucho codigo sin sentido", no lo comprendo, el cogido esta y cumple una función, en poner un if en una sola linea no se optimiza nada, mas que ahorrar renglones.
Eso es subjetivo, aunque depende que tanto lleves programando y ya te acostumbres a expresiones amontonadas :P

Citar
En cuanto a tu código, no solo le falto en End Sub, declaraste un procedimiento y le pasaste parámetros en ves de declarar una función, tampoco devuelve ningún valor, ademas faltan declarar variables. La idea estaba y funcionaba, pero el código estaba incompleto.
Ni idea como estaba el código antes de la edición, pero tampoco hace falta que sea una función, con una simple llamada y ya. No falta ninguna variable

Ademas de que tu código no pusiste la firma de la función :P y sin eso esta linea
Código:
Borrar_Linea = Texto.Text
Esta al pedo :P (y NumeroLinea sin declarar :P)

Ya si quiere mucha performance (a.k.a Editor de codigo o editor (casi procesador) de texto) puede utilizar el Split que gano en los retos y la clase para Concatenar de manera rápida :P


Título: Re: Borrar última línea de un textbox
Publicado por: burbu_1 en 11 Mayo 2012, 22:06 pm
CONTAR LINEAS EN UN STRING [FORMA ABSURDA]
Código
  1. Private Function Contar_Lineas_A_Lo_Loco(Texto As TextBox)
  2.    'HAGO UN FOR QUE RECORRA TODOS LOS CARACTERES DEL TEXTO
  3.    For I = 0 To Len(Texto.Text)
  4.        'SI EL CARACTER LEIDO ES UN SALTO DE LINEA CON RETORNO DE CARRO, CUENTO UNA LINEA.
  5.        If Mid(Texto.Text, I, 1) = vbCrLf Then
  6.            Contar_Lineas = Contar_Lineas + 1
  7.        End If
  8.    Next
  9. End Function
  10.  

la forma no me parece tan absurda, pero tiene algún error  :P

1º En el mid empiezas a contar desde el caracter 0 y debería ser desde el 1, si no te tira error

2º Como tú mismo explicas, buscas 1 salto de linea y 1 retorno de carro.... eso son dos caracteres

3º como te pasó con el código pro, empiezas contando por 0 y no por 1
Código
  1. Private Function Contar_Lineas_A_Lo_Loco(Texto As TextBox)
  2.    Contar_Lineas =  1
  3.    'HAGO UN FOR QUE RECORRA TODOS LOS CARACTERES DEL TEXTO
  4.    For I = 1 To Len(Texto.Text)
  5.        'SI EL CARACTER LEIDO ES UN SALTO DE LINEA CON RETORNO DE CARRO, CUENTO UNA LINEA.
  6.        If Mid(Texto.Text, I, 2) = vbCrLf Then
  7.            Contar_Lineas = Contar_Lineas + 1
  8.        End If
  9.    Next
  10. End Function
  11.  


Por último en ambos códigos añadís al final del texto original una nueva linea... y si llamas varias veces a la función se van a ir acumulando....
Código
  1. texto.text = left( texto.text,  len(texto.text)-2 )


Saludos.


Título: Re: Borrar última línea de un textbox
Publicado por: 79137913 en 11 Mayo 2012, 23:09 pm
HOLA!!!

La idea es que el código sea fácil y rápidamente legible, en cuanto a "mucho codigo sin sentido", no lo comprendo, el cogido esta y cumple una función, en poner un if en una sola linea no se optimiza nada, mas que ahorrar renglones.
En cuanto a tu código, no solo le falto en End Sub, declaraste un procedimiento y le pasaste parámetros en ves de declarar una función, tampoco devuelve ningún valor, ademas faltan declarar variables. La idea estaba y funcionaba, pero el código estaba incompleto.

Empiezo enumerar...

Codigo sin sentido por que:
Código
  1.    Dim Lineas() As String 'Auxiliar donde se guardan las lineas
  2.    Dim I  As Long 'Correcto
  3.  
  4.    Lineas = Split(Texto.Text, vbNewLine)
  5.  
  6.    'Borro el contenido de Texto
  7.    Texto.Text = vbNullString
  8.  
  9.    For I = 0 To UBound(Lineas)
  10.        If I <> NumeroLinea Then
  11.            'usas 3 renglones cuando se deberia usar uno ya que solo se hace una llamada
  12.            Texto.Text = Texto.Text & Lineas(I) & vbCrLf
  13.        End If
  14.    Next
  15.    Borrar_Linea = Texto.Text ' sin sentido totalmente

y por este otro:
Código
  1. Private Function Contar_Lineas_A_Lo_Pro(Texto As TextBox) As Long
  2.    Dim Lineas() As String' gastas un array mas osea mas memoria y 3 lineas en vez de 1 como abajo
  3.    Lineas = Split(Texto.Text, vbNewLine)
  4.    'Y luego cuento la dimencion de la matriz
  5.    Contar_Lineas_A_Lo_Pro = UBound(Lineas)
  6. End Function
contra:
Código
  1. Private Function XLines(TXT As TextBox) As Long
  2.    XLineas = UBound(Split(TXT.Text, vbNewLine))+1
  3. End Function

Para elmiminar una linea no es necesario que sea una funcion, un procedimiento alcanza ya que no se debe devlver retorno alguno.

PD: Raul el codigo antes de la modificacion era asi:
Código
  1. Private sub DeleteLine (XLine as long, TXT as TextBox)
  2. Dim Aux() as string
  3. Aux = Split(TXT.Text, VbNewLine)
  4. Txt.text=Vbnullstring
  5. For X = 0 to ubound(aux)
  6.    if X <> XLine then txt.text = txt.text & Aux(x) & VbNewLine
  7. Next

GRACIAS POR LEER!!!


Título: Re: Borrar última línea de un textbox
Publicado por: extreme69 en 12 Mayo 2012, 08:53 am
¡Me encantan! son super nerds, aún ya teniendo la solución se ponen a discutir entre ustedes la mejor manera de hacerlo, adoro este foro y sus participantes  ;-)

Pero estoy a favor de un código simple, esto obviamente es parte de un código mas extenso (que a veces son muchisimas páginas de código) así que siempre es bueno mantener el código comentado, corto y simple.

Mi solución fue usar un listbox y:

Código:
'El último item del listbox
List1.ListIndex = List1.ListCount - 1

'Remueve el último item del listbox
List1.RemoveItem List1.ListIndex

Creo que más simple imposible, también agregué un if para cuando se acaban los items de la lista, sino tira error.

¡Gracias a todos! :)

PD: Lo usé para hacer un "mailer" para enviar newsletters, está basado en php y el software en VB ya que no puedo usar cronjob en un shared hosting con limite de 200 mails por hora, con esto le digo que mande 1 mail cada 30 segundos y son 120 mails por hora, y aún me queda margen para enviar mails manualmente sin caer en el limite, plus, no saturo el sitio con visitas simultaneas (es un hosting malisimo). Buena idea, ¿no? me ahorré un dedicado para un sitio que realmente no lo merece :P


Título: Re: Borrar última línea de un textbox
Publicado por: seba123neo en 12 Mayo 2012, 19:59 pm
para hacer todas estas cosas con el textbox, por ejemplo saber la cantidad de lineas, contar palabras, etc..podes usar la api SendMessage, que te ofrece un monton de funciones para poder trabajar con los textbox y manipularlos a tu antojo.

aca hay una implementacion de lo que seria borrar la linea que vos quieras con esta api.

aparte con apis es muhco mas rapido si tenes miles de lineas.

Código
  1. Option Explicit
  2.  
  3. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  4. Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
  5.  
  6. Private Const EM_SETSEL = &HB1
  7. Private Const EM_GETLINECOUNT = &HBA
  8. Private Const EM_LINEINDEX = &HBB
  9.  
  10. Private Sub BorrarLinea(ByVal pNumeroLinea As Long)
  11.    Dim vComienzo As Long, vFin As Long, vCantLineas As Long
  12.  
  13.    With Text1
  14.        vCantLineas = SendMessage(.hwnd, EM_GETLINECOUNT, 0, ByVal 0&)
  15.  
  16.        Select Case True
  17.            Case pNumeroLinea > vCantLineas - 1
  18.            Exit Sub
  19.        Case pNumeroLinea = 0 And vCantLineas = 1
  20.            vComienzo = 0
  21.            vFin = Len(.Text)
  22.        Case pNumeroLinea = vCantLineas - 1
  23.            vComienzo = SendMessage(.hwnd, EM_LINEINDEX, pNumeroLinea, ByVal 0&) - 1
  24.            vFin = Len(.Text) - vComienzo + 1
  25.        Case Else
  26.            vComienzo = SendMessage(.hwnd, EM_LINEINDEX, pNumeroLinea, ByVal 0&)
  27.            vFin = SendMessage(.hwnd, EM_LINEINDEX, pNumeroLinea + 1, ByVal 0&) - vComienzo
  28.        End Select
  29.  
  30.        .SetFocus
  31.        Call SendMessage(.hwnd, EM_SETSEL, vComienzo, ByVal vFin)
  32.  
  33.        LockWindowUpdate .hwnd
  34.        .SelStart = vComienzo
  35.        .SelLength = vFin
  36.        .SelText = vbNullString
  37.        LockWindowUpdate False
  38.    End With
  39. End Sub
  40.  
  41. Private Sub Command1_Click()
  42.    Call BorrarLinea(2) ' Borra la tercera linea del textbox
  43. End Sub

saludos.



Título: Re: Borrar última línea de un textbox
Publicado por: extreme69 en 12 Mayo 2012, 23:13 pm
para hacer todas estas cosas con el textbox, por ejemplo saber la cantidad de lineas, contar palabras, etc..podes usar la api SendMessage, que te ofrece un monton de funciones para poder trabajar con los textbox y manipularlos a tu antojo.

aca hay una implementacion de lo que seria borrar la linea que vos quieras con esta api.

aparte con apis es muhco mas rapido si tenes miles de lineas.


Está muy lindo el código, por ahí venía intentando yo, pero sin éxito, de todas formas ya está resuelto de la manera más fácil posible. Gracias.