teclado virtual
DESCRIPTION
reporte de practica en c# sobre desarrollo de una aplicacion de calculadoraTRANSCRIPT
TECLADO VIRTUAL JUÁREZ CHÁVEZ JESÚS MANUEL
TOPICOS AVANZADOS DE PROGRAMACION
AULA 706 11-12
INTRODUCCIÓN En esta práctica creé un teclado virtual dentro de un formulario el cual tiene la función de enviar
un correo electrónico. Desarrollare una aplicación con una interfaz gráfica la cual tendrá la función
de un teclado que escribirá dependiendo de la caja de texto en la que se encuentre, con el objetivo
del estudiar y aplicar el paradigma dirigido a eventos mediante la lógica “ si precioso este botón
entonces” y sobre todo el aprender de nuevas bibliotecas para el envió por la red de información.
Todo esto se plantea mediante la adición de conocimiento de manera autóctona gracias a una
guía previamente entregada donde se estimulan cuáles son los tipos de requerimientos que
necesitara el programa:
La aplicación debe insertar los valores correspondientes en las cajas de texto según corresponda, y al dar clic sobre el botón “Enviar”, se debe enviar el mensaje escrito al destinatario de correo.
spondientes caracteres en mayúsculas; a partir de ese instante todos los caracteres introducidos deben aplicarse en mayúsculas. Una propuesta se muestra en la figura 2.
1. Escribe siempre en minúsculas
2. Escribe solo una vez en mayúsculas y regresa a minúsculas
3. Escribe siempre en mayúsculas.
números y símbolos. Una propuesta de los números y símbolos se muestra en la figura 3. La manera en la que opte por abordar mi reporte sobre la práctica es mediante una pequeña guía con código implícito donde explico de manera detallada el uso de métodos y variables únicos que usare para la realización de estos anteriores objetivos, ya que no se entregó ninguna de tipo similar planteo de ser de mucha ayuda para la documentación de este tipo de proyectos los cuales podrán servir en el futuro para posibles tareas y de base para la evaluación sobre mis habilidades lógicas y conocimiento del lenguaje c#.
TABLA DE DESCRIPCION DE ATRIBUTOS
Objeto Propiedad valor
textbox
e-mail Name txtemail
subject Name txtsubject
message Name Txtmessage
Multiline True
Label
label1 Text e-mail:
label2 Text Subject:
label3 Text Message:
Button
BTLETRA Name btLetra(a..z)
BTPUNTO Name btPunto
BTESPACIO Name btEspacio
BTSHIFT Name btShift
BT123 Name bt123
BTENTER
Name
btEnter
BTSEND
Name
btSend
BTBACK
Name
btBack
BTCF Name btCf
DESARROLLO Desarrollé una aplicación en C# que utiliza una interfaz gráfica, la cual debe insertar el valor de la
propiedad “Text” según corresponda.
Para comenzar, creamos un nuevo proyecto C# en VisualStudio la cual será una aplicación
WindowsForm. Ya con el formulario abierto comenzamos a diseñar nuestra interfaz gráfica la cal
tendrá la siguiente forma:
En el cual estableceremos las propiedades
que se muestran en la tabla anterior
según corresponda el control.
Una vez terminado el diseño comenzamos
a escribir el código el cual comenzara por
declarar las variables que necesitaremos,
comenzaremos por la bandera que nos
indicara si el teclado se muestra en
minúsculas o mayúsculas. Por lo tanto
declararemos nuestra variable “mayus”
como bool.
Seleccionamos los botones A-Z y el botón Punto a los cuales les agregaremos en su evento Click un nuevo
método, para el cual ocupamos una variable de tipo Button el cual tomara el valor del botón presionado
para asignar su propiedad .Text al control correspondiente.
Como podemos observar los botones solo escriben en el TextBox de e-mail pero los demás quedan vacíos, al
igual que si escribiéramos el mismo código para los textbox siguientes escribiría lo mismo en los tres, para
evitar esto la solución sería crear dos variables una que tomara la última posición del cursor en el textbox y la
otra tomara el valor del ultimo textbox que perdió el foco. Para ello lo escribiremos de la siguiente forma:
bool mayus = false;
private void btLetra_Click(object sender, EventArgs e) { Button objButton = (Button)sender; txtemail.Text += objButton.Text; }
private int ultimaPosicion = 0;//ultima posicion del cursor en el textbox private TextBox LastTextbox;//guarda el ultimo textbox que perdio el foco
Estas variables las ocuparemos en el evento Leave de los TextBox. Este evento detecta cuando el control pierde
el foco, el cual asignara los valores correspondientes a cada una de ellas.
Ahora si nuestro evento click de los botones quedaría de la siguiente forma:
A lo cual también ocuparemos la validación sobre si el ultimo digito es una mayúscula , de ser así ordenaremos
el return y de no ser así asignaremos a ultima entrada el valor de una letra.
Considerando que toda la teoria sobre el ejecricio era el poder crear la simulacion de un teclado convencional
y habiendo programado la mayoria de las teclas , ahora designe tiempo a la construccion de las teclas con
funciones especiales.
En este caso la funcion y construccion de la tecla espacio que seguira una logica similar a la de la inserccion de
letras en los textbox. Haciendo un llamado a la variable lastTextbox y los signos += para la concatenacion.
La tecla enter sera construida con una logica similar , cambiando en el sentido de la restriccion a lo cual primero
evaluaremos que se la ultima accion operada haya sido una letra y al igual que se confirmara en el textbox al
que se deseo agrega el enter.
Dentro de la funcionalidad de los metodos y asi mismo de las restricciones tendremos la funcion de asignar el
enter y estaremos regresando a ultimaentrada como ninguna
private void ultimaCaja_Leave(object sender, EventArgs e) { TextBox objtextbox = (TextBox)sender; ultimaPosicion = objtextbox.SelectionStart; LastTextbox = objtextbox; }
private void btLetra_Click(object sender, EventArgs e) { Button objButton = (Button)sender; LastTextbox.Text += objButton.Text; }
private void btLetra_Click(object sender, EventArgs e) { Button objButton = (Button)sender; LastTextbox.Text += objButton.Text; if (ultimaEntrada == Entrada.MAYUSCULA) return; else ultimaEntrada = Entrada.LETRA; }
private void btEspacio_Click(object sender, EventArgs e) { LastTextbox.Text += " "; }
private void btBack_Click(object sender, EventArgs e)
{
string str;
int loc;
if(LastTextbox.Text.Length > 0)
{
str = LastTextbox.Text.Substring(LastTextbox.Text.Length - 1);
loc = LastTextbox.Text.Length;
LastTextbox.Text = LastTextbox.Text.Remove(loc - 1, 1);
}
}
Mientras que para la función del botón “back” o lo que denominarnos en esta práctica como eliminación del
ultimo digito introducido, construiremos de manera logia la condición de que previamente exista una cadena
de texto introducida en el ultimo textbox que perdió el foco. De esta manera crearemos dos variables que nos
ayuden asegurarnos de lo que sea borrado será el ultimo digito de la cadena de textos, obteniendo la ultima
cadena total ingresada comenzando desde el ultimo digito ingresado.(variable denominada str) y también
obteniendo el tamaño total de esta cadena ( variable denominada loc). Logrando que la función de este método
sea eliminar desde la ultima posición de la cadena (srt) un digito por un digito.
La construcción mas compleja de este código es la función del evento shift en el teclado, ya que gracias a los
requerimientos del proyecto otorgados por el profesor los cuales son :
El botón “Shift” puede tener 3 estados:
1. Escribe siempre en minúsculas
2. Escribe solo una vez en mayúsculas y regresa a minúsculas
3. Escribe siempre en mayúsculas.
private void btEnter_Click(object sender, EventArgs e)
{
if (LastTextbox == txtemail && ultimaEntrada != Entrada.NNGUNA )
{
txtsubject.Select();
ultimaEntrada = Entrada.NNGUNA;
}
if (LastTextbox == txtsubject && ultimaEntrada != Entrada.NNGUNA)
{
txtmessage.Select();
ultimaEntrada = Entrada.NNGUNA;
}
if (LastTextbox == txtmessage && ultimaEntrada != Entrada.NNGUNA)
{
btSend.Select();
ultimaEntrada = Entrada.NNGUNA;
}
}
private void btshift_Click(object sender, EventArgs e)
{
if (ultimaEntrada == Entrada.LETRA )
{
btshift.BackColor=SystemColors.Control;
if (mayus == false)
{
btLetraA.Text = "A";
btLetraB.Text = "B";
btLetraC.Text = "C";
btLetraD.Text = "D";
btLetraE.Text = "E";
btLetraF.Text = "F";
btLetraG.Text = "G";
btLetraH.Text = "H";
btLetraI.Text = "I";
btLetraJ.Text = "J";
btLetraK.Text = "K";
btLetraL.Text = "L";
btLetraM.Text = "M";
btLetraN.Text = "N";
btLetraÑ.Text = "Ñ";
btLetraO.Text = "O";
btLetraP.Text = "P";
btLetraQ.Text = "Q";
btLetraR.Text = "R";
btLetraS.Text = "S";
btLetraT.Text = "T";
btLetraU.Text = "U";
btLetraV.Text = "V";
btLetraW.Text = "W";
btLetraX.Text = "X";
btLetraY.Text = "Y";
btLetraZ.Text = "Z";
mayus = true;
ultimaEntrada = Entrada.MAYUSCULA;
}
else
{
btLetraA.Text = "a";
btLetraB.Text = "b";
btLetraC.Text = "c";
btLetraD.Text = "d";
btLetraE.Text = "e";
btLetraF.Text = "f";
btLetraG.Text = "g";
btLetraH.Text = "h";
btLetraI.Text = "i";
btLetraJ.Text = "j";
btLetraK.Text = "k";
btLetraL.Text = "l";
btLetraM.Text = "m";
btLetraN.Text = "n";
btLetraÑ.Text = "ñ";
btLetraO.Text = "o";
btLetraP.Text = "p";
btLetraQ.Text = "q";
btLetraR.Text = "r";
btLetraS.Text = "s";
btLetraT.Text = "t";
btLetraU.Text = "u";
btLetraV.Text = "v";
btLetraW.Text = "w";
btLetraX.Text = "x";
btLetraY.Text = "y";
btLetraZ.Text = "z";
mayus = false;
ultimaEntrada = Entrada.LETRA;
}
}
else
{
if (ultimaEntrada == Entrada.MAYUSCULAII )
{
ultimaEntrada = Entrada.LETRA;
}
ultimaEntrada = Entrada.MAYUSCULAII ;
btshift.BackColor = SystemColors.ControlDark;
mayus = true;
}
}
El código ha quedado de esta manera:
El código en totalidad trabaja con la lógica general basados en la validación de una bandera y la confirmación
sobre que tipo fue la ultima entrada para tener dos llaves seguras de que trabaja de la manera correcta. Con
la bandera previamente declarada mayus , nos aseguramos del estado actual del teclado y cual será la función
del evento click si esta bandera esta en verdadero la función se asegurara de que el teclado se regrese a su
estado original de minúsculas , en todos los casos reasignando la bandera a su estado correspondiente y
private void bt123_Click(object sender, EventArgs e)
{
if (simb == false)
{
btLetraA.Text = "!";
btLetraB.Text = ";";
btLetraC.Text = Convert.ToString('"');
btLetraD.Text = "#";
btLetraE.Text = "3";
btLetraF.Text = "$";
btLetraG.Text = "/";
btLetraH.Text = "^";
btLetraI.Text = "8";
btLetraJ.Text = Convert.ToString('&');
btLetraK.Text = "*";
btLetraL.Text = "(";
btLetraM.Text = "?";
btLetraN.Text = ",";
btLetraÑ.Text = ")";
btLetraO.Text = "9";
btLetraP.Text = "0";
btLetraQ.Text = "1";
btLetraR.Text = "4";
btLetraS.Text = "@";
btLetraT.Text = "5";
btLetraU.Text = "7";
btLetraV.Text = ":";
btLetraW.Text = "2";
btLetraX.Text = "'";
btLetraY.Text = "6";
btLetraZ.Text = "-";
bt123.Text = "Abc";
simb = true;
btshift.Enabled = false;
}
else
{
btLetraA.Text = "a";
btLetraB.Text = "b";
btLetraC.Text = "c";
btLetraD.Text = "d";
btLetraE.Text = "e";
btLetraF.Text = "f";
btLetraG.Text = "g";
btLetraH.Text = "h";
btLetraI.Text = "i";
btLetraJ.Text = "j";
btLetraK.Text = "k";
btLetraL.Text = "l";
btLetraM.Text = "m";
btLetraN.Text = "n";
btLetraÑ.Text = "ñ";
btLetraO.Text = "o";
btLetraP.Text = "p";
btLetraQ.Text = "q";
btLetraR.Text = "r";
btLetraS.Text = "s";
btLetraT.Text = "t";
btLetraU.Text = "u";
btLetraV.Text = "v";
btLetraW.Text = "w";
btLetraX.Text = "x";
btLetraY.Text = "y";
btLetraZ.Text = "z";
simb = false;
btshift.Enabled = true;
}
} private void btSend_Click(object sender, EventArgs e)
{
if (txtemail.Text.Trim() == "")
{
MessageBox.Show("El campo de direccion es vacio favo de llenarle");
}
else
{
también asignando ultimaentrada el valor que ha sido efectuado ya sea una MAYUSCULA , UNA LETRA O UNA
MAYUSCULAII. Me he tomado la dedicación para poder estilizar de manera correcta el objeto botón shift y
agregarle cambios de colores por cada función activa. Comentando que el trabajar en este botón ha sido la
parte más compleja y entretenida del proyecto.
Como ultima construcción dentro del simular el teclado en el formulario se construyo el botón para poder
cambiar a números y signos todo nuestro alfabeto y poder implementarlos dentro de nuestros mensajes
quedando el código de la siguiente manera:
Cortamos el trabajo de confirmación con el uso de una única bandera para asegurarnos en que modalidad se
encuentra el teclado si en estado de letras o de símbolos , también por estética de código limpio me asegure
de que mientras el teclado este en modo de simbolo el botón shitf y la totalidad de sus funciones se encuentren
totalmente deshabilitados ya que no tiene caso que el usuario lo use y todo esto mientras la bandera de
símbolos al ser evaluada entre en modalidad de falso y la inversa si la bandera entra en verdadero el teclado
regresa a sus funciones normales con el shitf.
Por ultimo para terminar la construcción del formulario se implementaron las funciones necesarias para que
el correo sea enviado y este confirmado:
Se necesito de emplear una biblioteca propia de c# “using system.net.mail” para poder crear un objeto del tipo
MailMessage y poder asociarles todos nuestros campos de texto a sus complementos como se muestra en el
código anterior así mismo crear credenciales con un objeto del tipo smtpClient el cual se encargaría de obtener
las credenciales y los permisos SSL para poder enviar el mensaje anterior, como código limpio se
implementaron la confirmación y cancelación del estatus sobre el mail. Terminando satisfactoriamente la
practica.
IV. Pruebas y análisis de resultados
Dentro de las pruebas estuvo el error sobre el puerto indicado para el cliente smtp , al iniciar se configuro con
el puerto 25 pero el cliente de Hotmail no dejo acceder a su función y se cambió por el 587, solucionando este
pequeño error y dándonos como resultado:
Que el correo indicaron recibiera correctamente el correo, como análisis puedo sentirme muy satisfecho el
haber acabo esta practica de la mejor manera posible con casi cero errores demostrados y obteniendo un buen
programa para mensajeros.
V. Conclusiones Considero que gracias al tiempo de plazo para la entrega del programa pude desenvolverme de una mera más cómoda y dedicarle más tiempo al estudio de las posibles bibliotecas del lenguajes y herramientas para implementación con la red y sobre todo la construcción de un código bastante útil y estético, que sin lugar a dudas me dejo la lección del poder construir algo tan funcional de manera estudiantil.
VI. ANEXOS(Codigo) using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Mail;
namespace TecladoVirtualcs
{
public partial class Form1 : Form
{
private enum Entrada
{
NNGUNA,
LETRA,
MAYUSCULA,
MAYUSCULAII,
SIMBOLO
}
//string tecla;
private Entrada ultimaEntrada;
bool mayus = false;
bool simb = false;
//bool txt;
private int ultimaPosicion = 0;//ultima posicion del cursor en el textbox
private TextBox LastTextbox;//guarda el ultimo textbox que perdio el foco
// variables que ocuparemos para enviar los datos de textos de los textbox por mail
private string Para;
private string Sunto;
private string mesa;
private MailMessage Correo;
public Form1()
{
InitializeComponent();
ultimaEntrada = Entrada.NNGUNA;
txtemail.Select();
}
private void btLetra_Click(object sender, EventArgs e)
{
Button objButton = (Button)sender;
LastTextbox.Text += objButton.Text;
if (ultimaEntrada == Entrada.MAYUSCULA)
return;
else
ultimaEntrada = Entrada.LETRA;
}
private void btshift_Click(object sender, EventArgs e)
{
if (ultimaEntrada == Entrada.LETRA )
{
btshift.BackColor = SystemColors.Control;
if (mayus == false)
{
btLetraA.Text = "A";
btLetraB.Text = "B";
btLetraC.Text = "C";
btLetraD.Text = "D";
btLetraE.Text = "E";
btLetraF.Text = "F";
btLetraG.Text = "G";
btLetraH.Text = "H";
btLetraI.Text = "I";
btLetraJ.Text = "J";
btLetraK.Text = "K";
btLetraL.Text = "L";
btLetraM.Text = "M";
btLetraN.Text = "N";
btLetraÑ.Text = "Ñ";
btLetraO.Text = "O";
btLetraP.Text = "P";
btLetraQ.Text = "Q";
btLetraR.Text = "R";
btLetraS.Text = "S";
btLetraT.Text = "T";
btLetraU.Text = "U";
btLetraV.Text = "V";
btLetraW.Text = "W";
btLetraX.Text = "X";
btLetraY.Text = "Y";
btLetraZ.Text = "Z";
mayus = true;
ultimaEntrada = Entrada.MAYUSCULA;
}
else
{
btLetraA.Text = "a";
btLetraB.Text = "b";
btLetraC.Text = "c";
btLetraD.Text = "d";
btLetraE.Text = "e";
btLetraF.Text = "f";
btLetraG.Text = "g";
btLetraH.Text = "h";
btLetraI.Text = "i";
btLetraJ.Text = "j";
btLetraK.Text = "k";
btLetraL.Text = "l";
btLetraM.Text = "m";
btLetraN.Text = "n";
btLetraÑ.Text = "ñ";
btLetraO.Text = "o";
btLetraP.Text = "p";
btLetraQ.Text = "q";
btLetraR.Text = "r";
btLetraS.Text = "s";
btLetraT.Text = "t";
btLetraU.Text = "u";
btLetraV.Text = "v";
btLetraW.Text = "w";
btLetraX.Text = "x";
btLetraY.Text = "y";
btLetraZ.Text = "z";
mayus = false;
ultimaEntrada = Entrada.LETRA;
}
}
else
{
if (ultimaEntrada == Entrada.MAYUSCULAII )
{
ultimaEntrada = Entrada.LETRA;
}
ultimaEntrada = Entrada.MAYUSCULAII ;
btshift.BackColor = SystemColors.ControlDark;
mayus = true;
}
}
private void ultimaCaja_Leave(object sender, EventArgs e)
{
TextBox objtextbox = (TextBox)sender;
ultimaPosicion = objtextbox.SelectionStart;
LastTextbox = objtextbox;
}
private void btEspacio_Click(object sender, EventArgs e)
{
LastTextbox.Text += " ";
}
private void CambiarMinus_TextChanged(object sender, EventArgs e)
{
if (ultimaEntrada == Entrada.MAYUSCULA)
{
if (mayus == true)
ultimaEntrada = Entrada.LETRA;
btshift.PerformClick();
}
}
private void btBack_Click(object sender, EventArgs e)
{
string str;
int loc;
if(LastTextbox.Text.Length > 0)
{
str = LastTextbox.Text.Substring(LastTextbox.Text.Length - 1);
loc = LastTextbox.Text.Length;
LastTextbox.Text = LastTextbox.Text.Remove(loc - 1, 1);
}
}
private void bt123_Click(object sender, EventArgs e)
{
if (simb == false)
{
btLetraA.Text = "!";
btLetraB.Text = ";";
btLetraC.Text = Convert.ToString('"');
btLetraD.Text = "#";
btLetraE.Text = "3";
btLetraF.Text = "$";
btLetraG.Text = "/";
btLetraH.Text = "^";
btLetraI.Text = "8";
btLetraJ.Text = Convert.ToString('&');
btLetraK.Text = "*";
btLetraL.Text = "(";
btLetraM.Text = "?";
btLetraN.Text = ",";
btLetraÑ.Text = ")";
btLetraO.Text = "9";
btLetraP.Text = "0";
btLetraQ.Text = "1";
btLetraR.Text = "4";
btLetraS.Text = "@";
btLetraT.Text = "5";
btLetraU.Text = "7";
btLetraV.Text = ":";
btLetraW.Text = "2";
btLetraX.Text = "'";
btLetraY.Text = "6";
btLetraZ.Text = "-";
bt123.Text = "Abc";
simb = true;
btshift.Enabled = false;
}
else
{
btLetraA.Text = "a";
btLetraB.Text = "b";
btLetraC.Text = "c";
btLetraD.Text = "d";
btLetraE.Text = "e";
btLetraF.Text = "f";
btLetraG.Text = "g";
btLetraH.Text = "h";
btLetraI.Text = "i";
btLetraJ.Text = "j";
btLetraK.Text = "k";
btLetraL.Text = "l";
btLetraM.Text = "m";
btLetraN.Text = "n";
btLetraÑ.Text = "ñ";
btLetraO.Text = "o";
btLetraP.Text = "p";
btLetraQ.Text = "q";
btLetraR.Text = "r";
btLetraS.Text = "s";
btLetraT.Text = "t";
btLetraU.Text = "u";
btLetraV.Text = "v";
btLetraW.Text = "w";
btLetraX.Text = "x";
btLetraY.Text = "y";
btLetraZ.Text = "z";
simb = false;
btshift.Enabled = true;
}
}
private void btEnter_Click(object sender, EventArgs e)
{
if (LastTextbox == txtemail && ultimaEntrada != Entrada.NNGUNA )
{
txtsubject.Select();
ultimaEntrada = Entrada.NNGUNA;
}
if (LastTextbox == txtsubject && ultimaEntrada != Entrada.NNGUNA)
{
txtmessage.Select();
ultimaEntrada = Entrada.NNGUNA;
}
if (LastTextbox == txtmessage && ultimaEntrada != Entrada.NNGUNA)
{
btSend.Select();
ultimaEntrada = Entrada.NNGUNA;
}
}
private void btSend_Click(object sender, EventArgs e)
{
// para el evento click primero estoy confirmando que el campo de email etes lleno de no ser asi se enviara
una advertencia
if (txtemail.Text.Trim() == "")
{
MessageBox.Show("El campo de direccion es vacio favo de llenarle");
}
else
{
// estoy instanaciando las variables de tipo tecto para enviarlas con la herramiente mailmessage
Sunto = txtsubject.Text;
Para = txtemail.Text;
mesa = txtmessage.Text;
// se asiganaran con la herramienta mail los textos guardados previamente
Correo = new MailMessage();
Correo.To.Add(new MailAddress(Para));
// metodo to para asignar destinatario y con variables mailaddrres
Correo.From = new MailAddress("[email protected]");
Correo.Subject = Sunto;
Correo.Body = mesa;
// se le esta asignando con el objeto mail cada propiedad a los campos previos
Correo.IsBodyHtml = false;
}
SmtpClient Clientisimo = new SmtpClient(" smtp.live.com",587);
using (Clientisimo)
{
Clientisimo.Credentials = new System.Net.NetworkCredential("[email protected]", "soloyoyya");
Clientisimo.EnableSsl = true;
Clientisimo.Send(Correo);
}
MessageBox.Show("El programa funciona mensaje enviado");
}
}
}