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?
Ta, olvidense, lo hago con un listbox y a la ***** :P
HOLA!!!
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!!!
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
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
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]
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]
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
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í.
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!!!
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. !!!
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
Cita de: Deeo Raiser en 11 Mayo 2012, 18:35 PM
CONTAR LINEAS EN UN STRING [FORMA ABSURDA]
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
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....
texto.text = left( texto.text, len(texto.text)-2 )
Saludos.
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:
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:
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:
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:
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!!!
¡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
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.
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.
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.