Después de muchos meses sin haber publicado nada, tiempo durante el cual he tenido mi primer hijo, quería compartir con todos una nueva versión del programa que escribí para poder practicar vocabulario de inglés de forma sencilla.
Seguir Leyendo...El programa está escrito usando Visual Basic .NET, y aquellos que quieran entender cómo ha sido programado deberían leer (si no lo han hecho ya) el post en el que se explica la primera versión de este programa.
Las mejoras introducidas en esta nueva versión son dos principalmente. En primer lugar es posible seleccionar el archivo que contiene las traducciones de las palabras que queremos practicar, lo cual nos permitirá por ejemplo tener el vocabulario separado por temas. Además se ha introducido una opción de menú que nos permite añadir al archivo de vocabulario con el que estemos trabajando una nueva palabra y su traducción.
Ahora el aspecto que tiene programa al abrirlo es el siguiente.
Se ha añadido una barra de menús en la parte superior del formulario que nos permite acceder a las siguientes opciones:
- Configuración > Seleccionar Fichero: Nos abre un cuadro de dialogo desde el que podemos elegir el fichero que contiene las traducciones de las palabras.
- Configuración > Añadir palabra: Nos abre un formulario en el que podemos indicar una palabra en castellano y su correspondiente traducción en ingles. Dicha palabra y su traducción son añadidas al fichero de traducciones con el que estemos trabajando en ese momento (siempre y cuando no existieran ya en el mismo).
- Acerca de: Típico formulario de información con la versión del programa, los datos del autor, y la licencia a la que está sujeta el programa (GPL en este caso).
El código que se ejecuta al hacer click sobre la opción de menú "Seleccionar Fichero" es el siguiente.
Private Sub SeleccionarFicheroToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SeleccionarFicheroToolStripMenuItem.Click
Dim sw As StreamWriter
If OpenFileDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
rutaArchivo = OpenFileDialog.FileName
sw = New StreamWriter("configuracion.txt", False, System.Text.Encoding.Default)
sw.WriteLine(rutaArchivo)
sw.Close()
cbSentidoTraduccion.Enabled = False
txtRespuestaIntroducida.Enabled = False
btnNuevaPregunta.Enabled = False
lblAciertos.Text = "Cargando Diccionario ..."
BackgroundWorker.WorkerReportsProgress = True
BackgroundWorker.RunWorkerAsync()
End If
End Sub
Se utiliza la clase "OpenFileDialog" para mostrar el típico cuadro de dialogo que permite al usuario navegar por el sistema y seleccionar un fichero concreto. Al pulsar el botón OK en dicho cuadro de dialogo se copia la ruta completa del fichero seleccionado en la variable "rutaArchivo". La variable "rutaArchivo" es publica y por tanto puede ser accedida desde otros formularios, como por ejemplo el formulario que nos va a permitir añadir traducciones. También se escribe la ruta del fichero en un archivo de texto llamado "configuracion.txt". Como veremos más adelante esto nos va a permitir que la siguiente vez que ejecutemos el programa sigamos trabajando sobre el último archivo de vocabulario que hayamos seleccionado.
Dado que se ha seleccionado un nuevo archivo de vocabulario es necesario reconstruir el diccionario. Como ya se explicó en el post de la primera versión del programa, la función que crea el diccionario a partir de los contenidos del archivo de texto seleccionado se ejecuta en un segundo hilo de ejecución, utilizando para ello un componente de tipo "BackgroundWorker". La forma de iniciar la función que crea el diccionario es llamar al método "RunWorkerAsync" del componente "BackgroundWorker". Una barra de progreso, situada en la parte inferior del formulario, nos indicará cómo va evolucionando el proceso de carga del diccionario.
Para conseguir que la siguiente vez que el programa se inicie sigamos trabajando sobre el último archivo de vocabulario que hayamos seleccionado se ha modificado el evento de carga del formulario principal. Este es el código que se utiliza ahora.
Private Sub frmPrincipal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim fi As FileInfo
Dim sr As StreamReader
Me.Icon = My.Resources.Resource.book
cbSentidoTraduccion.SelectedIndex = 0
fi = New FileInfo("configuracion.txt")
If fi.Exists Then
sr = New StreamReader("configuracion.txt", System.Text.Encoding.Default)
rutaArchivo = sr.ReadLine()
sr.Close()
fi = New FileInfo(rutaArchivo)
If fi.Exists Then
BackgroundWorker.WorkerReportsProgress = True
BackgroundWorker.RunWorkerAsync()
Else
MsgBox("No se ha podido encontrar el archivo para crear el diccionario", MsgBoxStyle.Critical, "Error al cargar el diccionario")
End If
Else
MsgBox("No se ha podido encontrar el archivo para crear el diccionario", MsgBoxStyle.Critical, "Error al cargar el diccionario")
End If
End Sub
En la primera versión del programa el diccionario con las traducciones se construía a partir del contenido de un fichero fijo llamado "vocabulario.dic" que tenía que estar alojado en el mismo directorio que el ejecutable. Ahora lo que se hace primero es comprobar que en el mismo directorio que el ejecutable existe un fichero llamado "configuracion.txt". Se abre dicho fichero y se lee la primera línea de texto. Dicha línea de texto contiene la ruta del archivo a partir del cuál se va a construir el diccionario, y por tanto su contenido se guarda en la variable "rutaArchivo" para después llamar al método "RunWorkerAsync" del componente "BackgroundWorker". En caso de que no se encontrase el archivo "configuracion.txt", o el archivo cuya ruta está guardada dentro del mismo, el programa se detendría indicando que se ha producido un error.
Al seleccionar la opción "Añadir palabra" del menú "Configuración" se muestra el siguiente formulario.
Este formulario contiene dos controles "EditBox" uno para introducir la palabra en castellano, y el otro para introducir la traducción correspondiente al inglés. Una vez indicada una palabra y su traducción basta con pinchar sobre el botón "Añadir Palabra" y se ejecutará el siguiente código.
Private Sub btnIntroducirPalabra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIntroducirPalabra.Click
Dim sw As StreamWriter
Dim traduccionesExistentes As String()
Dim escribirTraduccion As Boolean = True
Dim i As Integer
If frmPrincipal.Diccionario.CastellanoIngles.ContainsKey(txtPalabraCastellano.Text) Then
traduccionesExistentes = frmPrincipal.Diccionario.CastellanoIngles(txtPalabraCastellano.Text).ToString().ToUpper().Split(","c)
For i = 0 To traduccionesExistentes.GetUpperBound(0)
If txtPalabraIngles.Text.ToUpper() = traduccionesExistentes(i) Then
escribirTraduccion = False
Exit For
End If
Next
If escribirTraduccion = True Then
sw = New StreamWriter(frmPrincipal.rutaArchivo, True, System.Text.Encoding.Default)
sw.WriteLine(txtPalabraCastellano.Text & " = " & txtPalabraIngles.Text)
sw.Close()
End If
Else
sw = New StreamWriter(frmPrincipal.rutaArchivo, True, System.Text.Encoding.Default)
sw.WriteLine(txtPalabraCastellano.Text & " = " & txtPalabraIngles.Text)
sw.Close()
End If
txtPalabraCastellano.Text = ""
txtPalabraIngles.Text = ""
txtPalabraCastellano.Focus()
End Sub
Lo primero que se hace es comprobar si la palabra en castellano que hemos escrito existe ya en el diccionario de vocabulario o no. Si no existe se obtiene un stream a través del cual poder escribir en el fichero de vocabulario con el que estamos trabajando en ese momento, y se añade una línea indicando la palabra y su traducción. Como ya hemos visto antes, la ruta del fichero la extraemos de la variable "rutaArchivo".
Si la palabra en castellano ya existe en el diccionario se extraen todas las posibles traducciones que tiene asociadas y se comparan con la traducción indicada por el usuario. Si la traducción indicada por el usuario ya está en el diccionario no es necesario escribir nada en el fichero, y si no es ninguna de las que tiene asociadas la palabra en castellano se escribe una línea en el fichero indicando la nueva traducción.
Finalmente, la opción de menú "Acerca de.." muestra el siguiente formulario informativo.
Lo único que se puede comentar relacionado con este formulario es el código que tienen asociado los controles de tipo "LinkLabel", o lo que es lo mismo, los enlaces que aparecen en azul. Al pinchar sobre el primero se nos abrirá el programa que tengamos configurado por defecto para el correo y nos permitiría enviar un mail al autor del programa, mientras que el segundo abrirá el navegador llevándonos directamente a este mismo Blog.
Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
Process.Start("mailto:sergios.weblog@gmail.com")
End Sub
Private Sub LinkLabel2_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel2.LinkClicked
Process.Start("http://masprogramacionymenosprozac.blogspot.com")
End Sub
A continuación tenéis los enlaces para descargar tanto el proyecto completo como el ejecutable de la aplicación.
Proyecto completo para Visual Studio 2005: Descargar.
Ejecutable de la aplicación: Descargar.






