Escrito en Febrero 26, 2009 por Alex
En .Net podemos trabajar con hebras independientes de ejecución en las aplicaciones es decir, que una o varias hebras en el programa pueden compartir ciclos del procesador.
Al trabajar con hebras podemos también tener control sobre ellas, suspenderlas, cancelarlas y otras funciones.
En el post anterior les explicaba que podemos encontrarnos con un problema que no podíamos solucionar en versiones anteriores de visual basic, que sucedía cuando al presionar un botón (como el ejemplo de enviar un correo con archivos adjuntos), el proceso que iniciaba se tardaba más de los esperado y no podíamos cancelarlo porque acaparaba todos los recursos del sistema y aunque existiera un botón que cancelara el proceso, no podíamos verlo porque el programa parecía estar bloqueado o congelado.
Al situar el proceso dentro de una hebra podemos seguir actuando con el formulario.
Para esto utilizamos la clase Thread dentro del espacio de nombres Threading
Estos son algunos métodos de la clase Thread:
- Start: Hace que se programe un subproceso para su ejecución.
- Sleep: Bloquea el subproceso actual durante el número de milisegundos especificado.
- Abort: Cancela la ejecución de la hebra.Para iniciar un hebra
Primero hay que importar el espacio de nombres System.Threading, después crear el objeto de tipo Thread.
Imports System.Threading
Private Sub btnEnviar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnviar.Click
'Instanciar la hebra
Dim oHebra As Thread
'crear objeto y asignarlo al sub que queremos ejecutar
oHebra = New Thread(AddressOf EnviarMail)
'ponerla en marcha
oHebra.Start()
End Sub
Para ver mejor este ejemplo, pongo en el siguiente link un ejemplo de un formulario para envío de correo por SMTP que es la parte completa del post anterior y esta programado con hebras, con barra de progreso y con opción de enviar archivos adjuntos y usando autenticación.
Ejemplo Mail desde Visual Basic 2008
Ejemplo Mail desde Visual Basic 2005
Algunas capturas de pantalla:

Mail desde Vb.Net

Envio de correo desde visual basic .net


(1 rating, 1 votes)

Loading ...
Posteado en Visual Basic.Net | Comenta Ahora!
Escrito en Febrero 25, 2009 por Alex
El envio de correo desde Visual Basic .Net se puede llevar a cabo de una manera muy sencilla.
En este ejemplo utilizamos el espacio de nombres System.Net.Mail, un objeto del tipo MailMessage y otro del tipo SmtpClient.
Algunas propiedades del objeto SmtpClient:
- Host: Obtiene o establece el nombre o la dirección IP del host que se utiliza para las transacciones SMTP
- Port: Obtiene o establece el puerto utilizado para las transacciones SMTP.
- EnableSsl: Especifique si el objeto SmtpClient utiliza SSL (Secure Sockets Layer) para cifrar la conexión.
- TimeOut: Obtiene o establece un valor que especifica el intervalo de tiempo a partir del cual se considera que una llamada a Send sincrónica excede el tiempo de espera.
- Credentials: Obtiene o establece las credenciales utilizadas para autenticar al remitente. (Es decir, usuario y password)
Continar leyendo! »


(1 rating, 1 votes)

Loading ...
Posteado en Visual Basic.Net | Comenta Ahora!
Escrito en Febrero 12, 2009 por Alex
En ocasiones necesitamos saber si estamos conectados a Internet para que nuestra aplicación pueda descargar actualizaciones o conectarse a algún sitio y así evitar errores.
Para esto vamos a hacer uso del espacio de nombres My que es la clase que se utiliza para realizar operaciones de red y de internet.
Utlizamos el método IsAvailable para saber si estamos conectados a la red y una vez realizada la prueba de red, hacemos un Ping a un sitio que sabemos que siempre estara activo como Google.
Aquí está el código completo:
'si está dentro de la red
If My.Computer.Network.IsAvailable Then
Try
'hace ping a google
If My.Computer.Network.Ping("google.com") Then
'y da respuesta
MsgBox("Está conectado a Internet")
End If
Catch ex As Exception
'en caso de no obtener respuesta del ping
'asume que no estamos conectados a internet
MsgBox("No está conectado a Internet")
End Try
Else
'en caso de no estar dentro de la red
MsgBox("Esta fuera de una red")
End If
End Sub


(-1 rating, 1 votes)

Loading ...
Posteado en Visual Basic.Net | Comenta Ahora!
Escrito en Febrero 7, 2009 por Alex
La estructura Char nos permite determinar si un caracter pertenece a determinada categoría unicode, es decir, si un caracter es una letra, un número, si es mayúscula, si es minúscula, espacio en blanco etc.
Para lograr que un textbox admita solo letras, necesitamos codificar el evento KeyPress del control Textbox que es el evento que se dispara en el momento que se pulsa el teclado y utilizamos el método IsLetter de Char.
Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
'si el caracter es Letra
If Char.IsLetter(e.KeyChar) Then
'acepta el cracter
e.Handled = False
'si es un caracter de control como Enter
ElseIf Char.IsControl(e.KeyChar) Then
e.Handled = False
'si es un espacio en blanco
ElseIf Char.IsSeparator(e.KeyChar) Then
e.Handled = False
Else
' de lo contario al poner e.handled en True
'cancelamos la pulsación.
e.Handled = True
End If
End Sub
Acerca del E.handled
Si asignamos a E.handled un valor verdadero, le estamos indicando a .Net que nosotros ya hemos manejado esta tecla y por lo tanto la ignora.
Para admitir números en vez de letras utilizamos la misma estructura solo que ahora vamos a cambiar el método IsLetter por IsDigit.
Si queremos cambiar un caracter tecleado por otro, por ejemplo: Si queremos que cada vez que el usuario tecleé la letra “a” se escriba la letra “A” (mayúscula) no podemos cambiar el valor de Keypress porque es de solo lectura, lo que tenemos que hacer es poner valor verdadero al Handled, y utilizar la clase SendKeys.
If e.KeyChar = "a" Then
e.Handled = True
SendKeys.Send("A")
End If
Y para pasar de minúsculas a mayúsculas todas las letras pulsadas en el control:
If Char.IsLower(e.KeyChar) Then
e.Handled = True
SendKeys.Send(Char.ToUpper(e.KeyChar))
End If


(4 rating, 4 votes)

Loading ...
Posteado en Visual Basic.Net | Comenta Ahora!
Escrito en Enero 12, 2009 por Alex
El control ListView de Visual Basic.Net no tiene ningún método que nos ayude a reordenar los Items que no sea de una manera alfabética con solo arrastrar y soltar un elemento.
Necesitamos insertar el ListView que en este ejemplo lleva en su propiedad Name o Nombre: List1, la propiedad View la ponemos en Details, le agregamos una columna con el nombre que deseen y en el evento Load del formulario le agregamos algunos Items de prueba:
Continar leyendo! »


(2 rating, 2 votes)

Loading ...
Posteado en Visual Basic.Net | Comenta Ahora!
Escrito en Enero 6, 2009 por Alex
Cual sería la manera correcta de almacenar archivos como imágenes y documentos para un programador?
Algunas técnicas consisten en guardar solo la ruta o el Path del archivo y depués solo decirle a la aplicación que lo abra, ya que almacenarlo en la base de datos, podría ocasionar que la BD se alente al procesar la información, es decir, afectaría el “performance”.
Pero a veces se necesita seguridad en la aplicación y la mejor opción no siempre es la misma, así que en lo posible, no se deberian de almacenar archivos en una BD a menos que sea necesario.
Aquí pongo el ejemplo de como almacenar un documento, que en este caso sería PDF pero que aplica igual para otro tipo de archivos.
Necesitamos insertar dos botones de comando, un Control OpenFileDialog, y un PDF Browser Control. Este control se agrega desde el menú “Elegir elementos” del cuadro de controles y se llama Adobe PDF Reader y esta en la ficha “Componentes COM”.
Omito la manera de hacer las referencias al conector Mysql y algunos comentarios de explicación porque ya están explicados en anteriores posts.
Imports System.Data
Imports MySql.Data.MySqlClient
Imports System.IO
Public Class Form1
Dim RutaPDF As String
#Region "variables y objetos"
Dim ConStr As String = "server=localhost;uid=miuser;password=mipass;database=mibase"
Dim Sql As String = "Select pdf from archivo where id='1'"
Dim Con As New MySqlConnection(ConStr)
Dim Comando As New MySqlCommand(Sql, Con)
Dim Dr As MySqlDataReader
'variable de datos
Dim bDatos() As Byte
'variable de imagen
Dim iImagen As File
#End Region
#Region "Funciones para tratar archivos PDF"
'convertir PDF a Binario
Public Function PDF_Bytes(ByVal Path As String) As Byte()
Dim sPath As String
sPath = Path
Dim Ruta As New FileStream(sPath, FileMode.Open, FileAccess.Read)
Dim Binario(CInt(Ruta.Length)) As Byte
Ruta.Read(Binario, 0, CInt(Ruta.Length))
Ruta.Close()
Return Binario
End Function
'convertir binario a PDF
Private Sub Bytes_PDF(ByVal Bin As Byte())
Dim oFileStream As FileStream
Dim pathTemporal As String = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) & "\Dato.pdf"
If File.Exists(pathTemporal) Then File.Delete(pathTemporal)
oFileStream = New FileStream(pathTemporal, FileMode.CreateNew)
oFileStream.Write(Bin, 0, Bin.Length)
oFileStream.Close()
oFileStream = Nothing
AR1.LoadFile(pathTemporal)
If File.Exists(pathTemporal) Then File.Delete(pathTemporal)
End Sub
Public Function UpdateBD(ByVal Sql As String, ByVal Data() As Byte) As String
Dim Comando As New MySqlCommand(Sql, Con)
Comando.Parameters.AddWithValue("?archivo", Data)
Try
If Not Con Is Nothing Then Con.Close()
Con.Open()
Dim res As Integer = Comando.ExecuteNonQuery()
Return res.ToString
Catch ex As Exception
Return ex.Message
Finally
Con.Close()
Comando = Nothing
End Try
End Function
#End Region
'Esto ocurre en la carga del formulario
'y solo se ejecuta cuando ya existe un archivo en la BD
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Si no hay conexión activa se establece conexión con la BD
'siempre capturando errores con try
Try
If Not Con Is Nothing Then Con.Close()
Con.Open()
'Una vez establecida la conexión ejecutamos la Query
'asignando el resultado al objeto MysqlDataReader
Dr = Comando.ExecuteReader
'Mientras este leyendo, cada resultado que por la Query
' no es mayor a uno
While Dr.Read
'lo guardamos en una variable de tipo array de bytes
'y convertimos en byte el resultado por si tenemos
'activado Option Strict en ON
bDatos = CType(Dr("pdf"), Byte())
'si la consulta no genera datos salimos del Sub
If bDatos.Length = 0 Then Exit Sub
'SI HAY DATOS
'al ser datos binarios, los convertimos a PDF
'con una funcion que hicimos llamada bytes_PDF
'asignandolo a la variable de datos
Bytes_PDF(bDatos)
End While
'en caso de error mostramos el mensaje
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'utilizamos el OPenFileDialog para seleccionar PDFs
'Establecemos titulo a mostrar
Me.OpenFileDialog1.Title = "Seleccionar Documento"
'aquí por ser PDF les recomiendo abrir por default la carpeta
'Mis Documentos y utilizamos una variable de entorno de windows
'Enviroment.SpecialFolder.MyDocuments apunta a Mis Documentos
Me.OpenFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
'filtramos solo Archivos PDF
'siempre es recomendable filtrar para evitar errores al seleccionar archivos
Me.OpenFileDialog1.Filter = "Archivos de imágen(*.pdf)|*.pdf"
' abrir el diálogo
Me.OpenFileDialog1.ShowDialog()
End Sub
'AQUI UTILIZAMOS EL EVENTO FILE_OK
'PARA SABER EN QUE MOMENTO YA SE SELECCIONO UNA IMAGEN
Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
'Asignar ruta y mostrar Documento
RutaPDF = OpenFileDialog1.FileName
AR1.LoadFile(RutaPDF)
End Sub
'Y EN ESTE EVENTO DEL BOTON GUARDAMOS LA IMAGEN EN LA BD
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Try
'si se seleccionó archivo
If OpenFileDialog1.FileName <> "" Then
'variable para datos
Dim PDF() As Byte
'convertir PDF a binario
'y guardar en variable
PDF = PDF_Bytes(RutaPDF)
'guardar la imagen en BD con parametros utilizando una funcion para guardar
'llamada UpdateBD
Dim res As String = UpdateBD("UPDATE archivo SET pdf=?archivo WHERE id='1'", PDF)
'aqui comprobamos si se modifico algun campo
If res = "1" Then
MsgBox("Archivo guardado")
Else
MsgBox("Archivo no se guardó")
End If
End If
Catch ex As Exception
End Try
End Sub
End Class
Un archivo muy grande superaría la capacidad del campo de Mysql y no se guardaría el archivo.
Nota: El campo LongBlob de Mysql debe existir con un dato aunque sea null ya que la sentencia usada no es INSERT sino UPDATE.


(1 rating, 1 votes)

Loading ...
Posteado en Visual Basic.Net | Comenta Ahora!