miércoles, septiembre 05, 2007

Tutor Embedded Visual Basic - Capitulo 8

Por: Roberto Alvarado

Capitulo 8

En este capítulo vamos a empezar a trabajar con las tablas, crearemos nuevos registros, vamos a modificarlos y a eliminarlos. Aquí vamos...

Muy bien, para empezar vamos ha hacer algunas consideraciones:

  • En eMbedded Visual Basic, existe un Bug con respecto a la liberación de memoria, eso en palabras mas castizas quiere decir, que si abrimos un objeto connection este no se va a eliminar de la memoria hasta que no cerremos la aplicación igualmente va a suceder con el objeto recordset. Igual sucede con todos los objetos que creemos con CreateObject. La intrusión Set Objeto = Nothing NO LIBERA MEMORIA. ¡Tengan en cuenta esto!
  • Como ya habíamos utilizado un objeto connection y un objeto recordset, vamos a cambiar de posición su definición para hacerlos públicos y que podamos accesarlos desde cualquier punto de nuestra aplicación. Todo esto para aplicar la teoría que todos hemos discutido en muchos foros acerca de la liberación de memoria o de su uso en EVB. Esta posición y línea de desarrollo es mía, no quiere decir en ningún momento que ustedes deban seguirla, lo único que trato es de decirles como es más optimo para que en lo posible no halla problemas mas tarde con la memoria.

Muy bien, entonces nos vamos a ir al módulo que creamos y vamos a escoger el procedimiento CrearBasedatos, para corregir algunas líneas del código:

Dim rs As ADOCE.Recordset

Dim cnn As ADOCE.Connection

Estas líneas que están en el procedimiento CrearBaseDatos, las vamos a eliminar y la vamos a colocar en la sección de definiciones del módulo de esta manera:

Option Explicit

Public rs As ADOCE.Recordset

Public cnn As ADOCE.Connection

Ahora las instrucciones:

Set rs = Nothing

Set cnn = Nothing

Que están en el procedimiento CrearBaseDatos, del módulo, las trasladamos al evento Terminate de la forma:

Private Sub Form_Terminate()

Set rs = Nothing

Set cnn = Nothing

End Sub

También debemos trasladar al evento Load de la forma la apertura de objeto connection, esto quedaría de esta manera:

'Verifico si existe el archivo CDB

If FileSystem1.Dir(App.Path & "Tareas.cdb") = "" Then

'No existe el Archivo

Call CrearBaseDatos

End If

Set cnn = CreateObject("ADOCE.Connection.3.0")

cnn.Open App.Path & "Tareas.cdb"

Después de verificar que el archivo de la base de datos existe para que no saque error al intentar abrir la conexión.

Ahora hasta este momento las opciones del menú Acción están Activas, estas opciones no deben activarse hasta que no se escoja alguna de las opciones del menú Tablas.

Vamos a desactivar estas opciones de la siguiente forma, esto lo colocamos en el evento Load de la Forma:

'Configuro menu Accion

mnuAccion.Items("mnuNuevo").Enabled = False

mnuAccion.Items("mnuEditar").Enabled = False

mnuAccion.Items("mnuBorrar").Enabled = False

mnuAccion.Items("mnuCancelar").Enabled = False

mnuAccion.Items("mnuGuardar").Enabled = False

mnuAccion.Items("mnuCerrar").Enabled = False

Además eliminamos del evento Load las instrucciones Set ... Nothing y las trasladamos al evento Terminate de la forma, con esto el código quedaría de esta manera:

Private Sub Form_Terminate()

Set rs = Nothing

Set cnn = Nothing

' Luego que los botones y los menus son agregados

' al MenuBar, los Objectos se liberan

Set mnuTablas = Nothing

Set mnuAccion = Nothing

Set btnSepara = Nothing

Set btnInicio = Nothing

Set btnSigte = Nothing

Set btnPrevio = Nothing

Set btnFin = Nothing

End Sub

Muy bien ya hemos ajustado todo lo necesario, ahora continuemos, cada vez que escojamos alguna de las opciones del menú Tablas debemos activar las opciones del menú Acción para esto utilizamos el procedimiento ActivarMenu

Sub ActivarMenu(ByRef mnuAccion As MenuBarMenu)

mnuAccion.Items("mnuNuevo").Enabled = True

mnuAccion.Items("mnuEditar").Enabled = True

mnuAccion.Items("mnuBorrar").Enabled = True

mnuAccion.Items("mnuCerrar").Enabled = True

End Sub

Observen que estamos utilizando ByRef para indicarle que el objeto mnuAccion debe cambiar en la forma.

También debemos sacar la definición de las variable mnuTablas y mnuAccion a la sección de definiciones de la forma.

Cuando escojamos la opción Nuevo del menú Acción, las opciones anteriores deben restringirse y activar las opciones Cancelar y Grabar, para eso crearemos un procedimiento llamado ActivarGuardar en el modulo. El código es el siguiente:

Sub ActivarGuardar(ByRef mnuAccion As MenuBarMenu, ByRef mnuTablas As MenuBarMenu)

mnuAccion.Items("mnuNuevo").Enabled = False

mnuAccion.Items("mnuEditar").Enabled = False

mnuAccion.Items("mnuBorrar").Enabled = False

mnuAccion.Items("mnuCancelar").Enabled = True

mnuAccion.Items("mnuGuardar").Enabled = True

mnuAccion.Items("mnuCerrar").Enabled = False

mnuTablas.Items("mnuTabTareas").Enabled = False

mnuTablas.Items("mnuTabClientes").Enabled = False

mnuTablas.Items("mnuTabApp").Enabled = False

End Sub

Además desactivamos las opciones del menú Tablas, con esto aseguramos que mientras estemos creando un registro nuevo de algún tipo, no van a abrir cualquiera de las otras opciones del menú Tablas.

Ahora vamos a codificar cuando escojamos la opción Nuevo del menú Acción

Case "mnuNuevo"

'NUEVO

ActivarGuardar

If fraClientes.Visible Then

'Limpio los textbox

For i = 0 To Me.Controls.Count - 1

If Mid(Me.Controls(i).Name, 1, 4) = "Text" Then

Me.Controls(i).Text = ""

End If

Next i

End If

En el código anterior recorremos la colección Controls de la forma y cuando sea un TextBox cuyo nombre empiece por Text, pone en blanco su propiedad Text. Esta es la única manera que he encontrado hasta ahora de trabajar con las colecciones intrínsecas de eVB.

Como estamos trabajando con la librería ADOCE vamos a activar la referencia de esta, vamos al menú de Project, escogemos References y activamos la referencia Microsoft CE ADO Control 3.0.

Para diferenciar si estamos creando un nuevo registro o si lo estamos modificando, vamos a utilizar una variable publica en el modulo que vamos a llamar xNuevo, esta variable cuando escojamos la opción Nuevo del menú Acción, la vamos a hacer igual a uno (1) y cuando escogemos Modificar será igual a dos (2).

En la opción Guardar del menú Acción vamos a preguntar si esta variable es igual a uno (1), entonces adicionamos un registro en blanco a la tabla con el método AddNew, llenaremos uno a uno cada uno de los campos utilizando la colección Fields del recordset y luego guardaremos la información con el método Update.

En la opción Cerrar del menú Acción vamos a cerrar el Recordset que este activo en el momento.

Cuando escogemos las opciones Cancelar o Guardar debemos volver a activar las opciones de ambos menús, aquí esta el código del procedimiento que usamos en estas opciones del menú Acción:

Sub desActivoGuardar(ByRef mnuAccion As MenuBarMenu, ByRef mnuTablas As MenuBarMenu)

mnuAccion.Items("mnuNuevo").Enabled = True

mnuAccion.Items("mnuEditar").Enabled = True

mnuAccion.Items("mnuBorrar").Enabled = True

mnuAccion.Items("mnuCancelar").Enabled = True

mnuAccion.Items("mnuGuardar").Enabled = False

mnuAccion.Items("mnuCerrar").Enabled = False

mnuTablas.Items("mnuTabTareas").Enabled = True

mnuTablas.Items("mnuTabClientes").Enabled = True

mnuTablas.Items("mnuTabApp").Enabled = True

End Sub

La opción de Borrar la vamos a dejar para mas adelante cuando hallamos implementado un método de búsqueda para los registros de las tablas.

A continuación listo el código del evento MenuClick en donde hemos desarrollado casi todo :

Private Sub MenuBar1_MenuClick(ByVal Item As MenuBarLib.Item)

Dim i As Long

Select Case Item.Key

Case "mnuTabTareas"

'TAREAS

fraTareas.Top = 0

fraTareas.Left = 30

fraTareas.Visible = True

ActivarMenu

Case "mnuTabClientes"

'CLIENTES

fraClientes.Top = 0

fraClientes.Left = 30

fraClientes.Visible = True

ActivarMenu

'Creo la instancia del objeto recordset

Set rs = CreateObject("ADOCE.Recordset.3.0")

'Abro el recordset

rs.Open "Clientes", cnn, adOpenDynamic, adLockOptimistic

Case "mnuTabApp"

'APLICACIONES

fraAplicaciones.Top = 0

fraAplicaciones.Left = 30

fraAplicaciones.Visible = True

ActivarMenu

Case "mnuNuevo"

'NUEVO

ActivarGuardar

xNuevo = 1

If fraClientes.Visible Then

'Limpio los textbox

Text1.Enabled = True

For i = 0 To Me.Controls.Count - 1

If Mid(Me.Controls(i).Name, 1, 4) = "Text" Then

Me.Controls(i).Text = ""

End If

Next i

End If

Case "mnuEditar"

'EDITAR

xNuevo = 2

If fraClientes.Visible Then

'El ID no puede Modificarse

Text1.Enabled = False

End If

Case "mnuBorrar"

'BORRAR

Case "mnuCancelar"

'CANCELAR

desActivoGuardar mnuAccion, mnuTablas

Case "mnuGuardar"

'GUARDAR, GRABAR O SALVAR

If xNuevo = 1 Then

rs.AddNew

End If

rs.Fields("IdCliente") = Text1.Text

rs.Fields("Nombre") = Text2.Text

rs.Fields("Direccion") = Text3.Text

rs.Fields("Telefonos") = Text4.Text

rs.Fields("Celular") = Text5.Text

rs.Fields("Fax") = Text6.Text

rs.Fields("ValorHora") = Text7.Text

rs.Update

desActivoGuardar mnuAccion, mnuTablas

Case "mnuCerrar"

'CERRAR LA OPCION ACTUAL

rs.Close

If fraTareas.Visible Then

fraTareas.Visible = False

End If

If fraClientes.Visible Then

fraClientes.Visible = False

End If

If fraAplicaciones.Visible Then

fraAplicaciones.Visible = False

2 comentarios:

Anónimo dijo...

A ver Roberto; para mi terminó tu tutorial, el motivo es porque me da error al querer ejecutar la sub ActivarMenu(.... y me ha dejado bloqueado por mas que miro en internet no consigo información.

-an error was encountered while running program: Wrong nunber of arguments or invalid property assigment: ActivarMenu.-

¿Me hechas una mano?
deph2o_mr@hotmail.com

Unknown dijo...

Hola,

Verificaste que el parametro que le pasas al procedimiento esta correcto, es del tipo correcto, o sea un control menu?

Y no encuentras informacion en internet, pues esta herramienta ya dejo de ser soportada por MS.

Saludos,