23 dic 2008

Tipos anónimos en .Net

Los tipos anónimos son una nueva característica de .Net que utilizada junto a LINQ nos brinda grandes ventajas a la hora de escribir nuestro código.

Primero que nada, deberemos chequear que la opción Option Infer esté habilitada en nuestro proyecto. Para ello iremos a Propiedades del proyecto, en la pestaña Compilación. Por supuesto, al principio podremos tener algunos problemas si también utilizamos la opción Option Srtict, pero es cuestión de costumbre.

Volviendo a los tipos anónimos, al escribir una sentencia en LINQ, podremos definirnos una variable sin tipo y a pesar de ello tener intellisense.

Por ejemplo:

//C#
var hola = from x in myDdatacontext.table1
where x.id > 20
select x;


'VB.Net

Dim Hola = From x in MyDataContext.Table1 _
Where x.Id > 20 _
Select x


En realidad nuestras variables Hola, tomarán, en este caso el tipo IQueriable(Of Table1) con lo cual podremos ir navegando a través de los items devueltos por la consulta.

Suponiendo que Table1 tiene los campos Id, Nombre y Apellido, al escribir x. el intellisense nos mostrará como proiedades Id, Nombre y Apellido. Y de igual manera, cuando recorremos nuestras variables de tipos anónimos podremos ver el intellisense y acceder a cada propiedad, por ejemplo:

'VB.Net
For Each x in Hola
Console.Writeline(String.Format("ID: {0} Nombre: {1} Apellido: {2}", x.Id, x.Nombre, x.Apellido))
Next


Otra forma, sería si quisiéramos devolver el primer elemento del resultado de la consulta, entonces:

' VB.Net
Return Hola.First

22 nov 2008

Microsoft Beginner Developer Learning Center

Microsoft ha publicado una serie de tutoriales y videos orientados a los nuevos programadores, la idea es enseñarles programación utilizando la serie Express de herramientas para programar .Net.

11 sept 2008

Nueva Academia Virtual de Microsoft

Microsoft Virtual Academy - mva

Microsoft ha lanzado una nueva Academia Virtual llamada Microsoft Virtual Academy. En la misma presentan cursos para aprender y para actualizarse seleccionando una carrera, igual que una academia real.

MVA es una forma gratuita de capacitarse, puediendo anotarte en varios cursos y carreras, en los cuales irás obteniendo puntos según tu desempeño con los cuales podrás solicitar una membresía, obtener descuentos y varios beneficios más.

Enlace: mva

28 ago 2008

Como mostrar un dialogo de confirmación antes de cerrar la ventana

Es lo más común, se va a cerrar una ventana, pero se han editado datos y no se han guardado. En ese caso es muy conveniente utilizar un diálogo con los botones Si, No, Cancelar, los cuales utilizaremos para Guardar los cambios, Descartarlos o cancelar el cerrado de la ventana respectivamente.

Lo primero que necesitamos es alguna rutina o bandera que nos indique si se han realizado cambios en nuestra ventana, para este ejemplo será una variable de tipo Boolean que se seteará en True cada vez que se modifique un dato.

Luego escribiremos una rutina en el manejador del evento FormClosing de nuestro Form que mostrará el diálogo y dependiendo de la respuesta del usuario realizará una acción:

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If Me.HayCambios Then
Dim respuesta As DialogResult = MessageBox.Show("Hay cambios pendientes, desea guardarlos antes de salir?", "Cambios pendientes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
Select Case respuesta
Case Windows.Forms.DialogResult.Yes
Me.GuardarArchivoComo()
Case Windows.Forms.DialogResult.No
'Descartar los cambios
Case Windows.Forms.DialogResult.Cancel
e.Cancel = True
End Select
End If
End Sub


Mostrar un diálogo de confirmación antes de cerrar la ventana

21 ago 2008

Función recursiva para limpiar todas las cajas de texto de un Form

Siempre es necesario limpiar cajas de texto en un form, por ejemplo después de cierta acción queremos dejar todas las cajas de texto vacías... pues qué mejor que tener una función que las busque todas??

Public Sub LimpiarCajas(Controls as System.Windows.Forms.Control.ControlCollection)
For each c as Control in Controls
If Not c.Controls Is Nothing AndAlso c.Controls.Count > 0 Then
LimpiarCajas(c.Controls)
ElseIf c.GetType().Equals(GetType(TextBox)) Then
CType(c, TextBox).Text = ""
End If
Next
End Sub


Este procedimiento puede ser muy útil si se lo ubica en un módulo público, de manera que pueda ser utilizado desde cualquier parte de nuestra aplicación. Aunque si trabajan con el framework 3.5 pueden utilizar métodos de extensión como explican en Nuevos Programadores.

13 ago 2008

Como usar ErrorProviders para informar al usuario

Un ErrorProvider es un componente que se utiliza para informar al usuario de manera gráfica que ha ocurrido un error, en lo personal me gusta utilizarlo para mostrar errores de validación, por ejemplo cuando el usuario deja en blanco un campo obligatorio, ingresa letras en un campo numérico, etc.

Lo que hacemos es agregar un ErrorProvider a nuestro Form, desde el tab "Componentes" nuestra Toolbox. Luego cada vez que hacemos una validación, o cuando deseemos mostrar que hubo un error en cierto control, utilizamos el método SetError(control as System.Windows.Forms.Control, value as String) del objeto ErrorProvider.

Donde ubicar el componente ErrorProvider

Por lo tanto una función de validación de 2 campos obligatorios que muestre un ErrorProvider cuando el usuario no complete un campo se vería de la siguiente manera:

Private Function ValidarDatos() As Boolean
Dim resultado As Boolean = False

Me.ErrorProvider1.Clear() ' "Limpliamos" el ErrorProvider para que oculte los errores anteriores

If Me.ComboBox1.SelectedIndex <> -1 Then ' Si seleccionó un item del ComboBox
If Me.TextBox1.Text <> "" Then ' Si ingresó algo en la TextBox
'Hacer más validaciones o controles
resultado = True
Else
Me.ErrorProvider1.SetError(Me.TextBox1, "Debe ingresar un valor.") ' Muestra el ErrorProvider asociado al control TextBox1
End If
Else
Me.ErrorProvider1.SetError(Me.cmbField1, "Debe seleccionar una propiedad.")
End If

Return resultado
End Function


Como usar un ErrorProvider en VB.NET

30 jul 2008

Inicializar un thread, capturar eventos y usar Invoke (VB.NET)

En este ejemplo haremos una aplicación que al presionar un botón creará un thread aparte que "hará algo", en este caso no hará nada, solo hará tiempo, pero éste thread lanzará un evento al inicio y otro al fin de su ejecución, nosotros capturaremos esos eventos y los mostraremos en pantalla.

Como la interfaz de usuario y el thread obviamente pertenecen a distintos hilos, será necesario utilizar un Delegate con el método Invoke del control que utilizaremos, de lo contrario tendremos una InvalidOperationException por CrossThread

Lo primero que haremos será asignar los manejadores a los eventos que hemos declarado anteriormente, para eso utilizaremos AddHandler y AddressOf.

#Region " Eventos de Thread y sus handlers"
Private Event InicioThread(ByVal Inico As DateTime)
Private Event FinThread(ByVal Fin As DateTime)

Private Trabajando As Boolean = False

Public Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
AddHandler InicioThread, AddressOf App_InicioThread
AddHandler FinThread, AddressOf App_FinThread
End Sub

Private Sub App_InicioThread(ByVal Inicio As DateTime)
Trabajando = True
If TextBox1.InvokeRequired Then
TextBox1.Invoke(New MostrarEnTextBox_Delegate(AddressOf MostrarEnTextBox), TextBox1, Inicio.ToString())
Else
MostrarEnTextBox(TextBox1, Inicio.ToString())
End If
If TextBox2.InvokeRequired Then
TextBox2.Invoke(New MostrarEnTextBox_Delegate(AddressOf MostrarEnTextBox), TextBox2, "Todavía haciendo algo...")
Else
MostrarEnTextBox(TextBox2, "Todavía haciendo algo...")
End If
End Sub

Private Sub App_FinThread(ByVal Fin As DateTime)
Trabajando = False
If TextBox2.InvokeRequired Then
TextBox2.Invoke(New MostrarEnTextBox_Delegate(AddressOf MostrarEnTextBox), TextBox2, Fin.ToString())
Else
MostrarEnTextBox(TextBox2, Fin.ToString())
End If
End Sub
#End Region


Como se puede ver en los maejadores de eventos utilizamos un Delegate del método que inserta el texto en las TextBox, eso es porque requiere parámetros, sino lo hubiésemos podido hacer directamente usando AddressOf.
Así que lo siguiente será crear el método que ingresa texto en las TextBox y su correspondiente Delegate.

#Region " Delegate para Invoke "
Private Delegate Sub MostrarEnTextBox_Delegate(ByVal txt As TextBox, ByVal str As String)

Private Sub MostrarEnTextBox(ByVal txt As TextBox, ByVal str As String)
txt.Text = str
End Sub
#End Region


Como dice al principio del post, ésta aplicación tiene un botón que es el que inicia un nuevo hilo, así que agregaremos el botón y en el evento click llamaremos a un método que creará e iniciará el nuevo Thread. Adicionalmente, tenemos un flag para que no permitir la creación de más de un hilo por vez, su valor se cambia con los eventos del Thread.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Not Trabajando Then
InicializarThread()
Else
MessageBox.Show("Hay un 'hilo haciendo' algo aún. Intente nuevamente en unos segundos.", "Hilo trabajando", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub

#Region " Thread "
Private Sub InicializarThread()
Dim t As New Thread(AddressOf HacerAlgo)
t.Name = "Thread_HacerAlgo"
t.IsBackground = True
t.Start()
End Sub

Private Sub HacerAlgo()
RaiseEvent InicioThread(DateTime.Now)
For i As Byte = 0 To 254
Thread.Sleep(30)
Next
RaiseEvent FinThread(DateTime.Now)
End Sub
#End Region


29 jul 2008

Como abrir una web en el navegador por defecto

Este es un tip pequeño, simplemente lanzaremos un proceso con la URL a abrir, el Sistema Operativo se encargará de usar la aplicación por defecto para manejar la URL, en nuestro caso un navegador web.



Para probarlo crearemos una nueva aplicación de Winforms y en el form que se crea por defecto agregaremos un LinkLabel, al cual pondremos como texto la URL que queremos abrir, aunque puede ser cualquier texto, en nuestro ejemplo utilizaremos el texto de la etiqueta para ejecutar el proceso.


Ahora nos resta programar el evento Click del LinkLabel para que lance el proceso:


Private Sub lnkAprendiendoNet_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles lnkAprendiendoNet.LinkClicked
Process.Start(lnkAprendiendoNet.Text)
End Sub

23 jul 2008

Implementación de Singleton y manejo de hilos en C#

Via NuevosProgramadores.com me encuentro con 2 artículos, uno donde explican como implementar el patrón Singleton y otro donde explican el manejo de hilos y delegates. Todo está implementado en C# y se puede descargar el código fuente del ejemplo.

Link: Implementación de Singleton en C#

Link: Manejo de hilos en C# + delegates + invoke

17 jul 2008

Hola Mundo, la primera aplicacion

Como es clásico en el mundo de la programación, lo primero que haremos será el clásico Hola Mundo!

En esta ocasión utilizaremos una Aplicación de Consola en lenguaje VB.Net, para ello iremos a crear un nuevos proyecto y seleccionaremos Visual Basic y Console Application.


Nueva aplicación de consola

Eso nos creará la aplicación y automáticamente agregará un módulo con el procedimiento que se ejecutará al iniciar la aplicación.

Module Module1

Sub Main()

End Sub

End Module


A continuación agregaremos 2 líneas, la primera se encargará de escribir en nuestra consola el texto Hola Mundo!, y la segunda esperará a que el usuario presione una tecla para continuar la ejecución del código... que en este caso llevará al final de la aplicación.

Module Module1

Sub Main()
Console.WriteLine("Hola Mundo!")
Console.Read()
End Sub

End Module


Y así de simple hemos escrito nuestra primera aplicación en .Net, ahora sólo resta ejecutarla, para lo cual presionaremos la tecla F5.

Hola Mundo, nuestra primera aplicación de consola

11 jul 2008

Que es el .net framework?

Sólo una breve introducción, por si alguien aún no está familiarizado con ésta tecnología.

.Net Framework es una plataforma de desarrollo de software que Microsoft lanzó al mercado como respuesta a la creciente couta del mercado que está tomando la tecnología Java de Sun Microsystems.

Se trata de un conjunto de utilidades que gracias a la norma, (incluída en ECMA-335, ISO/IEC 23271), que define la implementación de BCL, permite su implementación en varias plataformas; una de ellas es Mono, un proyecto que pretende ser la implementación libre de .Net para GNU/Linux.

A grandes rasgos, el framework permite el desarrollo de aplicaciones en varios lenguajes gracias al CLR. Básicamente, todo se compila en un lenguaje intermedio, que es compatible con CLR, llamado MSIL, el cuál está basado en CLS.

Luego para ejecutar las aplicaciones se utiliza un compilador JIT el cual ejecuta el código máquina real en la máquina del cliente, lo cual permite independencia con respecto a la arquitectura.

En la imagen se puede ver la estructura básica del .Net Framework.

Estructura básica del framework

Fuente: Wikipedia