Ayuda con Seleccionar Palabra por Palabra

Iniciado por RickJack, 15 Septiembre 2008, 19:36 PM

0 Miembros y 1 Visitante están viendo este tema.

RickJack

Buenos dias a toda la comunidad, hace un par de dias, que ando envuelto en una duda, lo que pasa es que estoy desarrollando algunos ejemplos, y me tope con la curiosidad de hacer un un formulario que cargue un texto en un richtextbox, y que con cada ves que precione un command1, se vaya seleccionando palabra por palabra, hasta el final.

Lo he intentado hacer con el buscador de palabras, pero no consigo nada, ya que talves mis conocimientos son escasos, , pero por lo que pude ver de esos codigos, te buscan una palabra ya predefinida y la sombrean, ahora lo de hacer que con cada click, se me seleccione la palabra siguiente.

No se si me pude explicar correctamente, en todo caso agradeceria mucho, si alguien me pudiera decir si voy por buen camino o que es lo que se deba hacer o que deba revisar.

O decirme si esto es posible o no?.



Spider-Net

#1
Yo lo he conseguido hacer, a lo mejor hay una forma más fácil pero bueno aquí te pongo el método que yo he usado:

Código (vb) [Seleccionar]

Option Explicit
Dim data As String
Dim vdata As Variant
Dim cont, i, pos As Integer

Private Sub Form_Load()
RichTextBox.HideSelection = False 'En false para que no se deseleccione al perder el foco
Call contar 'llamada a la función contar
End Sub

Private Sub Command1_Click()
If i < cont Then 
    RichTextBox.SelStart = pos 'Empezamos a seleccionar en la posicion pos
    RichTextBox.SelLength = Len(vdata(i))  'SelLength es el tamaño de vdata(i)
    pos = pos + (Len(vdata(i)) + 1)  'incrementamos selstart +1 para que no seleccione el espacio
    i = i + 1  'incrementamos i (siguiente palabra)
Else
    i = 0 'Cuando se hayan seleccionado todas las palabras volvemos a la primera
    pos=0
End If
End Sub

Function contar() 'Esta función cuenta cuantas palabras tiene el texto
Dim i As Integer
data = RichTextBox.Text  'data almacena el contenido del texbox
vdata = Split(data, " ")   'separamos data por cada espacio que tenga

For i = 1 To Len(data)      'desde el primer caracter hasta el último
    If Mid(data, i, 1) = " " Then   ' si el caracter es un espacio sumamos 1 a cont
        cont = cont + 1
    End If
Next i
cont = cont + 1    ' Al final no hay espacio así que para que seleccione la última palabra sumamos uno al final del proceso
End Function


Seguramente se pueda simplificar pero bueno a lo mejor te sirve como idea ;)

PD: Si no entiendes alguna parte del código puedes preguntarme y te lo explicaré sin problemas.

Saludos!

RickJack

#2
Muchas gracias por la ayuda, fue muy generoso de tu parte exporer parte de la solucion, era presiamente la idea, esto me ayudara de mucho, le estoy adicionando una barra de procesos, de tal forma que cuando haga cada click, la barra vaya creciendo conforme recorre cada letra.

Lo que si quisiera saber es algo, el metodo para seleccionar una palabra puede ser aplicado a cualquier control que pueda contener un texto, es decir a un label, text, etc.


Tu solucion para el conteo de palabras es bastante practica ya que habia encontrado este otro metodo, no se si sea el mismo, pero aca va.


================================================
Function ContarPalabras(ByVal Texto As String) As Long
Dim EnPalabra As Boolean, NumPalabras As Long, i As Long, j As Long
Dim Letra As String * 1
'si me falta alguno no hay más que añadirlo a la constante
Const Separadores As String = " ºª\!|""@·#$%&¬/()=?'¡¿^`[]*+¨´{}<>,;.:-_" & vbCrLf

'eliminar los espacios por delante y por detrás, aunque en realidad no le
'"molestan" a la función
Texto = Trim(Texto)
For i = 1 To Len(Texto)
     Letra = Mid(Texto, i, 1)
     'si es una letra y no estaba recorriendo una palabra es que es una nueva palabra
     If InStr(Separadores, Letra) = 0 Then
         If Not EnPalabra Then
             EnPalabra = True
             NumPalabras = NumPalabras + 1
         End If
     Else
         EnPalabra = False
     End If
Next i
ContarPalabras = NumPalabras
End Function
=====================================================

lo que se me hacia un mundo era como hacer el corrido de letras.

en cuanto incorpore la barra de procesos, lo pondre.

Nuevamente Gracias.

Spider-Net

#3
El método que tú pones para contar palabras y el que yo he usado en realidad son parecidos, yo para recorrer todo el texto lo único que hago es un For.

Código (vb) [Seleccionar]
For i=1 To Len(RichTextBox.Text) 'Len(RichTextBox.Text) devuelve el número de caracteres que contiene el RichTextBox
       If Mid(RichTextbox.Text, i, 1) = " " Then
            cont = cont + 1
       End If
Next i


Es sencillo porque con la función Len saco el número de caracteres total del TextBox, luego digo que lo recorra desde el caracter 1 hasta el número total de caracteres.

Luego la función Mid funciona así: Mid(RichTexBox.Text, i, 1)
Es algo así: coge el caracter de la posición i de RichTexBox.Text tomado de 1 en 1.

Así recorres cada caracter y compruebas si el caracter es un espacio, como el espacio siempre separa las palabras, cada espacio que encuentras sumas 1 ya que es una palabra más. Y como tras la última palabra no hay espacio pues al final del proceso le sumo uno más.

Lo de vdata(i) es en realidad un array separado por la función, Split un ejemplo sería:

Dim data as String
Dim vdata as Variant

data="hola|adios|bien|mal"
vdata=Split(data, "|")

La función Split lo que hace es dividir a partir del caracter o caracteres que pongas en la función, es algo así como: Separa lo que hay en data a partir del caracter "|"

Entonces esto daría:

vdata(0) = "hola"
vdata(1) = "adios"
vdata(2) = "bien"
vdata(3) = "mal"

Pues yo he hecho lo mismo pero usando como separador los espacios. Así obtuve cada palabra separada.

Y a la pregunta de si se puede usar este método para otros controles, la respuesta es sí. En labels, en textox, en listbox, en listviews... etc.

Espero haberte aclarado un poco, si no entiendes algo, sólo tienes que preguntarlo.
Saludos!

RickJack

#4
Como dije, la solucion es bastante practica a diferencia de lo que tenia, gracias por la ayuda, no sabia en realidad cual era el mecanisno de la funcion.

Bueno, esta seria la solucion para la barra de procesos, al parecer con esto estaria por concluida esta interrogante, muchas gracias amigo Spider-Net.


Esto para el incremento de la barra de procesos.
Código (vb) [Seleccionar]


'Le establecemos un valor para el máximo
ProgressBar1.Max = cont

    For t = 0 To i
   
        ' Valor actual del Progressbar
        ProgressBar1.Value = t
       
        ' Visualizamos el porcentaje en el Label
        Label2 = CLng((ProgressBar1.Value * 100) / ProgressBar1.Max) & " %"
       
       
        DoEvents

    Next




Bueno nuevamente Gracias por todo.



Spider-Net

#5
Me alegro que te haya servido de ayuda y hayas aprendido algo nuevo. Ahora a seguir aprendiendo y programando. Y cuando tengas alguna duda ya sabes donde estamos.

Mira como hice yo lo de la barra de progreso, a ver que te parece, es un poco mas corto:

Código (vb) [Seleccionar]
Option Explicit
Dim data As String
Dim vdata As Variant
Dim cont, i, pos As Integer

Private Sub Form_Load()
RichTextBox.HideSelection = False 'En false para que no se deseleccione al perder el foco
Call contar 'llamada a la función contar
End Sub

Private Sub Command1_Click()
ProgressBar1.Max = Len(data)
If pos < ProgressBar1.Max Then
    ProgressBar1.Value = pos
Else
    ProgressBar1.Value = ProgressBar1.Max
End If
If i < cont Then
    RichTextBox.SelStart = pos 'Empezamos a seleccionar en la posicion pos
    RichTextBox.SelLength = Len(vdata(i))  'SelLength es el tamaño de vdata(i)
    pos = pos + (Len(vdata(i)) + 1)  'incrementamos selstart +1 para que no seleccione el espacio
    i = i + 1  'incrementamos i (siguiente palabra)
Else
    i = 0 'Cuando se hayan seleccionado todas las palabras volvemos a la primera
    pos = 0
End If
End Sub

Function contar() 'Esta función cuenta cuantas palabras tiene el texto
Dim i As Integer
data = RichTextBox.Text  'data almacena el contenido del texbox
vdata = Split(data, " ")   'separamos data por cada espacio que tenga

For i = 1 To Len(data)      'desde el primer caracter hasta el último
    If Mid(data, i, 1) = " " Then   ' si el caracter es un espacio sumamos 1 a cont
        cont = cont + 1
    End If
Next i
cont = cont + 1    ' Al final no hay espacio así que para que seleccione la última palabra sumamos uno al final del proceso
End Function


Solo he añadido esto:

Código (vb) [Seleccionar]
ProgressBar1.Max = Len(data) 'El valor máximo es el total de caracteres
If pos < ProgressBar1.Max Then
    ProgressBar1.Value = pos 'El valor es igual al número de caracter por el que va
Else
    ProgressBar1.Value = ProgressBar1.Max 'Si se pasa del límite ProgressBar1.Value es igual al máximo y ya está
End If


Lo que pasa es que mi método hace que la ProgressBar progrese un poco más de golpe que la tuya, pero bueno, igual funciona.

Saludos!

RickJack

Tienes razon, es algo rapido, pero no deja de ser una alternativa a tomar en cuenta, creo que reduciendo algo mas quedaria asi:

Código (vb) [Seleccionar]


ProgressBar1.Max = cont
For t = 0 To i : ProgressBar1.Value = t: Next



Bueno amigo muchas gracias.

Eso si amigo, todo esto me ha inspirado mucho, voy a seguir tus consejos, ya empece a buscar esos apuntes que me mencionaste.










"Se que no podre aprender todo en esta vida pero me esforzare por aprender lo mas que se pueda y asi poder crear un nuevo conocimiento".
RickJack