Skins en VisualBasic.Net

En este artículo veremos como darle a nuestras aplicaciones en VisialBasic.Net una vista más estética para el usuario, esto lo haremos con un elemento ocx, que nos permite agregar archivos con extención *.snk que nos brindan esta posibilidad, a continuación explicaré exactamente el proceso.

Requerimientos para el ejercicio

  • VisualBasic Express 2008 (o 2005)
  • Archivo ocx actskin4.ocx (descargarlo aquí)
Comenzamos, creamos un proyecto al que llamaremos skinvb, una ves que nos muestre el form de costumbre agregaremos un label, un textbox y un botón, ahora guardamos el proyecto, en la carpeta que nos crea donde sea que este guardado, pegamos los archivos actskin4.ocx y todos los archivos skn descargaste el la carpeta Debug que esta en la carpeta bin de tu proyecto de manera que la vista de detalles sea como esta


Regresamos al espacio de trabajo, en el cuadro de herramientas damos click derecho sobre cualquier control, el que sea y elegimos la opción "Elegir elementos...", la siguiente imagen nos ilustrará mejor



Ahora nos mostrara un cuadro de dialogo donde seleccionaremos la pestaña que dice "Componentes COM", daremos click en el botón de examinar y seleccionaremos el archivo actskin4.ocx, aceptaremos y veremos una imagen como esta donde esta el elemento recién agregado y seleccionado, luego aceptamos y regresamos al espacio de trabajo



Ahora en el cuadro de herramientas, en la sección de controles comunes, veremos 2 componentes nuevos, "ActiveSkin Control" y "SkinLabel Class", agregaremos un control ActiveSkin Control y lo arrastraremos hasta el form, de manera que la vista será como la siguiente ilustración



Ese cuadro blanco que vemos, es el control que recién agregamos, nos vamos al evento load del form dando doble click sobre este, y colocamos unas lineas donde cargaremos el archivo skn que queramos y especificaremos en form al que lo aplicaremos, el código será el siguiente

Private Sub Form1_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load

Me.AxSkin1.LoadSkin("C:\Documents and Settings\Personal\Mis documentos\
VisualStudio 2008\Projects\skinvb\skinvb\bin\Debug\BS.skn")
Me.AxSkin1.ApplyColors = True
Me.AxSkin1.ApplySkin(Me.Handle)

End Sub

como podemos ver manejamos esta sintaxis

Me.AxSkin1.LoadSkin("ruta de los archivos skn")
Me.AxSkin1.ApplyColors = True
Me.AxSkin1.ApplySkin(Me.Handle)

Con esto acabaremos el trabajo, finalmente ejecutamos el proyecto con F5 y veremos una imagen como esta




Bastante agradable, bueno el archivo para descargar incluye mas de 80 skin listos para tu proyecto, mas esta aplicación preparada para que pruebes todos los skin y escojas el de tu agrado, con esto finalizamos el articulo, espero les sea de ayuda.

Pool de conexiones en VisualBasic.net y Mysql segunda parte

Continuando con el tema anterior, en esta entrada terminamos con la pequeña aplicación de artículos, comenzamos.

Modificaremos la interfaz gráfica, agregaremos dos botones, al botón numero uno le pondremos la etiqueta "guardar", al botón 2 le pondremos la etiqueta "cancelar", el primer botón será el encargado de hacer la labor de guardado de artículos, el segundo simplemente limpiará los campos, la interfaz quedará como la siguiente imagen




Nuestra primera labor será crear un método de nombre limpia, no realizará otra tarea más que eso, limpiar los campos, su código es el siguiente

Private Sub limpia()
TextBox1.Text = ""
ComboBox1.Text = "-SELECCIONE-"
RichTextBox1.Text = ""
End Sub

Como había mencionado, la función del primer botón será la más importante, agregar, primero pasaremos por una validación pequeña, de manera que los 3 datos requeridos se encuentren dados, despues escribiremos el comando "insert", abriremos el pool, ejecutaremos el comando y finalmente devolvemos la conexión al pool, avisamos al usuario que la insercción tubo éxito y llamamos al método limpia para que realize su trabajo, el código es este

Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click

If Not TextBox1.Text.Equals("".Trim) Then
If Not ComboBox1.Text = "-SELECCIONE-" Then
If Not RichTextBox1.Text = "".Trim Then
Try
query = "insert into articulo values
(null, (select idmarca from marca where marca.marca =
'" & ComboBox1.Text & "'), '" & TextBox1.Text & "',
'" & RichTextBox1.Text & "')"

con = dbpool.Open
comando = New MySqlCommand(query, con)
comando.ExecuteNonQuery()
MsgBox("Articulo agregado")
limpia()
Catch ex As Exception
MsgBox(ex.ToString)
Finally
dbpool.Close(con)
End Try
Else
MsgBox("Agregue una descripción")
End If
Else
MsgBox("Seleccione una marca")
End If
Else
MsgBox("Agregue una artículo")
End If
End Sub
La variable comando de la clase MysqlCommand nos permite realizar esta insercción a la base de datos con el paso de dos parámetros, un query previamente realizado y una conexión abierta
El código que corresponde al botón cancelar no es mas que llamar al limpia, no tenemos más tareas para este componente, de la siguiente forma realizará su trabajo

Private Sub Button2_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button2.Click
limpia()
End Sub

Ahora nos vamos hacia la pestaña de consultas, modificaremos levemente su interfaz, únicamente agregaremos un botón, le daremos la etiqueta de "actualizar", este botón llevara acabo la labor de llenar las grillas cuando se requiera una actualización de los datos mostrados, la interfaz quedará como esto



Posteriormente definiremos un método de nombre "cargar" para que llene las grillas, ustedes me dirán el ¿Por qué? de este método si para eso agregamos el botón actualizar, la explicación es la siguiente: cuando iniciamos el programa puede que solo querramos consultar, para ahorrarnos la molestia de precionar el botón actualizar, cargaremos los datos desde el inicio de la aplicación y únicamente utilizarmos "actualizar" cuando agreguemos nuevos artículos y estos requieran ser consultados.
Antes debemos declara unas cuantas variables, el datagridview lo llenaremos con un adaptador de la clase MysqlDataAdapter, que no es más que una tabla temporal que utilizaremos como puente para pasar los datos de la base hacia el visor, nesesitaremos también un dataset y un datatable, quee aran la función de acoplar los datos del adaptador hacia el visor de datos, la forma correcta de realizar la tarea es la siguiente

Dim adaptador As New MySqlDataAdapter
Dim dataset As New DataSet
Dim datatable As New DataTable
Private Sub cargar()
Try
dataset.Clear()
query = "select " + _
" articulo.idarticulo, " + _
" articulo.articulo, " + _
" marca.marca, " + _
" articulo.descripcion " + _
"from articulo " + _
"INNER JOIN marca ON marca.idmarca = articulo.idmarca"
con = dbpool.Open
adaptador.SelectCommand = New MySqlCommand(query, con)
adaptador.Fill(dataset, "articulo")
datatable = dataset.Tables("articulo")
DataGridView1.MultiSelect = False
DataGridView1.DataSource = datatable
Catch ex As Exception
MsgBox(ex.ToString)
Finally
dbpool.Close(con)
End Try
End Sub
De primera vista nos percatamos de que nuestro adaptador, dataset y datatable son instanciados al momento de definirse bajo la palabra "New", al inicio del metodo limpiamos nuestro dataset con el método "Clear", escribimos nuestro query, utilizamos una conexión del pool, hacemos el comando con la propiedad del adaptador llamada "SelectCommand", mandamos dos parámetros, los mismos que para una variable de comando, un query y una conexión abierta, llenamos el dataset con el metodo "Fill" del adaptador, que requiere dos parámetros, un dataset y un nombre hacia la la base de datos temporal, ala que llamamos "articulos", luego pasamos los datos hacial el puente estándar de VisualBasic.net, el datatable, le pasamos los datos con la propiedad "Tables" del dataset, solo necesita como parámetro el nombre de la tabla requerida, en este caso nuestra tabla temporal se llama "articulos", finalmente le damos el origen de datos que debe mostrar el grid mediante su propiedad "DataSource" igualandola con el datatable que contine nuestros datos requeridos, finalmente devolvemos nuestra conexion al pool, por último debemos de llamar al método "cargar" desde el evento Load de nuestro form1 y desde nuestro botón actualizar, de la siguiente manera quedará el evento del botón actualizar

Private Sub Button3_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button3.Click

cargar()
End Sub

Ahora al momento de reallizar una inserrción veremos unan pantalla como esta



Cuando veamos la pestaña de consultas veremos una imagen como la siguiente



Llegamos al final de este tema, espero les agrade y sobre todo ocupen esta opción de conexión hacia una base de datos en sus proyectos, puede hacelerar sus consultas hasta en un 90% y si usan JOINS en sus querys sera aun mas rápido, definitivamente es una gran opción.

Descargar el proyecto completo y la base de datos aquí.


Pool de conexiones en VisualBasic.net y Mysql

Si analizaramos los recursos gastados por la computadora, al momento de ejecutar un query a una base de datos, la mayoría de los recursos se gastan en el momento en que la la aplicación se conecta al gestor que empleamos, si ejecutaramos múltiples conexiones a la ves, dado que tubieramos una aplicación en red por ejemplo, malgastariamos la memoria del servidor, así como la de los clientes y sufririamos por errores de falta de memoria o nuestras consultas de retrasarían, sin embargo el proceso es correcto, conectamos, ejecutamos y finalmente desconectamos, es correcto, pero en algunos casos no es suficiente, una alternativa a estos casos es crear un pool de conexiones, este concepto trabaja de la siguiente manera:

Generamos un grupo de conexiones, cada vez que una acción de la aplicación requiera una conexión a la base de datos, esta tomará una conexión del conjunto que tenemos, una vez que la desocupe, la devolverá al pool. De esta manera no cramos objetos de conexion a cada momento, asi ahorramos memoria de clientes y servidor y mejoramos la velocidad de nuestros querys hacia la base de datos. A continuación realizaremos una pequeña aplicación, donde manejaremos los artículos de computo, software e impresión de una tienda, implementando este concepto de pool de conexiones.

Esta modesta aplicación tendrá la posibilidad de insercción, consulta y modificación de articulos, las herramientas necesarias son las siguientes:


  • VisualBasic.Net 2008 Express Edition

  • Mysql Server 5.0 o superior
En mysql creamos una base de datos con el nombre "dbarticulos", crearemos las tablas marca y articulos, marca con los atributos idmarca, marca y descripcion y artuculos, con idarticulo, idmarca, artículo y descripcion, nuestro enlace será idmarca, asi que será nuestra llave foranea, el escript el es siguiente:

CREATE TABLE `dbarticulos`.`marca` (
`idmarca` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`marca` VARCHAR(45) NOT NULL,
`descripcion` VARCHAR(45) NOT NULL,
PRIMARY KEY (`idmarca`)
)
ENGINE = InnoDB;

CREATE TABLE `dbarticulos`.`articulo` (
`idarticulo` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`idmarca` INTEGER UNSIGNED NOT NULL,
`articulo` VARCHAR(45) NOT NULL,
`descripcion` VARCHAR(45) NOT NULL,
PRIMARY KEY (`idarticulo`),
CONSTRAINT `FK_articulo_1` FOREIGN KEY `FK_articulo_1` (`idmarca`)
REFERENCES `marca` (`idmarca`)
ON DELETE RESTRICT
ON UPDATE RESTRICT
)
ENGINE = InnoDB;
Una vez creada la base de datos, insertaremos los siguientes valores en la tabla "marca"


idmarca marca descripcion
------------------------------------------------------
1 HP impresoras y computadoras
2 Microso.. software y computadoras
3 Appl. computadoras
------------------------------------------------------

Creamos un nuevo proyecto en vb.net, una aplicación para Windows, al que llamaremos "polldbarticulos", una vez creado agregaremos una clase a el proyecto, con el nombre "dbpool", luego agregaremos las referencias necesarias en nuestro esplorador, click derecho y elegímos agragar referencia, nos desplegara la siguiente pantalla:



Una ves agregada, vamos hacia la clase dbpool, importamos las librerías de MySql.Data.MySqlClient, posteriormente declaramos una variable de tipo String que será nuestra cadena de conexión y una variable de tipo MysqlConnection, ambas serán estáticas; finalmente declararemos dos metodos, uno sub y otro function, la clase final quedará de la siguiente manera:

Imports MySql.Data.MySqlClient
Public Class dbpool
Private Shared cadena As String = "Server=localhost;
User Id=root;Password=tupassword;Persist Security Info=True;
Database=dbarticulos"

Public Shared con As MySqlConnection
Public Shared Function Open() As MySqlConnection
Try
con = New MySqlConnection(cadena)
con.Open()
Catch ex As Exception
Close(con)
MsgBox("Error" & ex.ToString)
End Try
Return con
End Function
Public Shared Sub Close(ByVal con As MySqlConnection)
If con.State = ConnectionState.Open Then
Try
con.Close()
con = Nothing
Catch ex As Exception
MsgBox("Error" & ex.ToString)
End Try
End If
End Sub
End Class


Notese que en la función Open, creamos las conexiones disponibles y también las abrimos y finalmente las devolvemos para ser utilizadas, en el metodo Close, verificamos si la conexión esta en uso; si es así, la cerramos; si ya esta cerrada la devolvemos al pool; la parte gráfica es sencilla, agregaremos un control de Tabs con 2 pestañas, una de Alta y otra de Consulta, en la parte de Alta quedará de la suguiente manera:


Finalmente en el evento Load del Frame, seleccionaremos todas las marcas de la base de datos, con un elemento MysqlConnection, MysqlCommand, MysqlDataReader y un String para escribir nuestros querys, pero no es como de costrumbre, el siguiente código nos dira la manera correcta:

Imports MySql.Data.MySqlClient
Public Class Form1
Dim con As MySqlConnection
Dim query As String
Dim comando As MySqlCommand
Dim lector As MySqlDataReader
Private Sub Form1_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load

Try
query = "select marca from marca"
con = dbpool.Open
comando = New MySqlCommand(query, con)
lector = comando.ExecuteReader
While lector.Read
ComboBox1.Items.Add(lector.GetString(0))
End While
dbpool.Close(con)
Catch ex As Exception
MsgBox(ex.ToString)
Finally
lector.Close()
End Try
End Sub
End Class

Notese que con la lí nea con = dbpoll.Open ya tenemos una conexión del pool automaticamente y con la línea dbpool.Close(con), devolvemos la conexión al conjunto que tenemos de estas, lo demás es lo de siempre, con esto no debemos de tener ningún tipo de problema, una vez que probemos la aplicación, veremos una imagen parecida a esta:


Este es el fin del primer artículo, en el siguiente veremos la inserción de datos. Si quieres pudedes bajar el proyecto hasta este punto para aclarar todas tus dudas aquí.