VB6. Convertir cuotas en porcentajes version 3

Posted by in Visual Basic y VBA

De nuevo volvemos con nuestro software para convertir las cuotas de las casas de apuestas a porcentajes. En una entrada se escribió un código muy simple para efectuar lo que buscamos. En una segunda versión, intentamos profesionalizar el motor de nuestro software, introduciendo clases y módulos.

El motivo fundamental de tanto cambio interno (y ninguno externo) es transmitir todo el poder a la clase, en lugar de hacerlo el formulario. Parece que es un sin sentido, pero con grandes proyectos es mucho más cómodo de esta manera.

IEventHandler

La clase (objeto) que a continuación presento es una de mis favoritas, y que me permite programar a las clases como las manejadoras de la aplicación. El código no es complejo de entender, y su uso es bastante simple.

Option Explicit
' Clase encargada de Lanzar Eventos

Public Event RaisedEvent(Sender As Object, EventName As String, EventArgs As Variant, EventArgs2 As Variant)

Public Sub Trigger(Sender As Object, EventName As String, EventArgs As Variant, EventArgs2 As Variant)
RaiseEvent RaisedEvent(Sender, EventName, EventArgs, EventArgs2)
End Sub

Este código no es mio, aunque sí lo adapté a mis necesidades, sino que lo descubrí hace ya muchos años en alguna página de Internet, a la que ahora no soy capaz de acceder o que no soy capaz de localizar.

La clase simplemente define un evento «RaisedEvent» y muestra un método Trigger que es el que dispara un evento. Los parámetros a completar son el objeto que lanza un evento, el nombre del evento, y los argumentos.

El código original solo incluía un argumento, pero a mi me es más cómodo incluir dos argumentos en una sola instrucción. Este «extra» de código no perjudica en caso de no ser utilizado, y si facilita cuando el evento a tratar necesita de más de un evento.

Versión 3 de Coutas a Porcentajes

Volviendo a nuestro software, incluimos la clase IEventHandler, que vamos a utilizar en la clase y en el formulario.

En el formulario, necesitamos definir un objeto privado, y sus propiedades Set y Get:

Private m_objoEvent As IEventHandler

Private Sub Form_Unload(Cancel As Integer)
Set m_objoEvent = Nothing
End Sub

Public Property Get oEvent() As IEventHandler
Set oEvent = m_objoEvent
End Property

Public Property Set oEvent(objoEvent As IEventHandler)
Set m_objoEvent = objoEvent
End Property

El botón de calcular lanza un evento:

Private Sub cmdCalcula_Click()
m_objoEvent.Trigger Me, "calcula", Empty, Empty
End Sub

Las rutinas de Limpiar y Calcular se pasan a la clase, aunque se verá con detenimiento unas líneas más abajo.

Si se analiza el código del formulario y se compara con el código respecto a la versión inicial, queda patente que no se parece en nada. El formulario en esta tercera versión queda como un «lanzador» de eventos, según las acciones que realice el usuario.

Modificando la clase cCalculaCuotas

En la clase, necesitamos crear un objeto privado con eventos de la clase:

Private WithEvents bEvent As IEventHandler

Y la rutina que gestiona los eventos.

Private Sub bEvent_RaisedEvent(Sender As Object, EventName As String, EventArgs As Variant, EventArgs2 As Variant)
End Sub

Antes de trabajar con los eventos, vamos a ver cómo queda el código al iniciarse la clase:

Private Sub Class_Initialize()
Set bEvent = New IEventsHandler ' Defino el gestor de eventos
Set bForm = New frmCoutas
Load bForm
LimpiaDatos
Set bForm.oEvent = bEvent ' Transferimos el gestor de eventos, para conectar Clase con Formulario
End Sub

Para la limpieza del formulario, se ha cambiado la privacidad del método de privado a público, y se ha cambiado desde frmCoutas hasta la clase cCalculaCuotas:

Public Sub LimpiaDatos()
Dim i As Integer
bForm.Text1.Text = ""
bForm.Text2.Text = ""
bForm.Text3.Text = ""
For i = 0 To 2
bForm
.Label3(i).Caption = ""
Next
End Sub

El código de cálculo es también trasladado desde el formulario frmCoutas a la clase, con los correspondientes ajustes en las variables.

Private Sub Calcular()
Dim dValor2(2) As Double, tmp As String, i As Integer, dSum As Double


' Comprobamos que todos los valores son distintos de cero

For i = 0 To 2
If dValor(i) = 0 Then GoTo Ending
dValor2(i) = 1 / dValor(i) ' calculo sus inversos
Next
dSum = dValor2(0) + dValor2(1) + dValor2(2)
For i = 0 To 2
dPorc(i) = Round(dValor2(i) / dSum, 2) '& " %"
Next
MuestraResultados ' Muestra los resultados SIEMPRE tras calcular
Ending:
End Sub

Y, después de tanto cambio, volvemos a tener el software totalmente operativo, aunque con un «motor» mucho más profesional, y preparado para nuevos desafíos.

La versión 3 la podéis descargar aquí ejemplo_cuotas_vb6_manejandodatos_v3.

Espero de os haya servido de utilidad, y por supuesto, espero que la clase IEventHandler la empeceis a utilizar!!

Un saludo.