lunes, febrero 16, 2009

Crear un proyecto Windows Smart Device

 

Hola, el día de hoy voy a explicar como podemos crear un proyecto para dispositivos móviles, en Visual Studio: Smart Device:

Iniciamos VS, y seleccionamos el lenguaje, aquí nos va aparecer la siguiente pantalla:

image

En la parte izquierda seleccionamos el lenguaje con el cual vamos a trabajar, y dentro del lenguaje el tipo de proyecto a crear. Smart Device, en la parte derecha aparecen la plantilla del proyecto smart device, debemos dale un nombre al proyecto, esto esta resaltado en la etiqueta NAME de la parte inferior, por defecto el nombre de la solución es el mismo que el proyecto pero esto lo podemos cambiar, también resalte que podemos colocar este proyecto dentro del control de código seleccionando el check de la parte inferior derecha: Add to Source Cntrol. Y por ultimo en la parte superior derecha esta la lista de las diferentes versiones del framework con la que podemos trabajar. Al presionar el botón OK empezamos con la definición de nuestro proyecto.

La siguiente pantalla no permite seleccionar la versión del sistema operativo y SDK con el cual vamos a trabajar,a si como la versión del compact framework.

image

El Target platform son los diferentes SDK (Software Development Kit) instalados en nuestro PC de desarrollo, por defecto con VS2008 se instala el SDK para Windows Mobile 5, con VS2005, se instala por defecto el SDK para Pocket PC 2003.

image

En la parte inferior podemos seleccionar el template o plantilla del tipo de aplicacion que vayamos a desarrollar. Seleccionamos el tipo de plantilla y hacemos clic en el boton OK de esta pantalla.

image

Al darle clic al botón OK, ya nos aparece el ambiente de desarrollo para nuestra aplicación windows mobile.

Ya de acuerdo a lo que vaya a hacer nuestra aplicación vamos agregando tanto código como controles necesarios para armar los formularios y los datos a pedir.

Agreguemos un botón y le colocaremos el  mensaje “de Hola Mundo!”

image

image

Como se aprecia en la imagen hemos colocado un botón con el texto bienvenida que si observa en la parte derecha inferior la propiedad TEXT del botón tiene este texto.

Si damos doble clic sobre el botón nos lleva a la ventana de código del evento click del botón:

image

A continuación el código para mostrar el mensaje de bienvenida:

image

Observamos que tenemos el intellisense de todos los comandos y clases que escribamos en la ventana de codigo.

Para ejecutar nuestra aplicación hacemos clic en el botón de inicio o start Debugging como se muestra en la siguiente imagen:

image

Al hacerlo nos muestra la siguiente pantalla para seleccionar en donde vamos a ejecutar nuestra aplicación

image

Seleccionamos el Emulador y nos aparece lo siguiente:

image

Esta es la pantalla del emulador con nuestra aplicación ejecutándose.

En próximos post estaré explicando otros controles y la manera como podemos crear nuestra aplicación.

Hasta la próxima!!!!

sábado, enero 24, 2009

Creación de Reportes con Crystal Reports en Visual Studio 2005/2008

 

Este pequeño tutor de como crear un reporte en Crystal Reports desde Visual Studio 2005/2008, lo hago porque he recibido muchas consultas de como hacerlo de la mejor forma, quizás hiera algunas susceptibilidades, pero espero que entiendan que también hay otras maneras de hacer las cosas.

En primer lugar en este tutor les voy a indicar como crear el reporte de la manera mas larga, pero también, es la mejor manera para tener el control total sobre lo que queremos mostrar en el reporte.

La manera mas fácil de crear un reporte es agregar al proyecto un nuevo ítem de tipo reporte de Crystal Reports, y conectarse  a la base de datos desde el explorador de servidores del Visual Studio, seleccionar las tablas y arrastrarlas sobre el diseñador del reporte.

Si, esta es la manera mas fácil, pero también la que mas problemas nos puede dar al momento de empezar a cambiar campos a mostrar o al tratar de agregar una condición o filtro a los datos que queremos mostrar en el reporte.

La anterior es una buena técnica, siempre y cuando el reporte sea sencillo y detectemos que no tendrá cambios.

A continuación describo la manera en yo creo mis reportes tanto para web como para windows. A muchos les parecerá mas larga pero les aseguro que no tendrán problemas en el futuro pues tienen todo controlado ustedes.

Voy a utilizar un proyecto Windows Forms y una base de datos Sql Server 2008, pero se van a dar cuenta que lo pueden hacer con cualquier tipo de base de datos.

No voy a entrar en detalles del tipo de conexión a la base de datos ni las instrucciones para traer los datos.

A continuación muestro la forma con los datos que vamos a utilizar para nuestro reporte:

image

Bueno la idea de nuestro proyecto es que poder tener un reporte con estos datos, lo primero que vamos a hacer es agregar a nuestro proyecto un objeto dataset, que es el que nos va a servir para poder crear nuestro reporte en Crystal Reports.

image

Clic derecho en el nombre del proyecto, del menú seleccionamos la opción Add, y luego New Item… para que nos aparezca la siguiente pantalla y poder escoger el objeto a adicionar a nuestro proyecto.

image

Escogemos adicionar un objeto dataset que nos servirá como fuente de datos para el reporte y poder crear nuestro reporte como queremos. Le damos un nombre a nuestro dataSet, por lo general yo lo llamo igual que el reporte con el prefijo ds, entonces nuestro dataset se va a llamar dsPersonas.xsd

image

Al darle clic al boton Add nos muestra la ventana de diseño en la cual vamos a agregar un datatable con sus respectivos campos que son los que necesitamos para dibujar el reporte. Al estar aquí, damos clic derecho sobre la superficie para poder agregar el datatable :

image

image

Nos muestra el datatable creado, podemos cambiar el nombre que coloca por defecto, haciendo clic sobre el nombre y se coloca en modo de edicion para poder cambiarlo.

image

Para agregar los diferentes campos de nuestro datatable, seguimos los siguientes paso:

1. Clic derecho en el área de los campos del datatable y los vamos agregando.

image

2. al seleccionar Agregar Columna:

image nos permite colocarle el nombre a la columna, este nombre DEBE ser igual al nombre que vamos a devolver en nuestra consulta SQL a la Base de datos.

3. image En la ventana de propiedades de la columna que estamos agregando, podemos asignar el tipo de campo y su longitud en caso de ser una cadena ( String) y que sea requerido. Mi recomendación es que se apeguen a los mismos tipos de datos que están definidos en la base de datos.

4. En proceso de agregar los campos necesarios para el reporte:

image

Si me preguntan si es se pueden agregar campos que no se van a utilizar en el reporte, la respuesta es SI, porque es posible que ya tengamos la consulta realizada que nos sirve para nuestro  reporte y solo es crearlo a partir de la consulta que  ya existe, y como la consulta nos devuelve datos que no vamos a colocar ene l reporte, de todas formas tenemos que crear esos campos en nuestro datatable.

5. Aqui esta nuestro datatable completo para empezar a generar nuestro reporte:

image

Quizás me pensaran: “es mucho trabajo” pero piensen en esto, este sistema si mas tarde necesitan agregar un nuevo campo es simplemente venir agregar el campo y actualizar la fuente de datos del reporte para tener acceso a ese nuevo campo que acabamos de crear, por el otro método, eso no es tan fácil, es mejor agregar el campo y volver a crear el reporte. Aclaración: “yo, particularmente, no he sabido, o no he logrado como hacerlo cuando lo intente”.

6. Creamos el reporte en crystal reports, nuevamente clic derecho en el nombre del proyecto, Add, New Item..,  en la ventana que aparece, seleccionamos Reporting y escogemos el tipo de reporte Crystal Report:

image

Asignamos un nombre al reporte que se guarda con la extensión .rpt, y clic al botón Add para crear el reporte en nuestro proyecto.

image

Aparece la siguiente pantalla para seleccionar el tipo de reporte a crear, en la parte izquierda señalado en el circulo rojo aparece una nueva barra de herramientas con la cual vamos a trabajar al adicionar los campos al reporte, en la parte derecha, he resaltado en el circulo rojo que se agregan al proyecto de manera automática las referencias necesarias para que funcionen los reporte de Crystal Reports en nuestro proyecto.

De la ventana, seleccionamos la segunda opción, crear un reporte en blanco “As a Blank Report”

image

Al darle clic al boton OK de la pantalla anterior nos muestra el reporte en blanco como aparece en la imagen anterior.

La sección de Report Header, colocaremos lo que queremos que aparezca solo en la primera hoja del reporte.

En la sección  Page Header, colocaremos los que queremos se muestre en la cabecera de todas las paginas del reporte, aquí colocaremos los títulos de las columnas, por ejemplo.

En la sección Details, colocaremos el detalle de las columnas del reporte

La sección Report Footer, es la contraparte de la del Page Header, aquí podríamos colocar los números de pagina del reporte, por ejemplo.

La sección Page Footer es la contraparte de Report header.

Ya teniendo claro esto, lo siguiente es seleccionar la fuente de datos de nuestro reporte, aquí es donde entra a jugar el dataset que creamos en pasos anteriores, pues no necesitamos tener la conexión a la base de datos abierta para diseñar nuestro reporte.

image

Damos Clic derecho en el Field Explorer en la entrada Database Field, al aparecer el menú contextual de la imagen seleccionamos Database Expert… para ir a seleccionar nuestra fuente de datos.

image

En esta ventana, expandimos Project Data, luego ADO.NET DataSets, aquí nos van a aparecer todos los dataset que tengamos creados en nuestro proyecto, en nuestro caso solo aparece dsPersonas, que es el que hemos creado en pasos anteriores.

Seleccionamos el datatable  y damos clic en el botón image  para pasar los datos a la parte derecha de la ventana en la cual va a exponer los campos del datable para poder incluirlos en nuestro reporte.

image 

Hacemos clic en el botón OK para empezar a diseñar nuestro reporte. Al hacer esto, ya contamos con los campos del dataset en el Field Explorer:

image

Ahora simplemente es arrastrar los campos al área del reporte y colocarlos de la manera como deseamos se vea el reporte.

image

Seleccionamos la Toolbox (barra de herramientas de crystal) y de allí escogemos el control text object y lo arrastramos a la sección de page header para colocar el titulo del reporte allí, en la imagen están seleccionados en círculos rojos todos los controles mencionados.

image

Al arrastrar un campo del datatable y soltarlo en la sección de detalle de manera automática coloca un control de texto para el titulo del control que acabamos de arrastrar.

image Para corregir el texto del titulo, lo seleccionamos, le damos clic derecho al control y escogemos del menú la opción “Edit Text Object”, lo que nos permite cambiar el texto del titulo.

image

La imagen nos muestra como queda nuestro reporte, no es el alcance de este tutor, indicar como colocar los diferentes atributos de presentación grafica del reporte.

En nuestro formulario windows (web forms) o en nuestro formulario web (web forms) agregamos un control CrystalReportViewwer , el cual nos servirá para mostrar nuestro reporte en pantalla y poder imprimirlo o exportarlo a algún formato como PDF o Excel.

En el boton Imprimir de nuestro formulario, el codigo que voy a colocar para ir a la base de datos, realizar la consulta de los datos, colocarlos en un datatable y este datatable pasarlo a la propiedad datasource del reporte.

A continuacion el codigo del boton imprimir:

Private Sub btnImprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.Click
        Dim oCnn As New OleDbConnection  ‘ Objeto de conexion a la base de datos
        Dim daDatos As New OleDbDataAdapter ‘ Objeto Adaptador para leer datos de la Base de datos
        Dim cmdExec As New OleDbCommand ‘ objeto comando para ejecutar sentencias sql
        Dim dtDatos As New DataTable ‘ datatable para recibir los datos de la base de datos
        Dim sbQuery As New StringBuilder ‘ StringBuilder para armar cadenas
        Try

            oCnn.ConnectionString = "Provider=SQLNCLI10;Server=ralvarado;Database=MiBD;Uid=sa; Pwd=XXX;"
            oCnn.Open()
            cmdExec = oCnn.CreateCommand
            cmdExec.Connection = oCnn

            sbQuery.Append("SELECT Consecutivo  ")
            sbQuery.Append("      ,IdentificacionPersona  ")
            sbQuery.Append("      ,TipoPersona  ")
            sbQuery.Append("      ,Grupo  ")
            sbQuery.Append("      ,PrimerNombre  ")
            sbQuery.Append("      ,PrimerApellido  ")
            sbQuery.Append("      ,SegundoApellido  ")
            sbQuery.Append("      ,Sexo  ")
            sbQuery.Append("      ,Profesion  ")
            sbQuery.Append("      ,Direccion1  ")
            sbQuery.Append("      ,Direccion2  ")
            sbQuery.Append("      ,TelFijo1  ")
            sbQuery.Append("      ,TelFijo2  ")
            sbQuery.Append("      ,TelMovil  ")
            sbQuery.Append("      ,PaginaWeb  ")
            sbQuery.Append("      ,ZonaPostal  ")
            sbQuery.Append("      ,Fax  ")
            sbQuery.Append("      ,Email1  ")
            sbQuery.Append("      ,Email2  ")
            sbQuery.Append("      ,FechaNacimiento  ")
            sbQuery.Append("            FROM Persona   ")
            cmdExec.CommandText = sbQuery.ToString

            daDatos = New OleDbDataAdapter(cmdExec)
            daDatos.Fill(dtDatos)

            Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
            ' Asigno el reporte
            CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
            CrReport.Load(Application.StartupPath & "\crPersonas.rpt")
            CrReport.SetDataSource(dtDatos)

            CrystalReportViewer1.ReportSource = CrReport

        Catch ex As Exception
            MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
        End Try

    End Sub

Observen que al llenar los datos en dtDatos, simplemente debo asignarle este objeto al Reporte en su método SetDataSource. Con esto puede ser cualquier base de datos, siempre y cuando los datos correspondan a la estructura del dataset creado como fuente de datos del reporte.

Si en algún momento nuestro reporte cambia que hay que agregarle un nuevo campo, simplemente vamos a nuestro dataset y le agregamos el campo, luego vamos al reporte y lo abrimos y verificamos nuestra fuente de datos para que nuestro nuevo campo aparezca en al lista, luego es simplemente incluirlo en el reporte.

image

Bueno espero haber sido claro en como crear un reporte con Crystal Report y les aseguro que no van a tener problemas al momento de modificaciones en el reporte.

 

Hasta la próxima!!!!!!.

lunes, enero 12, 2009

Requisitos para el Desarrollo de SmartDevices en Compact Framework

Hola a todos,

Hace mucho tiempo que no escribia, pero voy a retomar el tema ya que en el foro en donde participo hay muchas preguntas al respecto y en el foro a veces no se explica de la mejor forma, solo lo estrictamente que se pregunta.

Bueno, lo que voy a tratar en esta entrada son los requisitos para iniciar el desarrollo de aplicaciones para smartdevices (dispositivos inteligentes) o para la plataforma Windows Mobile, o Windows CE.NET como es conocida por muchos.

1. Tener conocimientos y bases de programacion, esto es saber que es una variable, los ambitos de estas (publicas, privadas, etc.). Programacion orientada a objetos, saber o tener la teoria de lo que es una clase, un objeto y todo lo que involucra la POO (Programacion Orientada a Objetos, OOP en ingles [Object Oriented Programming]).

2. Tener bases o algunos conocimientos en alguno de los lenguajes de programacion para el nicho sobre el cual vamos a trabajar, en este caso sobre Windows Mobile. Estos lenguaje pueden ser: Visual Basic .NET, C Sharp (C#), o Visual C++ .NET, tambien existe el Embedded Visual C++ 4.0 ( la ultima version de esta herramienta gratis de MS que conozco, no estoy enterado si existe una nueva version).

3. La herramienta de desarrollo a utilizar, en mi caso, yo utilizo y me voy a centrar en la mayoria de los ejemplos en Visual Studio 2005 / 2008, esto implica que vamos a utilizar el Compact Framework .NET version 2.0 / 3.5.  Existe un IDE gratis para el desarrollo en plataforma .NET es muy bueno tambien, se llama Sharp Develop, en la nueva version para el framework 3.5 ya existen plantillas para aplicaciones SmartDevices, sin embargo yo aun no lo manejo, cuando ya tenga la experiencia de hacerlo, escribire un post con mi experiencia al respecto.

4. Para Visual Studio 2005 podemos desarrollar con la version Standar de VS2005 aplicaciones SmartDevices, pero, para Visual Studio 2008, para poder desarrollar para SmartDevices necesitamos como minimo la version professional.

5. Se necesita el conjunto de herramientas necesarias para la plataforma SmarDevice (pocket PC o windows CE), estas herramientas son las denominadas Windows Mobile SDK (Software Development Kit), al instalar la herramienta de desarrollo Visual Studio 2005 se instala de manera automatica el Windows Mobile SDK 2003, y en la pagina de Microsoft encontraremos las versiones de acuerdo a las versiones de los diferentes sistemas operativos Windows Mobile para el cual vamos a desarrollar.  Si nuestro IDE es VS2008, entonces el SDK que se instala de manera automatica es el Windows Mobile SDK 5. 

6. La instalacion del (os) SDK nos permite tener acceso a los Emuladores en los cuales podemos probar nuestras aplicaciones sin necesidad de tener fisicamente un dispositivo (PDA: Personal Data Assitant), ademas de todas las dll, espacios de nombre y assemblys necesarios y requeridos para el desarrollo y funcionamiento de nuestras aplicaciones.

7. El SDK, dependiendo de la version, tambien nos provee de un motor de base de datos Gratuito que suministra tambien Microsoft, este motor de base de datos se llama SQL Server Mobile, esta base de datos tambien se instala de manera automatica en la instalacion del SDK. Tenemos que tener en cuenta que en la plataforma Compact Framework .NET ya no se soportan las bases de datos de tipo Pocket Access o simplemente Access, en la version de compact framework 1.1 aparecio una dll de pago en la cual se podian utilizar bases de datos pocket access desde la plataforma .NET pero esto no ha continuado en las versiones 2.0 y 3.5. No tengo conocimiento de si esta libreria funciona para CF 2.0/3.5.

Bueno por hoy hasta aqui les dejo informacion.

En proximas opiortunidades continuare con esta seria de post sobre el desarrollo en compact framework.

Hasta la proxima!


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:<