Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => 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 (vb) [Seleccionar]
Private sub DeleteLine (XLine as long, TXT as TextBox)
Dim Aux() as string
Aux = Split(TXT.Text, VbNewLine)
Txt.text=Vbnullstring
For X = 0 to ubound(aux)
   if X <> XLine then txt.text = txt.text & Aux(x) & VbNewLine
Next
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
Cita de: extreme69 en 11 Mayo 2012, 09:16 AM
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 (vb) [Seleccionar]

   Dim Lineas() As String 'Auxiliar donde se guardan las lineas
   Dim I  As Long 'Variable del contador
   
   Lineas = Split(Texto.Text, vbNewLine)
   
   'Borro el contenido de Texto
   Texto.Text = vbNullString
   
   For I = 0 To UBound(Lineas)
       If I <> NumeroLinea Then
           'Si la linea es distinta a la que quiero eliminar la agrego, sino la omito
           Texto.Text = Texto.Text & Lineas(I) & vbCrLf
       End If
   Next
   Borrar_Linea = Texto.Text


CONTAR LINEAS EN UN STRING [FORMA ABSURDA]
Código (vb) [Seleccionar]

Private Function Contar_Lineas_A_Lo_Loco(Texto As TextBox)
   'HAGO UN FOR QUE RECORRA TODOS LOS CARACTERES DEL TEXTO
   For I = 0 To Len(Texto.Text)
       'SI EL CARACTER LEIDO ES UN SALTO DE LINEA CON RETORNO DE CARRO, CUENTO UNA LINEA.
       If Mid(Texto.Text, I, 1) = vbCrLf Then
           Contar_Lineas = Contar_Lineas + 1
       End If
   Next
End Function



CONTAR LINEAS EN UN STRING [FORMA GROSA]
Código (vb) [Seleccionar]

Private Function Contar_Lineas_A_Lo_Pro(Texto As TextBox) As Long
   Dim Lineas() As String 'Auxiliar donde se guarda los saltos de linea
   'Corto el texto por los saltos de linea....
   Lineas = Split(Texto.Text, vbNewLine)
    'Y luego cuento la dimencion de la matriz
    Contar_Lineas_A_Lo_Pro = UBound(Lineas)
End Function




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 (vb) [Seleccionar]
Private Function XLines(TXT As TextBox) As Long
   XLineas = UBound(Split(TXT.Text, vbNewLine))+1
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
Cita de: 79137913 en 11 Mayo 2012, 20:13 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.

Cita de: 79137913 en 11 Mayo 2012, 20:13 PM

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-

Cita de: 79137913 en 11 Mayo 2012, 20:13 PM
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
Cita de: Deeo Raiser en 11 Mayo 2012, 21:06 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

CitarEn 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
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
Cita de: Deeo Raiser en 11 Mayo 2012, 18:35 PM
CONTAR LINEAS EN UN STRING [FORMA ABSURDA]
Código (vb) [Seleccionar]

Private Function Contar_Lineas_A_Lo_Loco(Texto As TextBox)
    'HAGO UN FOR QUE RECORRA TODOS LOS CARACTERES DEL TEXTO
    For I = 0 To Len(Texto.Text)
        'SI EL CARACTER LEIDO ES UN SALTO DE LINEA CON RETORNO DE CARRO, CUENTO UNA LINEA.
        If Mid(Texto.Text, I, 1) = vbCrLf Then
            Contar_Lineas = Contar_Lineas + 1
        End If
    Next
End Function


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 (vb) [Seleccionar]

Private Function Contar_Lineas_A_Lo_Loco(Texto As TextBox)
    Contar_Lineas =  1
    'HAGO UN FOR QUE RECORRA TODOS LOS CARACTERES DEL TEXTO
    For I = 1 To Len(Texto.Text)
        'SI EL CARACTER LEIDO ES UN SALTO DE LINEA CON RETORNO DE CARRO, CUENTO UNA LINEA.
        If Mid(Texto.Text, I, 2) = vbCrLf Then
            Contar_Lineas = Contar_Lineas + 1
        End If
    Next
End Function



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 (vb) [Seleccionar]

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!!!

Cita de: Deeo Raiser en 11 Mayo 2012, 21:06 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.
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 (vb) [Seleccionar]
    Dim Lineas() As String 'Auxiliar donde se guardan las lineas
    Dim I  As Long 'Correcto
   
    Lineas = Split(Texto.Text, vbNewLine)

    'Borro el contenido de Texto
    Texto.Text = vbNullString

    For I = 0 To UBound(Lineas)
        If I <> NumeroLinea Then
            'usas 3 renglones cuando se deberia usar uno ya que solo se hace una llamada
            Texto.Text = Texto.Text & Lineas(I) & vbCrLf
        End If
    Next
    Borrar_Linea = Texto.Text ' sin sentido totalmente


y por este otro:
Código (vb) [Seleccionar]
Private Function Contar_Lineas_A_Lo_Pro(Texto As TextBox) As Long
    Dim Lineas() As String' gastas un array mas osea mas memoria y 3 lineas en vez de 1 como abajo
    Lineas = Split(Texto.Text, vbNewLine)
    'Y luego cuento la dimencion de la matriz
    Contar_Lineas_A_Lo_Pro = UBound(Lineas)
End Function

contra:
Código (vb) [Seleccionar]
Private Function XLines(TXT As TextBox) As Long
    XLineas = UBound(Split(TXT.Text, vbNewLine))+1
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 (vb) [Seleccionar]
Private sub DeleteLine (XLine as long, TXT as TextBox)
Dim Aux() as string
Aux = Split(TXT.Text, VbNewLine)
Txt.text=Vbnullstring
For X = 0 to ubound(aux)
    if X <> XLine then txt.text = txt.text & Aux(x) & VbNewLine
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:

'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 (vb) [Seleccionar]
Option Explicit

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
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long

Private Const EM_SETSEL = &HB1
Private Const EM_GETLINECOUNT = &HBA
Private Const EM_LINEINDEX = &HBB

Private Sub BorrarLinea(ByVal pNumeroLinea As Long)
   Dim vComienzo As Long, vFin As Long, vCantLineas As Long
   
   With Text1
       vCantLineas = SendMessage(.hwnd, EM_GETLINECOUNT, 0, ByVal 0&)
       
       Select Case True
           Case pNumeroLinea > vCantLineas - 1
           Exit Sub
       Case pNumeroLinea = 0 And vCantLineas = 1
           vComienzo = 0
           vFin = Len(.Text)
       Case pNumeroLinea = vCantLineas - 1
           vComienzo = SendMessage(.hwnd, EM_LINEINDEX, pNumeroLinea, ByVal 0&) - 1
           vFin = Len(.Text) - vComienzo + 1
       Case Else
           vComienzo = SendMessage(.hwnd, EM_LINEINDEX, pNumeroLinea, ByVal 0&)
           vFin = SendMessage(.hwnd, EM_LINEINDEX, pNumeroLinea + 1, ByVal 0&) - vComienzo
       End Select
       
       .SetFocus
       Call SendMessage(.hwnd, EM_SETSEL, vComienzo, ByVal vFin)
       
       LockWindowUpdate .hwnd
       .SelStart = vComienzo
       .SelLength = vFin
       .SelText = vbNullString
       LockWindowUpdate False
   End With
End Sub

Private Sub Command1_Click()
   Call BorrarLinea(2) ' Borra la tercera linea del textbox
End Sub


saludos.

Título: Re: Borrar última línea de un textbox
Publicado por: extreme69 en 12 Mayo 2012, 23:13 PM
Cita de: 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.


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.