miércoles, septiembre 05, 2007

Simular un Datagrid Editable en Compact Framework .NET

Bueno en primer lugar el proyecto es un proyecto Smart Device Application y dejamos la forma que por defecto coloca Visual Studio.

Agrego un control DataGrid, un TextBox y un control Button, este control button sera invisible, lo pueden cambiar por una funcion o un procedimeinto, yo lo deje asi, pues parti d eun ejemplo con esxte control.

El control TextBox tambien esta invisible.

El evento Load de la forma lo que hago basicamente es llenar el control DataGrid con un dataTable creado en tiempo de ejecucion, con 10 filas ( de la cero a la diez) y cuatro columnas (de la cero a la tres).

Cada celda de la Grilla se llena con un texto generado tambein dentro del evento load.

Al hacer clic sobre una celda del Datagrid se genera o dispara el evento CurrentCellChanged, en este evento se muestra el textbox y se llena con el valor que se encuentre en la celda seleccionada. Lo mas importante aqui es que tambien se le asignan las dimensiones que tiene la celda al control textbox y se lo coloca en la posicion correcta, la linea de codigo que hace esto es:
.TextBox1.Bounds = dgList.GetCellBounds(dgList.CurrentRowIndex, dgList.CurrentCell.ColumnNumber)

Me

Luego de esto, se coloca el control textBox en visible = true para mostrarlo.

En el evento GotFocus del control TextBox, se selecciona el texto que contenga con el metodo .SelectAll().

Utilizo tambien el evento KeyPress del textbox para verificar si se presiono ENTER, si es asi, llamo al procedimiento Button1_Click , que como dije antes puede ser una funcion o un procedimiento, y oculto el control textbox.

El procedimiento Button_Click, lo que hace es actualizar la celda seleccionada con el valor del textbox.

Por ultimo en el evento GotFocus del Datagrid, verifico si el control textbox esta visible, si es asi, le asigno el Foco al control.

Lo unico que faltaria agregarle seria el control de la posicion del textbox al hacer un desplazamiento con la barra de desplazamiento. Pero eso sera otro dia.

El archivo del proyecto lo pueden encontrar en los archivos en el albun "DataGrid Editable".

Saludos y espero que lo disfruten!!!!.

Conexion a una base de Datos SQLCE

Dim oCnn As New SqlCeConnection
Dim oDR As SqlCeDataReaderTry 'Crear un Objeto SqlCeCommand para enviar una sentencia SELECT a la Base de Datos
Dim oCmd As SqlCeCommand = oCnn.CreateCommand()
oCmd.CommandType = CommandType.Text
oCmd.CommandText = "SELECT * FROM Productos "
' Ejecuto la sentencia y la guardo en el DataReader

oDR = oCmd.ExecuteReader()
' Verifico que tenga Datos el DataReader
If Not oDR.Read Then
MessageBox.Show("No hay Dtaos que Mostrar", "Mi Aplicacion")
Exit Sub
End If
Catch ex As SqlCeException
' Muestro un Mensaje con lso Datos de la excepcion

MessageBox.Show(ex.Message.ToString & vbCrLf & ex.Source.ToString & vbCrLf & _
ex.NativeError.ToString, "Mi Aplicacion")
Finally
' Cierro el Objeto SqlCeConnection

oCnn.Close()
End Try

Hay que colocar la direccion exacta de la Base de Datos para que la encuentre.

D
espues que tenemos los Datos en el objeto DataReader podemos verlos en un DataGrid, simplemente tenemos que asigna a la propiedad DataSource del DataGrid el objeto DataReader.

Colocamos todo dentro de un Try ... catch para controlar cualquier execepcion que se produzca y nuestro programa no se cancele.

Para este ejemplo, a la base de datos le coloco un password de alli que en la cadena de conexion aparece PAssword, si no lo utilizan simplemente no lo colocan en la cadena de conexion.

En este caso, si deseamos que este objeto sea la fuente de un DataGrid, entonces debemos hacer la propiedad .DataSource del DataGrid = a dsCETmp.Tables(0).

Espero que esto los ayude en su experiencioa con SQL CE y .NET

oCnn.ConnectionString = "Data Source=" & "My Documents" & _
"BasePPC.sdf; " & " Password=" & "XXXX2005;"
' Abro la conexion con la Base de Datos
oCnn.Open()

Primero debemos crear las variables u objetos para el manejo de la Conexion y un Objeto DataReader para manejar o recibir los datos de la Base de Datos.


Otra forma es utilizar un Objeto DataSet como contenedor de datos, para esto necesitamos un objeto DataAdapter:

' Definimos el Objeto DataAdapter
Dim
daCETmp As SqlCeDataAdapter

' Asignamos el Objeto Conexion y el Query al DataAdapter
daCETmp =
New SqlCeDataAdapter("SELECT * FROM Productos ", oCnn)

' Llenamos el onbjeto DataSet con el metodo Fill del DataAdapter

daCETmp.Fill(dsCETmp, "Productos")

Saludos

Pantalla Completa CF.NET

Pantalla Completa CF.NET

Debemos modificar algunas propiedades del Form:

FormBorderStyle = None
Size = 240, 320
WindowsState = Normal
ControlBox = False
Maximeize = False
Minimize = False

Los Imports a utilizar en el modulo en donde se coloquen las declaraciones son los siguientes:

System.Runtime.InteropServices

Añadir las siguientes declaraciones en un modulo:

Añadir este evento de la forma al codigo:

Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated
' ---------------------------------------------------
' Esto para FullScreen
Me.Capture = True
Dim hWnd As IntPtr = GetCapture()
Me.Capture = False
SHFullScreen(hWnd, 2)
SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 240, 320, 4)
End Sub
'API Declarations to FullScreen
Declare Function GetCapture Lib "coredll.dll" () As IntPtr
Declare Function SHFullScreen Lib "aygshell.dll" (ByVal hWnd As IntPtr, ByVal state As Integer) As Boolean
Declare Function SetWindowPos Lib "coredll.dll" (ByVal hWnd As IntPtr, _
ByVal hWndInsertAfter As IntPtr, ByVal x As Integer, _
ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, _
ByVal flags As Integer) As Boolean

Cargar Imagen en PictureBox por codigo

Creamos una funcion a la cual le pasamos la ruta y el nombre de la imagen que queremos cargar en el Control.

Public Shared Function LoadImage(ByVal imageName As String) As Bitmap
Return New Bitmap(imageName)
End Function

Para Cargar la imagen en el control, utilizamos la funcion de esta forma:

picLogo.Image = LoadImage(sRuta & "" & sLogoNameFile)

En donde sRuta es una variable de tipo string en donde esta la ruta y en sLogoNameFile el nombre del archivo grafico, puede ser .bmp, .jpg o .gif.

Tambien puedes hacerlo directamente de esta forma:

picLogo.Image = new System.Drawing.Bitmap(sRuta & "" & sLogoNameFile)

Reloj Indicando que se esta ejecutando un proceso

Simplemente antes de empezar nuestro proceso colocamos lo siguiente:

Cursor.Current = Cursors.WaitCursor 'Activar el Reloj

.... nuestro proceso y al finalizar

Cursor.Current = Cursors.Default

Eso es todo!

VB.NET PrevInstance / Instancia Previa

En Windows Mobile 2003 una aplicacion puede ejecutarse varias veces, no como en las versiones de los sistemas operativos anteriores en los cuales el mismo sistema operativo trae al frente la aplicacion que se esta ejecutando.

Se utilizan dos API y unas lineas de codigo en el metodo Main de la forma, ya que este metodo se ejecuta antes de Cargar o crear la forma.

Las decalraciones API son las siguientes:

' Funciones del API

EntryPoint:="SetForegroundWindow")>
_
Private Shared Function SetForegroundWindow( _
ByVal hWnd As IntPtr) As Boolean
End Function
'

EntryPoint:="FindWindow")>
_
Private Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Function

El metodo Main quedaria asi:

' El Sub Main
Public Shared Sub Main()
Dim nWnd As IntPtr
Dim ceroIntPtr As New IntPtr(0)
'
' Texto de la Forma
nWnd = FindWindow(Nothing, "Form1")
If nWnd.Equals(ceroIntPtr) Then
Application.Run(New fNotas())
Else
SetForegroundWindow(nWnd)
Application.Exit()
End If
End Sub

En donde "Form1" es el titulo de la forma (la propiedad .Text de la forma).

Tutor Embedded Visual Basic - Capitulo 10

Por: Roberto Alvarado

Capitulo 10

Para comenzar un pequeño truco, hemos estado utilizando imágenes para simular botones gráficos y para los botones de la barra de herramientas, estos gráficos son archivos en formato bmp de 256 colores, la razón de este formato es que el control PictureBox e Image solo pueden mostrar imágenes de estas características, si deseamos mostrar imágenes de mayor resolución o incluso en formato jpg o gif, debemos utilizar otros controles, uno muy bueno es el control S309PictureBox, además de mostrar las imágenes en esas resoluciones, es gratis, este control lo podemos conseguir en esta dirección: http://nsbasic.com/S309/ . En una entrega posterior lo utilizaremos y trataremos de explorar todas las posibilidades de este control.

El truco para que al compilar la aplicación nos copie las imágenes al directorio en donde esta la aplicación es este:

No vamos al menú Project, aquí escogemos la opción Add File..., y en este cuadro de dialogo buscamos nuestro archivo de imagen en formato bmp, y antes de hacer clic en el botón Aceptar, hacemos clic en Add As Related Document, que se encuentra en la parte inferior izquierda del cuadro de dialogo, con esto aparece en la ventana de Project, una nueva carpeta llamada Related Documents y allí van a estar todos nuestros archivos bmp.

Aquí apreciamos la pantalla Add File del menu Project

A continuación tenemos la pantalla del Explorador del Proyectos en la cual aparecen todos los archivos de imágenes relacionados en la carpeta “Related Documents”.

Bueno vamos a darle un poco de “Vida” a nuestra aplicación al momento de entrar a ella, vamos a hacerlo clocando un grafico en la pantalla, el cual se ocultara al momento de escoger alguna de las opciones del menú. Para esto vamos a colocar un nuevo control PictureBox, este control se va a llamar PictureBox5, las dimensiones del control son la altura o Height = 3135 y el ancho o Width = 2805. Lo pueden colocar en cualquier parte de la forma cuidando que no quede dentro de alguno de los frames que ya hemos utilizado.

Además vamos a darle un poco de vida agregando color al fondo de la forma, esto lo hacemos en la propiedad Backcolor de la forma, cuando hacemos clic sobre la flechita nos muestra una cuadro de dialogo para que escojamos el color del fondo, aparecen dos pestañas, pinchamos en la pestaña que dice “Palette” y escogemos de los amarillos el primer color de arriba hacia abajo. De esta forma le damos color de fondo a nuestra Aplicación, de esta manera podemos cambiar el color de fondo de los controles que lo permitan.

Ahora en el evento Load de la forma vamos a agregar lo siguiente :

'Muestro la Imagen de entrada

PictureBox5.Top = 420

PictureBox5.Left = 390

PictureBox5.Picture = App.Path & "Logo.bmp"

PictureBox5.Visible = True

Con esto colocamos en posición el PictureBox y le asignamos el archivo de imagen para que lo muestre en la pantalla.

A continuación podemos observar como se apreciara la pantalla principal de nuestra aplicación.

Ahora como esta imagen la hemos colocado después de haber creado los frames, si mostramos un frame va a aparecer detrás de la imagen, entonces eso no lo queremos... queremos y necesitamos que los frames ya creados aparezcan delante de la imagen, para esto se utiliza la propiedad Zorder, con esta propiedad le decimos que queremos que el objeto este en el orden cero (0) o sea delante de todo lo que haya en la pantalla.

Entonces para que se orienten mejor les pongo el código del MenuBar en el evento MenuClick Completo y las líneas que he adicionado las voy a colocar en color rojo

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

fraTareas.ZOrder 0

ActivarMenu mnuAccion

'Abro el recordset

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

Case "mnuTabClientes"

'CLIENTES

fraClientes.Top = 0

fraClientes.Left = 30

fraClientes.Visible = True

fraClientes.ZOrder 0

ActivarMenu mnuAccion

'Abro el recordset

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

Case "mnuTabApp"

'APLICACIONES

fraAplicaciones.Top = 0

fraAplicaciones.Left = 30

fraAplicaciones.Visible = True

fraAplicaciones.ZOrder 0

ActivarMenu mnuAccion

'Abro el recordset con la tabla Aplicaciones

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

Case "mnuNuevo"

'NUEVO

ActivarGuardar mnuAccion, mnuTablas

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

If fraAplicaciones.Visible Then

Text8.Enabled = True

Text8.Text = ""

Text9.Text = ""

End If

DesactivoNavega

Case "mnuEditar"

'EDITAR

xNuevo = 2

If fraClientes.Visible Then

'El ID no puede Modificarse

Text1.Enabled = False

End If

DesactivoNavega

Case "mnuborrar"

'BORRAR

Dim Resp As Long

Resp = MsgBox("Esta seguro de ELiminar este registro?", vbApplicationModal + vbCritical + vbYesNo, "Eliminando Registros...")

If Resp = vbYes Then

rs.Delete

rs.MoveFirst

MuestraRegistro

End If

Case "mnuCancelar"

'CANCELAR

desActivoGuardar mnuAccion, mnuTablas

ActivoNavega

Case "mnuGuardar"

'GUARDAR, GRABAR O SALVAR

If xNuevo = 1 Then

rs.AddNew

End If

If fraClientes.Visible Then

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

End If

If fraAplicaciones.Visible Then

rs.Fields("IdApp") = Text8.Text

rs.Fields("Aplicacion") = Text9.Text

End If

rs.Update

desActivoGuardar mnuAccion, mnuTablas

ActivoNavega

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

End If

End Select

End Sub

Además he hecho algunas correcciones para que no salgan mensajes de error cuando hacemos clic en los botones de navegación, y la tabla esta vacía. El código es el siguiente:

Private Sub MenuBar1_ButtonClick(ByVal Button As MenuBarLib.MenuBarButton)

Select Case Button.Key

Case "btnInicio"

If Not rs.EOF And Not rs.BOF Then

rs.MoveFirst

End If

Case "btnPrevio"

If Not rs.EOF And Not rs.BOF Then

rs.MovePrevious

If rs.BOF Then

rs.MoveFirst

MsgBox "Es el PRIMER Registro", vbApplicationModal + vbOKOnly, "Consultando..."

End If

End If

Case "btnSigte"

If Not rs.EOF And Not rs.BOF Then

rs.MoveNext

If rs.EOF Then

rs.MoveLast

MsgBox "Es el ULTIMO Registro", vbApplicationModal + vbOKOnly, "Consultando..."

End If

End If

Case "btnFin"

If Not rs.EOF And Not rs.BOF Then

rs.MoveLast

End If

End Select

MuestraRegistro

End Sub

Lo que esta en rojo indica lo nuevo, he colocado esta pregunta ya que cuando una tabla la abrimos y esta vacía tanto el fin de archivo (EOF), como el principio de archivo (BOF) son verdaderos. De esta manera no sale un error si presionan cualquiera de los botones y no hay datos en la tabla aun.

Al igual la rutina en donde mostramos el registro quedara con la pregunta y se vera de la siguiente manera:

Sub MuestraRegistro()

If Not rs.EOF And Not rs.BOF Then

If fraClientes.Visible Then

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

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

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

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

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

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

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

End If

If fraAplicaciones.Visible Then

Text8.Text = rs.Fields("IdApp")

Text9.Text = rs.Fields("Aplicacion")

End If

End If

End Sub

Las líneas en rojo son la pregunta que incluyo para que no salga error cuando la tabla este vacía.

En la Opción de Aplicaciones vamos a hacer lo siguiente: cuando nos coloquemos en el campo Id Aplicación, que aparezca el teclado y cuando dejemos el campo Aplicación que desaparezca. Para esto vamos a utilizar el evento GotFocus del control Text8 y el evento LostFocus del control Text9. También para que halla uniformidad, convertimos las letras a mayúsculas. Veamos como queda el código:

Private Sub Text8_GotFocus()

Me.SIPVisible = True ‘Esta instrucción Muestra el teclado del PPC

End Sub

Private Sub Text8_LostFocus()

Text8.Text = UCase(Text8.Text) 'Convierte a Mayusculas

End Sub

Private Sub Text9_LostFocus()

Text9.Text = UCase(Text9.Text)

Me.SIPVisible = False ‘Esta instrucción Oculta el teclado del PPC

End Sub

Muy bien prueben eso... funciona muy bien cierto? Que les parece, un poco de facilidad y automaticidad para el usuario. O.K. para que desaparezca el teclado cuando estemos en Text9, o sea cuando pedimos el nombre de la aplicación, lo que debemos hacer es presionar la tecla Tab en el teclado para que el TextBox pierda el Foco y se oculte el teclado.

Bueno y ahora para terminar vamos a darle a nuestra pantalla o nuestro frame de Aplicaciones la apariencia de una verdadera ventana de Pocket PC, así como aparecen las ventanas Child en un formulario MDI cuando hacemos programas en VB para el PC. Como podemos simular la barra de títulos y la X para cerrar la ventana? Bueno van a ver que es MUY SENCILLO.

Esto Lo vamos a hacer con dos controles Label para esto vamos a crear dos controles label y los vamos a colocar en la parte superior del Frame cubriendo el titulo que teníamos.

El label que vamos a crear para simular la barra de títulos lo vamos a llamar lblTitApp y sus propiedades son las siguientes :

LblTitApp.BackColor = &H00FF0000& Este es el color Azul de la barra de títulos, ustedes pueden colocar el que deseen

LblTitApp.Caption = “Aplicaciones”

LblTitApp.Font = Tahoma, Size = 9, Bold = True, Esto es dejamos la misma fuente, pero le colocamos tamaño 9 y en negrita.

LblTitApp.ForeColor = &H00FFFFFF& Este es el color Blanco, o sea, las letras van a ser de color blanco sobre fondo azul.

LblTitApp.Width = 3255

LblTitApp.Height = 255

Junto a este label vamos a crea otro label con las mismas características que el anterior, a este label lo vamos a llamar lblAppExit, las propiedades que vamos a cambiar son las siguientes:

LblAppExit.Alingment = 1 vbRightJustify

LblAppExit.Caption = “X”

LblAppExit.Width = 195

De esta manera simulamos la barra de títulos de una ventana y su botón de cerrar.

Ahora vamos a ponerle el código al botón cerrar (X) de la ventana, o sea al label lblAppExit:

Private Sub lblAppExit_Click()

rs.Close

fraAplicaciones.Visible = False

Me.SIPVisible = False

End Sub

Nuestra pantalla de diseño se vera de esta manera:

Y nuestra aplicación se vera de esta manera en el PPC cuando escojamos la opción de Aplicaciones:<

Tutor Embedded Visual Basic - Capitulo 9

Por: Roberto Alvarado

Capitulo 9

En este capitulo vamos a terminar la captura de los datos de la opción Aplicaciones.

Para empezar vamos a modificar la sección del menú en donde escogemos un nuevo registro para configurar la pantalla y los campos de Aplicaciones, vamos a agregar el siguiente fragmento de código :

If fraAplicaciones.Visible Then

Text8.Enabled = True

Text8.Text = ""

Text9.Text = ""

End If

En la opción de Grabar, agregamos el código correspondiente a la Tabla Aplicaciones y modificamos algo el código anterior, a continuación mostramos el código para esta opción:

If fraClientes.Visible Then

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

End If

If fraAplicaciones.Visible Then

rs.Fields("IdApp") = Text8.Text

rs.Fields("Aplicacion") = Text9.Text

End If

Rs.Update

Note que el Update lo colocamos al final y colocamos dentro de una instrucción if los datos para clientes y los datos para las Aplicaciones.

Vamos a trasladar la instanciación del objeto recordset rs al evento Load de la forma, lo eliminamos de la opción Nuevo de Clientes y lo colocamos en el evento Load de la forma . Entonces el código para los menús de Clientes y Aplicaciones quedaría de la siguiente manera:

Case "mnuTabClientes"

'CLIENTES

fraClientes.Top = 0

fraClientes.Left = 30

fraClientes.Visible = True

ActivarMenu mnuAccion

'Abro el recordset

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

Case "mnuTabApp"

'APLICACIONES

fraAplicaciones.Top = 0

fraAplicaciones.Left = 30

fraAplicaciones.Visible = True

ActivarMenu mnuAccion

'Abro el recordset con la tabla Aplicaciones

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

Muy bien... ha llegado la hora de colocarle código a los botones de navegación que tenemos, entonces nos vamos al procedimiento MenuBar1_ButtonClick y colocamos el siguiente código:

Private Sub MenuBar1_ButtonClick(ByVal Button As MenuBarLib.MenuBarButton)

Select Case Button.Key

Case "btnInicio"

rs.MoveFirst

Case "btnPrevio"

rs.MovePrevious

If rs.BOF Then

rs.MoveFirst

MsgBox "Es el PRIMER Registro", vbApplicationModal + vbOKOnly, "Consultando..."

End If

Case "btnSigte"

rs.MoveNext

If rs.EOF Then

rs.MoveLast

MsgBox "Es el ULTIMO Registro", vbApplicationModal + vbOKOnly, "Consultando..."

End If

Case "btnFin"

rs.MoveLast

End Select

MuestraRegistros

End Sub

Para poder acceder a este evento del control MenuBar, nos colocamos en el evento MenuClick del control y en la parte superior derecha de la ventana de edición, en donde aparece el nombre del evento que estamos editando, hacemos clic sobre la flecha que aparece en la parte derecha del nombre del evento, y de la lista que aparece escogemos el evento ButtonClick.

Con este código si presionamos el botón Primero nos colocamos en el primer registro del recordset, si lo hacemos en el botón anterior, nos movemos un registro atrás, si presionamos siguiente, nos desplazamos al siguiente registro y si le decimos ultimo, nos vamos al ultimo registro del recordet. Cada vez que nos movamos vamos actualizando los datos en la pantalla dependiendo de que opción tengamos escogida.

Muy bien debemos tener cuidado cuando estemos editando o creando un nuevo registro para desactivar los botones, ya que si los dejamos activos en estos momentos podemos tener errores al momento de guardar la información.

Vamos a crear dos procedimientos, uno para desactivar los botones y otro para activarlos nuevamente, aquí esta el código de estos dos procedimientos:

Sub DesactivoNavega()

MenuBar1.Controls.Item(4).Enabled = False

MenuBar1.Controls.Item(5).Enabled = False

MenuBar1.Controls.Item(6).Enabled = False

MenuBar1.Controls.Item(7).Enabled = False

End Sub

Sub ActivoNavega()

MenuBar1.Controls.Item(4).Enabled = True

MenuBar1.Controls.Item(5).Enabled = True

MenuBar1.Controls.Item(6).Enabled = True

MenuBar1.Controls.Item(7).Enabled = True

End Sub

El procedimiento DesactivoNavega lo vamos a utilizar en la opción Nuevo y Editar, el procedimiento ActivoNavega lo vamos a utilizar en las opciones Guardar y Cancelar del menú.

Si ya han probado la opción Cancelar del menú Acción, se habrán dado cuenta que esta mal cuando retorna el menú, el error se soluciona colocando estas líneas de la siguiente forma:

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

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

Coloquemos este procedimiento:

Private Sub Text8_LostFocus()

Text8.Text = UCase(Text8.Text)

End Sub

Con esto convertimos a mayúsculas cuando el textbox pierda el foco. Así estamos seguro que el Id de la aplicación siempre va a estar en mayúscula.

Ahora hagamos la opción de borrado para estas dos opciones que están activas en este momento.

Case "mnuborrar"

'BORRAR

Dim Resp As Long

Resp = MsgBox("Esta seguro de ELiminar este registro?", vbApplicationModal + vbCritical + vbYesNo, "Eliminando Registros...")

If Resp = vbYes Then

rs.Delete

rs.MoveFirst

MuestraRegistro

End If

Ese seria el código para borrar registros de la tabla. La misma rutina nos sirve para todas las tablas, dependiendo de la complejidad de su aplicación así será de compleja su rutina de borrado.

La rutina MuestraRegistro será esta:

Sub MuestraRegistro()

If fraClientes.Visible Then

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

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

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

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

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

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

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

End If

If fraAplicaciones.Visible Then

Text8.Text = rs.Fields("IdApp")

Text9.Text = rs.Fields("Aplicacion")

End If

End Sub

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