elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  VB.NET - Contar palabras seguhn propiedad
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: VB.NET - Contar palabras seguhn propiedad  (Leído 4,350 veces)
dont'Exist

Desconectado Desconectado

Mensajes: 97


Ver Perfil
VB.NET - Contar palabras seguhn propiedad
« en: 13 Abril 2017, 21:58 pm »

Buenas tardes a todos. Otra vez recurro a su ayuda.

No encuentro cómo hacer que se cuenten palabras según su color en un RichTextBox en VB.NET. Sí puedo hacer que cuente palabras de un texto en total, pero quisiera hacer que tambien tenga la opcion de buscar palabras segun su color.

Tengo un texto a la cual aplico unos filtros de búsquedas, en algunos casos y según la búsqueda, es necesario poner el color de las fuentes en ROJO y en otros en AZUL, por ejemplo. Y estando todos marcados que sólo me diga cuantas palabars en ROJO están seleccionadas sea lo que sea que esté escrito.

Si me pueden orientar, les agradecería mucho.

Saludos!


« Última modificación: 24 Abril 2017, 17:37 pm por dont'Exist » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: VB.NET - Contar palabras según su color en RichTextBox
« Respuesta #1 en: 14 Abril 2017, 04:59 am »

Todo depende de la forma exacta en que se haga y si es algo automático o tienes control de ello. Supongamos que todo es asequible y que lo haces tú, sin requerir a librerías ajenas...

El modo más sencillo entonces es que cuando debas seleccionar las palabras que se están buscando según el filtro (etc...), las añadas a una colección explícita (quien dice una colección, dice una tabla hash, etc...).
A la colección colRojas, las palabras rojas y a la colección colAzules para las palabras azules, según el criterio seguido y acto seguido las coloreas sobre el texto (tal como vienes haciendo)...

Luego cuando se reclame contar las palabras, la propiedad Count de la colección te devuelve el total.
Luego también, si se reclama una búsqueda sobre esa selección, ahora puedes buscar en la colección las palabras específicas que se seleccionaron (en vez de hacerlo de nuevo cada vez sobre el texto).

Y por supuesto, cuando cambie el criterio de selección se debe destruir el contenido de las colecciones y crearlas de nuevo, exactamente igual que las palabras se volverían a colorear de la forma esperada...

p.d.: Si además de buscarla en la colección, tienes también que remarcarla en el texto, guarda también la posición de la palabra en el texto en la propia colección.


En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: VB.NET - Contar palabras según su color en RichTextBox
« Respuesta #2 en: 14 Abril 2017, 10:38 am »

Podrías hacer un array a partir de las palabras que hay en el texto. Luego una función o procedimiento que busque cada palabra en le texto y obtienes la propiedad de color que tiene una palabra y un contador para coda color vaya sumando las palabras que tienen x color.

Algo así:

Código
  1. Dim array() As String = RichTextBox1.Text.Split(" "c)
  2.     For Each palabra As String In array
  3.            RichTextBox1.Find(palabra, RichTextBoxFinds.MatchCase) '//Busca la palabra y la selecciona
  4.            Select Case RichTextBox1.SelectionColor.Name
  5.                Case "Black" : negro += 1
  6.                Case "Red" : rojo += 1
  7.            End Select
  8.        Next
  9.  


Ejemplo de uso:

Código
  1.      Dim rojo = 0, negro As Integer = 0
  2.        With RichTextBox1
  3.            .Text = "Esto es una frase de prueba, esto no se más que poner"
  4.            .Find("Esto")
  5.            .SelectionColor = Color.Red
  6.            .Find("una")
  7.            .SelectionColor = Color.Red
  8.  
  9.            Dim array() As String = .Text.Split(" "c)
  10.            For Each palabra As String In array
  11.                .Find(palabra, RichTextBoxFinds.MatchCase) '//Busca la palabra y la selecciona
  12.                Select Case .SelectionColor.Name
  13.                    Case "Black" : negro += 1
  14.                    Case "Red" : rojo += 1
  15.                End Select
  16.            Next
  17.            MessageBox.Show(String.Format("negro: {1}{0}rojo: {2}", Environment.NewLine, negro, rojo))
  18.  
  19.            '//Deselecciona y coloca el cursor al principio del texto
  20.            .DeselectAll()
  21.            .SelectionStart = 0
  22.        End With
  23.  


Puedes desarrollar a partir de ahí. Si no se adapta a lo que necesitas porque hay palabras que no desees que cuente, palabras repetidas, yo que se lo que sea, pues modificas lo que tu consideres. Es sólo una idea, no tengo ninguna función ni snippet en plan "expert"  para estas cosas...


En un principio use RichTextBoxFinds.WholeWord en lugar de  RichTextBoxFinds.MatchCase, pero tras colgar el ejemplo decidí probar añadir más palabras como 'Esto' y 'esto' 'es' a ver si contaba todos los 'es', que serían 3 en este caso. Solo debe buscar las palabras completas, así que cambié a RichTextBoxFinds.MatchCase



También puedes poner el cas así:
Código
  1.  
  2. Case Color.Black.Name : negro += 1
  3. Case Color.Red.Name : rojo += 1
  4. Case Color.Blue.Name : azul += 1
  5.  



Código
  1.  
  2. Dim rojo = 0, negro = 0, azul As Integer = 0
  3.        With RichTextBox1
  4.            .Text = "Esto es una frase de prueba, esto no se más que poner"
  5.            .Find("Esto")
  6.            .SelectionColor = Color.Red
  7.            .Find("una")
  8.            .SelectionColor = Color.Red
  9.            .Find("prueba")
  10.            .SelectionColor = Color.Blue
  11.            Dim array() As String = .Text.Split(" "c)
  12.            For Each palabra As String In array
  13.                .Find(palabra, RichTextBoxFinds.MatchCase) '//Busca la palabra y la selecciona
  14.                Select Case .SelectionColor.Name
  15.                    Case Color.Black.Name : negro += 1
  16.                    Case Color.Red.Name : rojo += 1
  17.                    Case Color.Blue.Name : azul += 1
  18.                End Select
  19.            Next
  20.            MessageBox.Show(String.Format("negro: {1}{0}rojo: {2}{0}azul: {3}", Environment.NewLine, negro, rojo, azul))
  21.  
  22.            '//Deselecciona y coloca el cursor al principio del texto
  23.            .DeselectAll()
  24.            .SelectionStart = 0
  25.        End With
  26.  MessageBox.Show(String.Join(vbCrLf, array))
  27.  

Si te fijas azul devuelve 0, porque  cuenta "prueba," como una palabra y como solo hay el texto "prueba" (sin la coma) en azul no lo cuenta.

array
Código:
  
  Esto
  es
  una
  frase
  de
  prueba,
  esto
  no
  se
  más
  que
  poner



Esto es algo que hay que pulir, como digo es un ejemplo.



Una solución que he encontrado es quitar la coma que pueda haber en 'palabra'

Código
  1.  
  2. RichTextBox1.Find(palabra.Replace(",", ""), RichTextBoxFinds.MatchCase) '//Busca la palabra y la selecciona

Ahora sí ya contaría correctamente
Código
  1.        Dim rojo = 0, negro = 0, azul As Integer = 0
  2.        With RichTextBox1
  3.            .Text = "Esto es una frase de prueba, esto no se más que poner"
  4.            .Find("Esto")
  5.            .SelectionColor = Color.Red
  6.            .Find("una")
  7.            .SelectionColor = Color.Red
  8.            .Find("prueba")
  9.            .SelectionColor = Color.Blue
  10.  
  11.            Dim array() As String = .Text.Split(" "c)
  12.            For Each palabra As String In array
  13.                .Find(palabra.Replace(",", ""), RichTextBoxFinds.MatchCase) '//Busca la palabra y la selecciona
  14.                Select Case .SelectionColor.Name
  15.                    Case Color.Black.Name : negro += 1
  16.                    Case Color.Red.Name : rojo += 1
  17.                    Case Color.Blue.Name : azul += 1
  18.                End Select
  19.            Next
  20.            MessageBox.Show(String.Format("negro: {1}{0}rojo: {2}{0}azul: {3}", Environment.NewLine, negro, rojo, azul))
  21.  
  22.            '//Deselecciona y coloca el cursor al principio del texto
  23.            .DeselectAll()
  24.            .SelectionStart = 0
  25.            MessageBox.Show(String.Join(vbCrLf, array))
  26.        End With


Citar
Esto es una frase de prueba, esto no se más que poner

 
Código:
  
  negro:9
   rojo: 2
   azul: 1




COMO EJEMPLO, puedes crearte por ejemplo una clase y lo modificas o lo mejoras a tu gusto

Código
  1.    Public Class CountWordsColorRichTextBox
  2.    Private Shared azul, rojo, negro As Integer
  3.    Public Shared Sub CountColorsWords(ByVal myRich As RichTextBox)
  4.        With myRich
  5.            Dim array() As String = .Text.Split(" "c)
  6.            For Each palabra As String In array
  7.                .Find(palabra.Replace(",", ""), RichTextBoxFinds.MatchCase) '//Busca la palabra y la selecciona
  8.                Select Case .SelectionColor.Name
  9.                    Case Color.Black.Name : negro += 1
  10.                    Case Color.Red.Name : rojo += 1
  11.                    Case Color.Blue.Name : azul += 1
  12.                End Select
  13.            Next
  14.        End With
  15.  
  16.    End Sub
  17.    Public Shared Property GetBlueCount() As Integer
  18.        Get
  19.            Return azul
  20.        End Get
  21.        Set(ByVal value As Integer)
  22.            azul = 0
  23.        End Set
  24.    End Property
  25.  
  26.    Public Shared Property GetRedCount() As Integer
  27.        Get
  28.            Return rojo
  29.        End Get
  30.        Set(ByVal value As Integer)
  31.            rojo = 0
  32.        End Set
  33.    End Property
  34.    Public Shared Property GetBlackCount() As Integer
  35.        Get
  36.            Return negro
  37.        End Get
  38.        Set(ByVal value As Integer)
  39.            negro = 0
  40.        End Set
  41.    End Property
  42. End Class
  43.  


EJEMPLO DE USO:
Código
  1. Public Class Form1
  2.  
  3.    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
  4.  
  5.        With RichTextBox1
  6.            .Text = "Esto es una frase de prueba, esto no se más que poner"
  7.            .Find("Esto")
  8.            .SelectionColor = Color.Red
  9.            .Find("una")
  10.            .SelectionColor = Color.Red
  11.            .Find("prueba")
  12.            .SelectionColor = Color.Blue
  13.        End With
  14.  
  15.        CountWordsColorRichTextBox.CountColorsWords(RichTextBox1)
  16.        MsgBox("negro: " & CountWordsColorRichTextBox.GetBlackCount)
  17.        MsgBox("rojo: " & CountWordsColorRichTextBox.GetRedCount)
  18.        MsgBox("azul: " & CountWordsColorRichTextBox.GetBlueCount)
  19.    End Sub
  20. End Class
  21.  
  22. Public Class CountWordsColorRichTextBox
  23.    Private Shared azul, rojo, negro As Integer
  24.    Public Shared Sub CountColorsWords(ByVal myRich As RichTextBox)
  25.        With myRich
  26.            Dim array() As String = .Text.Split(" "c)
  27.            For Each palabra As String In array
  28.                .Find(palabra.Replace(",", ""), RichTextBoxFinds.MatchCase) '//Busca la palabra y la selecciona
  29.                Select Case .SelectionColor.Name
  30.                    Case Color.Black.Name : negro += 1
  31.                    Case Color.Red.Name : rojo += 1
  32.                    Case Color.Blue.Name : azul += 1
  33.                End Select
  34.            Next
  35.        End With
  36.  
  37.    End Sub
  38.    Public Shared Property GetBlueCount() As Integer
  39.        Get
  40.            Return azul
  41.        End Get
  42.        Set(ByVal value As Integer)
  43.            azul = 0
  44.        End Set
  45.    End Property
  46.  
  47.    Public Shared Property GetRedCount() As Integer
  48.        Get
  49.            Return rojo
  50.        End Get
  51.        Set(ByVal value As Integer)
  52.            rojo = 0
  53.        End Set
  54.    End Property
  55.    Public Shared Property GetBlackCount() As Integer
  56.        Get
  57.            Return negro
  58.        End Get
  59.        Set(ByVal value As Integer)
  60.            negro = 0
  61.        End Set
  62.    End Property
  63. End Class
  64.  
  65.  

Maneras de hacerlo abran unas cuantas. Ignoro si RitcthTExtBox tendrá algún método o algo para contar palabras que reúna alguna  propiedad, se me ocurre que igual se podría usar LINQ por ejemplo, pero de eso ya se encargará otro jaja.
« Última modificación: 14 Abril 2017, 14:09 pm por okik » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Código contar palabras?
Scripting
.;. 1 6,333 Último mensaje 19 Enero 2009, 22:17 pm
por AlbertoBSD
Ayuda programa en C contar palabras
Programación C/C++
joseh94 2 3,543 Último mensaje 12 Enero 2015, 18:46 pm
por ivancea96
Contar palabras batch
Scripting
alberto3_3 1 3,981 Último mensaje 11 Agosto 2015, 07:01 am
por santizuche
Contar y comparar palabras en lenguaje c
Programación C/C++
martha71404 6 11,787 Último mensaje 29 Octubre 2015, 02:36 am
por martha71404
Contar palabras en C
Programación C/C++
andie13 2 11,804 Último mensaje 13 Noviembre 2016, 03:23 am
por Konlex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines