Calculadora sencilla con memoria en VB

Calculadora sencilla utilizando KeyPress y KeyChar con botones de comando para insertar números, realizar operaciones matemáticas frecuentes, almacenar en memoria, poner a cero, etc., en Visual Basic

Detalles del código Visual Basic .NET

Variables para usar a nivel de clase y procedimiento que coloca el cursor en posición de escribir:

' Variables a nivel de clase
Private Memoria As Double ' Para operaciones de las teclas de memoria M
Private Resultado As Double ' Resultado de la operación
Private Operador As String ' Operador que se ha pulsado
Private TocaBorrar As Boolean ' Para saber si hemos pulsado uno de los operadores + - * /
Private prov3 As Double ' Para el cáculo de la raíz cuadrada

' Salto de línea para usar en los cuadros de diálogo
Private SaltoLinea As Char = Chr(13) & Chr(10) ' equivale a vbCrLf
' Procedimiento que coloca el cursor a la derecha de la pantalla del resultado, para añadir dígitos
Private Sub PantallaCursor()
	TextboxPantalla.Focus() ' da el foco a la pantalla
	TextboxPantalla.SelectionStart = 12 ' coloca el cursor a la derecha del todo
	TextboxPantalla.SelectionLength = 0 ' selección de cero caracteres
End Sub

Al cargar el formulario se muestra la fecha y hora actual:

' mostrar la fecha en el cuadro de texto TxtHora al arrancar el programa
' variable de tipo fecha, se obtienen la fecha actual
Dim Fecha As Date
Fecha = Now()
' dar formato a la fecha y poner en mayúscula la primera letra de cada palabra
TxtHora.Text = StrConv((Format(Fecha, "dddd, dd/MMMM/yyyy, HH:mm ")), VbStrConv.ProperCase)

Detectando el evento KeyPress en el cuadro de texto en que se introducen los números se averigua el valor KeyChar (el código ASCII) de la tecla pulsada para dejar pasar solamente los valores que coinciden con números, la coma o la tecla Retroceso, el resto de teclas pulsadas se ignoran:

' Capturar la tecla pulsada cuando el foco está en la pantalla del resultado
Private Sub TxtPantalla_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextboxPantalla.KeyPress
    ' según el valor de la tecla pulsada
    Select Case e.KeyChar
        ' pasan valores si la tecla pulsada es un número de 0 a 9 o una coma o la tecla Retroceso
        Case "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c, "0"c, ","c, Chr(8)
            ' si la propiedad Handled del objeto e se pone a True se indica que la tecla ha sido "manejada" por el evento, equivale a
            ' indicar que la tecla NO ha sido pulsada, pero si la propiedad Handled del objeto e se pone a False se indica que la tecla
            ' todavía no ha sido "manejada" por el evento y se envía como pulsación a la pantalla
            e.Handled = False ' se pasa la pulsación
        Case Else
            e.Handled = True ' no se pasa la pulsación
    End Select
End Sub

El botón Calcular realiza la operación matemática seleccionada almacenando el valor del cuadro de texto en la variable Resultado y aplicando la operación elegida:

' Operación matemática que se está realizando
Private Sub Calcular()
	Select Case Operador ' operador en uso, puede ser +-*/
	    Case ""
		If TextboxPantalla.Text.Length > 0 Then ' si la pantalla no está vacía
		    Resultado = TextboxPantalla.Text ' Resultado es lo que muestra la pantalla
		Else ' si la pantalla está vacía
		    Resultado = 0.0 ' Resultado a cero
		End If
	    Case "+"
		If TextboxPantalla.Text.Length > 0 Then ' si la pantalla no está vacía
		    Resultado = Resultado + TextboxPantalla.Text ' Resultado es Resultado más lo que muestra la pantalla
		Else ' si la pantalla está vacía
		    Resultado = 0.0 ' Resultado a cero
		End If
	    Case "-"
		If TextboxPantalla.Text.Length > 0 Then ' si la pantalla no está vacía
		    Resultado = Resultado - TextboxPantalla.Text ' Resultado es Resultado menos lo que muestra la pantalla
		Else ' si la pantalla está vacía
		    Resultado = 0.0 ' Resultado a cero
		End If
	    Case "*"
		If TextboxPantalla.Text.Length > 0 Then ' si la pantalla no está vacía
		    Resultado = Resultado * TextboxPantalla.Text ' Resultado es Resultado multiplicado por lo que muestra la pantalla
		Else ' si la pantalla está vacía
		    Resultado = 0.0 ' Resultado a cero
		End If
	    Case "/"
		If TextboxPantalla.Text.Length > 0 Then ' si la pantalla no está vacía
		    Resultado = Resultado / TextboxPantalla.Text ' Resultado es Resultado dividido por lo que muestra la pantalla
		Else ' si la pantalla está vacía
		    Resultado = 0.0 ' Resultado a cero
		End If
	End Select
	TextboxPantalla.Text = Math.Round(Resultado, 3) ' redondear a 3 decimales
	TocaBorrar = True ' para arrastrar acumulada la operación
End Sub

A los botones de operadores matemáticos se les asocia un evento para que el método Calcular sepa qué operador se está utilizando. Por ejemplo con la suma:

' Botón de suma
Private Sub BtSuma_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtSuma.Click
	If TextboxPantalla.Text.Length > 0 Then ' si hay dígitos en la pantalla
	    Calcular() ' operación pendiente
	    TextboxPantalla.Text = "" ' vaciar pantalla
	    Operador = "+" ' operador pendiente
	Else ' si la pantalla está vacía
	    Resultado = 0.0 ' Resultado a cero
	End If
	PantallaCursor() ' cursor colocado para escribir de nuevo
End Sub

Esta aplicación forma parte de un ejercicio en el que, además de diseñar la calculadora, había que hacer otro formulario que imitase lo más posible a la calculadora clásica de Windows, solamente el diseño, sin código adicional, por eso tiene un menú que arranca el segundo formulario con ese aspecto. Es sencillo eliminar toda esa parte del ejercicio.

' mostrar una imagen lo más parecida posible a la calculadora clásica de Windows, sólo como parte de un ejercicio
Private Sub MenuCalculadora_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuCalculadora.Click
	PantallaCursor() ' cursor colocado para escribir de nuevo
	Dim Calculadora As New Form2   ' nueva variable de la clase formulario
	Calculadora.ShowDialog() ' abrir el formulario Form2
End Sub

Puedes descargar el código completo desde aquí.