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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [Duda] - Tratamiento de dos cadenas y comparacion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Duda] - Tratamiento de dos cadenas y comparacion  (Leído 2,402 veces)
dont'Exist

Desconectado Desconectado

Mensajes: 97


Ver Perfil
[Duda] - Tratamiento de dos cadenas y comparacion
« en: 12 Abril 2017, 06:04 am »

Buenas noches a todos. Les hago una pregunta.

Tengo en un formulario un TextBox (oculto) un texto en el cual está correctamente escrito, sin errores. Y otro TextBox el cual se ve, en el cual debo intentar escribir lo que está en el TextBox oculto lo más correctamente posible.

De no estar correctamente escrito en este último, que me cuente la cantidad de errores existentes y si es posible, también marcar cuáles fueron los errores.

¿Es posible hacer esto desde VB.NET?

Vi en algunas páginas proyectos hechos donde implementan RichTextBox, y en otros casos algo relacionado con XAML, pero la verdad es que no he conseguido salir de este problema.

Espero que me puedan, al menos orientar de cómo hacerlo en el caso de que sea posible.

PD: Mi idea es intentar hacer algo parecido a lo que es el programa de mecanografía Typing Master en una de sus funciones cuando compara y muestra los errores, como para que tengan una idea de lo que intento realizar.

Muchas gracias a todos, saludos!


« Última modificación: 13 Abril 2017, 05:46 am por dont'Exist » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.348


Ver Perfil
Re: [Duda] VB.NET - Comparar dos cadenas de texto y mostrar diferencias
« Respuesta #1 en: 12 Abril 2017, 17:05 pm »

Tengo en un formulario un TextBox (oculto) un texto en el cual está correctamente escrito, sin errores. Y otro TextBox el cual se ve, en el cual debo intentar escribir lo que está en el TextBox oculto lo más correctamente posible.

De no estar correctamente escrito en este último, que me cuente la cantidad de errores existentes y si es posible, también marcar cuáles fueron los errores.
Básicamente eso es lo que hace el juego del Mastermind. Lo único que cambia es que en el mastermind, se usan bolas de colores y tu usas letras y bueno, como es un juego se da un límite máximo de intentos.
Guglea si qieres buscando código.

¿Es posible hacer esto desde VB.NET?
Qué, cómo.?????????

Vi en algunas páginas proyectos hechos donde implementan RichTextBox, y en otros casos algo relacionado con XAML, pero la verdad es que no he conseguido salir de este problema.
Se puede complicar uno la vida todo lo que quiera, pero basta con tu idea original, incluso sin siquiera ese textbox oculto, basta que esté en una variable del código.

PD: Mi idea es intentar hacer algo parecido a lo que es el programa de mecanografía Typing Master en una de sus funciones cuando compara y muestra los errores, como para que tengan una idea de lo que intento realizar.
Ahora mismo, no caigo en cual es es eprograma (hay tantos...). Pero ya te digo, que lo que quieres hacer es el típico mastermind, pero más simplificado aún.

Una idea aproximada de lo que tienes que hacer:

- Crear una propiedad que indique el tamaño (númeor de caracteres de la palabra). (esto puede ser una opción en un menú o bien con un control "slider", "scrollhorizontal", etc... siempre entre un rango mínimo y máximo (min=6, Máx=16, por ejemplo).
- Crear una función Nuevo: que genere una palabra al azar del tamaño indicado, y guardarla en un campo oculto, convertida en un array de caracteres.
- Crear una función Intento (llamada desde un botón y con un texto, que yace sobre un control de texto (textbox, es más que sufieciente, si quieres colorealo, para que sea más 'atractivo'...

--- Tu escribes en el texto, en el evento 'change' del textbox, miras si la palaba escrita tiene el largo (ni más ni menos) que se requiere y si es que sí, activas el botón para "Escrutar", si no, sigue desactivado.
--- También puedes dejar siempre activo el botón y no hacer nada en eventos del texto, y cuando se pulse el botón, miras si el texto contiene el númeor de caracteres concreto, si no es así, un mensaje al usuario de 'faltan/sobran letras'... el código del botón.

--- El botón, invoca la función Intento, pasándole el texto que contiene el control si devuelve false, pegar de nuevo el texto 'Palabra' en el textbox.
Y el código de la función lo que hará es:
Código:
Funcion Intento(byref Palabra as string) as boolean
--- Recibir un texto del mismo largo que la palabra oculta.
--- Convertirlo a un array de caracteres.
--- Iniciar un bucle, que recorra desde 0 hasta el final del array.
--- Dentro del bucle:
---------- Si Oculto(k) <> TxtUser(k) luego
---------------   TxtUser(k)= "*"
---------------    n +=1
---------- Fin si
--- fin bucle
--- Si n> 0 entonces 'implica que no todos los caracteres fueron encontrados
-------- Convertir el array txtUser que ha sido modificado, indicando con *, cada carácter donde falló, a una cadena de texto, reescribiendo el parámetro: 'Palabra' (se devuelve por referencia).
------------ El botón que recibe de vuelta False, pega entonces el parámetro en el textbox.
--- Si no
-------  Devolver: True
-------  El botón que recibe el true saca un Mensaje: enhorabuena acertaste la palabra oculta...
fin función.

p.d.: Eso sí, antes de todo tú decides si se truncan mayúsculas a inúsculas o viceversa o no... Así :  ¿MARTE=MarTE???, y por tanto obra en consecuencia.
 texto= texto.toupper ó texto= texto.ToLower, o nada si se distingue capitalización de caracteres.


« Última modificación: 12 Abril 2017, 17:13 pm por NEBIRE » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: [Duda] VB.NET - Comparar dos cadenas de texto y mostrar diferencias
« Respuesta #2 en: 12 Abril 2017, 19:49 pm »

Hola.

Si quieres algo sofisticado entonces lee sobre el algoritmo Diff y el problema LCS (Longest Common Subsequence) e implementa el algoritmo. Existen librerías Diff gratuitas para .NET por lo que no tienes que hacer practicamente nada.

Aparte, lo que pides se puede interpretar de muchas maneras y se puede implementar de infinitas formas dependiendo de las necesidades del programa, así que como no especifiques un poco más siendo breve y conciso aclarando punto por punto como debería comportarse el algoritmo ante cada situación de coincidencia o no coincidencia pues... vamos mal, jeje.

De todas formas te voy a mostrar dos ejemplos que he escrito con los que te puedas hacer una idea de como implementar un algoritmo básico de comparación de cadenas de texto. Ambos ejemplos evaluan las diferencias y usan un RichTextBox para colorear los caracteres que coinciden y los que no, pero ambos ejemplos tienen propósitos distintos para distintos escenarios... pues como ya dije hay infinitas maneras de implementar esto y depende de las necesidades del programa.





El primer ejemplo está enfocado a la evaluación por individual del caracter actual que se haya escrito en el control de edición, esto quiere decir que si modificas otro caracter no se actualizarán las diferencias/colorización del resto de caracteres en el RichTextBox.

Código
  1. Public NotInheritable Class Form1 : Inherits Form
  2.  
  3.    Private ReadOnly Property OrgText As String = "Hello World!"
  4.  
  5.    Private ReadOnly Property CurText As String
  6.        Get
  7.            If (Me.RichTextBox1 IsNot Nothing) Then
  8.                Return Me.RichTextBox1.Text
  9.            Else
  10.                Return String.Empty
  11.            End If
  12.        End Get
  13.    End Property
  14.  
  15.    Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
  16.  
  17.        Dim rtb As RichTextBox = DirectCast(sender, RichTextBox)
  18.        Dim chPos As Integer = (rtb.SelectionStart - 1)
  19.        Dim ch As Char = rtb.Text.Substring(chPos, 1)
  20.        Dim diffState As TriState
  21.  
  22.        If (chPos >= Me.OrgText.Length) Then
  23.            diffState = TriState.UseDefault
  24.  
  25.        ElseIf (Me.OrgText(chPos) = ch) Then
  26.            diffState = TriState.True
  27.  
  28.        Else
  29.            diffState = TriState.False
  30.  
  31.        End If
  32.  
  33.        ColorizeDifference(rtb, chPos, diffState)
  34.  
  35.    End Sub
  36.  
  37.    Friend Shared Sub ColorizeDifference(ByVal rtb As RichTextBox, ByVal charPos As Integer, ByVal diffState As TriState)
  38.  
  39.        Dim oldSelectionStart As Integer = rtb.SelectionStart
  40.        Dim oldSelectionLength As Integer = rtb.SelectionLength
  41.        Dim fontStyle As FontStyle = rtb.Font.Style
  42.  
  43.        rtb.SelectionStart = charPos
  44.        rtb.SelectionLength = 1
  45.  
  46.        Select Case diffState
  47.  
  48.            Case TriState.True ' El caracter coincide.
  49.                rtb.SelectionColor = Color.YellowGreen
  50.                fontStyle = fontStyle And Not FontStyle.Underline
  51.  
  52.            Case TriState.False ' El caracter no coincide.
  53.                rtb.SelectionColor = Color.IndianRed
  54.                fontStyle = fontStyle Or FontStyle.Underline
  55.  
  56.            Case TriState.UseDefault ' El índice del caracter está fuera de rango.
  57.                rtb.SelectionColor = Color.Gray
  58.                fontStyle = fontStyle Or FontStyle.Underline
  59.  
  60.        End Select
  61.  
  62.        Using font As New Font(rtb.Font, fontStyle)
  63.            rtb.SelectionFont = font
  64.        End Using
  65.  
  66.        rtb.SelectionStart = oldSelectionStart
  67.        rtb.SelectionLength = oldSelectionLength
  68.        rtb.ResumeLayout(performLayout:=True)
  69.  
  70.    End Sub
  71.  
  72. End Class



El segundo ejemplo está enfocado a la evaluación del texto entero; cada vez que se modifique el texto del RichTextBox se actualizarán las diferencias/colorización de todos los caracteres. Este es el código que he usado en la imagen que he compartido arriba.

Código
  1. Public NotInheritable Class Form1 : Inherits Form
  2.  
  3.    Private ReadOnly Property OrgText As String = "Hello World!"
  4.  
  5.    Private ReadOnly Property CurText As String
  6.        Get
  7.            If (Me.RichTextBox1 IsNot Nothing) Then
  8.                Return Me.RichTextBox1.Text
  9.            Else
  10.                Return String.Empty
  11.            End If
  12.        End Get
  13.    End Property
  14.  
  15.    Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
  16.  
  17.        Dim diffIndices As Dictionary(Of Integer, TriState) = GetDifferences(Me.OrgText, Me.CurText)
  18.        ColorizeDifferences(Me.RichTextBox1, diffIndices)
  19.  
  20.    End Sub
  21.  
  22.    Friend Shared Function GetDifferences(ByVal orgText As String, ByVal curText As String) As IDictionary(Of Integer, TriState)
  23.  
  24.        Dim orgChars As Char() = orgText.ToArray()
  25.        Dim curChars As Char() = curText.ToArray()
  26.  
  27.        Dim orgLength As Integer = orgChars.Length
  28.        Dim curLength As Integer = curChars.Length
  29.  
  30.        Dim diffIndices As New Dictionary(Of Integer, TriState)(curLength, EqualityComparer(Of Integer).Default)
  31.  
  32.        For i As Integer = 0 To (curLength - 1)
  33.  
  34.            If (i < orgLength) Then
  35.                diffIndices.Add(i, (orgChars(i) = curChars(i)))
  36.  
  37.            Else
  38.                diffIndices.Add(i, TriState.UseDefault)
  39.  
  40.            End If
  41.  
  42.        Next i
  43.  
  44.        Return diffIndices
  45.  
  46.    End Function
  47.  
  48.    Friend Shared Sub ColorizeDifferences(ByVal rtb As RichTextBox, ByVal diffIndices As IDictionary(Of Integer, TriState))
  49.  
  50.        Dim oldSelectionStart As Integer = rtb.SelectionStart
  51.        Dim oldSelectionLength As Integer = rtb.SelectionLength
  52.        Dim fontStyle As FontStyle = rtb.Font.Style
  53.  
  54.        rtb.SuspendLayout()
  55.        For Each kvp As KeyValuePair(Of Integer, TriState) In diffIndices
  56.  
  57.            rtb.SelectionStart = kvp.Key
  58.            rtb.SelectionLength = 1
  59.  
  60.            Select Case kvp.Value
  61.  
  62.                Case TriState.True ' El caracter coincide.
  63.                    rtb.SelectionColor = Color.YellowGreen
  64.                    fontStyle = fontStyle And Not FontStyle.Underline
  65.  
  66.                Case TriState.False ' El caracter no coincide.
  67.                    rtb.SelectionColor = Color.IndianRed
  68.                    fontStyle = fontStyle Or FontStyle.Underline
  69.  
  70.                Case TriState.UseDefault ' El índice del caracter está fuera de rango.
  71.                    rtb.SelectionColor = Color.Gray
  72.                    fontStyle = fontStyle Or FontStyle.Underline
  73.  
  74.            End Select
  75.  
  76.            Using font As New Font(rtb.Font, fontStyle)
  77.                rtb.SelectionFont = font
  78.            End Using
  79.  
  80.        Next
  81.        rtb.SelectionStart = oldSelectionStart
  82.        rtb.SelectionLength = oldSelectionLength
  83.        rtb.ResumeLayout(performLayout:=True)
  84.  
  85.    End Sub
  86.  
  87. End Class

¡Saludos!
« Última modificación: 12 Abril 2017, 20:35 pm por Eleкtro » En línea

dont'Exist

Desconectado Desconectado

Mensajes: 97


Ver Perfil
Re: [Duda] - Tratamiento de dos cadenas y comparacion
« Respuesta #3 en: 13 Abril 2017, 21:52 pm »

Muchas gracias a ambos. Me sirvieron de guía, ahora mismo estoy tratando de ajustarlo a lo que necesito... Aunque tambien estuve probando con RichTextbox.Find() y he obtenido resultados parecidos.

Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
tratamiento de cadenas
Programación Visual Basic
inproboj 1 1,813 Último mensaje 13 Mayo 2010, 20:26 pm
por inproboj
¿algun tuto sobre tratamiento de cadenas en masm32?
ASM
theghost_te 3 5,227 Último mensaje 19 Diciembre 2010, 16:57 pm
por Eternal Idol
comparacion de cadenas « 1 2 »
Programación C/C++
m@o_614 10 5,866 Último mensaje 19 Febrero 2012, 18:11 pm
por Sagrini
Comparación de cadenas « 1 2 »
Programación C/C++
kaostias 10 5,251 Último mensaje 24 Octubre 2013, 16:05 pm
por kaostias
[Python] Duda con comparacion de cadenas en una lectura de socket
Scripting
Príncipe_Azul 2 3,018 Último mensaje 8 Noviembre 2013, 08:39 am
por Príncipe_Azul
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines