domingo, 8 de septiembre de 2013

Agregar Fecha y Reloj digital en nuestro Form

En ocasiones es necesario colocar la fecha en nuestro form, esto es muy sencillo. Para hacer esto requerimos de 2 labels, uno para la fecha y el otro para el reloj, o ocupar uno solo, y concatenar ambos.

Sin concatenar:
        lblHora.Text = Format(Now(), "Long Time")
        lblFecha.Text = Format(Now(), "Long Date")
Concatenado

lblHoraAndDate.Text = Format(Now(), "Long Time") & " | " & Format(Now(), "Long Date")
NOTA: Si queremos tener esto en tiempo real, tenemos que agregar un timer en nuestro form y agregar el codigo dentro del timer, recuerda que debes activar este reloj en su propiedad Enable = True. El intervalo de nuestro Timer debera de ser 1000 ms = 1 segundo.


Mover PictureBox con el mouse y con teclado

Una aplicación muy común es construir un visor de imágenes como el de Windows. El primer requisito de un visor es que en este sea posible hacer zoom a nuestra imagen, sin embargo, el Basic no nos ofrece ninguna herramienta para hacer esto (a menos a simple vista no).
La solución a nuestro problema es hacer el picturebox mas grande, es decir, que en su propiedad Size tendríamos que cambiar las dimensiones para que la imagen se expandiera, quedando como sigue:

PictureBox1.Size = New System.Drawing.Size(x, y)
Donde "x" y "y" son las dimensiones de nuestro picturebox (largo y ancho respectivamente). Aparentemente hemos solucionado el problema del zoom, sin embargo, intente usted mover la imagen ¿Puede?

Si usted quiere intentarlo me parece perfecto, pero para ahorrarle tiempo yo le diré que en efecto no es posible, por mas que intente mover la imagen para poder ver el resta, usted no podrá. He aquí nuestro gran problema, si bien existen dos formas de solucionarlo, y comenzare por la mas sencilla.

Mover PictureBox con el teclado (flechas de dirección)

Para mover nuestra imagen en zoom que ya tenemos en pantalla después de aplicar nuestro código anterior, solo basta clickear en la propiedad KeyDown de nuestro form, y llamar a la propiedad e.KeyCode y asignar las teclas para mover nuestro picturebox:

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles SplitContainer1.KeyDown

Select Case e.KeyCode
                Case Keys.Up
         Me.PictureBox1.Location = New Point(Me..PictureBox1.Location.X, Me..PictureBox1.Location.Y + 10)

                Case Keys.Down
         Me.PictureBox1l.Location = New Point(Me..PictureBox1.Location.X, Me..PictureBox1.Location.Y - 10)

                Case Keys.Left
         Me.PictureBox1.Location = New Point(Me..PictureBox1.Location.X + 10, Me..PictureBox1.Location.Y)

                Case Keys.Right
         Me.PictureBox1.Location = New Point(Me..PictureBox1.Location.X - 10, Me..PictureBox1.Location.Y)

            End Select
End sub

Las primeras dos lineas (Keys.Up y Keys.Down) son necesarias para mover el picturebox a lo largo del eje Y de nuestro form, la magnitud 10 nos indica, cuando se desplazar hacia arriba o hacia abajo, cada vez que se presione la tecla correspondiente. Homologamente para Left y Right ocurrira lo mismo. Observe que si vamos a desplazar Qel picturebox alrededor del eje Y, X no es modificado y no se le agrega una magnitud, poner "Me..PictureBox1.Location.X" es igual que poner "Me..PictureBox1.Location.X+0".

Mover PictureBox con el mouse (dar click sobre la imagen y después desplazarla)

Lamentablemente mover un picturebox, un form u otra cosa con el mouse no es tan sencillo, pues requiere llamar ciertas librerias, y después aplicar nuestro ingenio, no explicare a detalle el procedimiento pues requiere demasiada explicacion, sim embargo, les compartiré el código.


  • El primer paso es llamar las librerias en la parte donde usted declare sus variables a utilizar.

Private Const WM_NCLBUTTONDOWN = &HA1
    Private Const HTCAPTION = 2
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                 (ByVal hwnd As Integer, ByVal wMsg As Integer, _
                  ByVal wParam As Integer, ByVal lParam As String) As Integer
    Private Declare Sub ReleaseCapture Lib "user32" ()


  • El segundo paso es ingresar a la propiedad mousemove de nuestro form y poner lo siguiente:

            Dim lHwnd As Int32
            lHwnd = ptcGeneral.Handle
            If lHwnd = 0 Then Exit Sub
            ReleaseCapture()
            SendMessage(lHwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&) 

Finalmente queda ejecutar nuestro programa y ver lo que ocurre :)

sábado, 7 de septiembre de 2013

Archivo de imagen se bloquea cuando es establecida la propiedad PictureBox

Un problema común en el Basic es cuando deseamos visualizar una imagen en un PictureBox, pero al mismo tiempo esta imagen se debe actualizar (es decir sobrescribir) cada cierto intervalo de tiempo.
Usualmente usaríamos el siguiente codigo:

PictureBox.Image = Image.FromFile("C:\Users\Images\Imagen.jpg")

Sin embargo al usar este código nos encontramos con un conflicto, y como lo dije lineas arriba, el principal conflicto es que en el tiempo de ejecución de nuestro programa, no podemos hacer uso del archivo (No podemos actualizarlo ni suprimirlo) debido a que se encuentra en uso por el picturebox, es decir, es como si este item abriera un visor de windows y estuviera visualizándose ahí, solo que en este caso lo vemos mediante nuestro picturebox.

Para evitar este problema, tenemos que utilizar el objeto FileStream como sigue:

Dim fs As System.IO.FileStream
fs = New System.IO.FileStream("C:\Users\Images\Imagen.jpg", 
     IO.FileMode.Open, IO.FileAccess.Read)
PictureBox.Image = System.Drawing.Image.FromStream(fs)
fs.Close()
De esta manera estaríamos solucionando el conflicto mencionado anteriormente, y ahora la imagen podrá ser utilizada por terceros mientras estamos ejecutando nuestro visor

viernes, 6 de septiembre de 2013

Visual Basic: Técnicas basicas

Iniciare esta sección con cuestiones practicas, y dando por entendido que el usuario ya tiene conocimientos del lenguaje, es decir, solo algunas técnicas que facilitan el diseño del software en el Basic.

Descargar archivos de la red.

Es común diseñar un proyecto donde se nos pida que bajemos archivos de la red y almacenarlos en algún medio de almacenamiento del ordenador. Sin embargo en muchas otras ocasiones es común bajar el mismo archivo cada cierto intervalo de tiempo, debido a que este se actualiza y tiene un contenido mas reciente, y es necesario sobrescribir el archivo descargado, pues bien aunque parezca sencillo de hacer, implementar este algoritmo requiere de practica. Existen dos formas de hacerlo y es lo que explicare.

Supongamos que se nos asigna la tarea de tomar captura de alguna cámara digital cada 30 segundos, sin embargo, el software que se encarga de tomar la captura y almacenar dicha imagen ya se encuentra echo, por lo tanto nuestro trabajo es solo tomar el archivo del servidor donde alojo esta imagen y visualizarla en alguna especie de contenedor gráfico (PictureBox).

El método clásico es usar el siguiente código:
 
Sub timer_1
Dim time As Integer
time = 0
If time <= 30 then
time = time + 1
else
My.Computer.Network.DownloadFile _
("http://www.tuServidoroIP.com/Imagenjpg", _
"C:\Monitoreo\Imagen.jpg")
time = 0
End If
End sub

Todo pareciera indicar que tenemos el problema resuelto, y en efecto así es. Sin embargo pensemos que cierto día nuestra conexión a internet pierde comunicación con el servidor por unos cuantos mili segundos, y supongamos que en ese intervalo de tiempo (entre la perdida de conexión) le correspondía a nuestro software actualizar tomar la imagen del servidor y posteriormente almacenarla y mostrarla.

¿Que ocurriría?

Pues bien, nuestro código es tan sencillo que carece de condiciones contra errores, y por lo tanto nos generaría un error y se saldría de la ejecución, de echo, seria la muerte si fuera para un empresa, y el software se colgara en un fin de semana.

¿Como solucionar el problema?

Pues bien, como bien dice el dicho: no hay mal que dure cien años...
No explicare a detalle el siguiente código, pues me tomaría mas tiempo explicarles el funcionamiento de cada sentencia, sin embargo, el lector tiene toda la libertad de experimentar e investigar.

Try
            Dim wc As New System.Net.WebClient()
            wc.DownloadFile("http://" & ip & "/Imagen.jpg", "C:\Monitoreo\Imagen.jpg")
        Catch ex As System.Net.WebException
            Dim response As System.Net.HttpWebResponse = ex.Response
        End Try

Este código lo que hace, es omitir nuestro problema anterior, lo único que bastaría hacer es cambiar este fragmento de código por el anterior:

My.Computer.Network.DownloadFile _
("http://www.tuServidoroIP.com/Imagenjpg", _
"C:\Monitoreo\Imagen.jpg")
Eh aquí nuestra solución, cabe mencionar que el código anterior puede reemplazar la imagen automáticamente, a diferencia del primer código que nos causaba error, a ese código tenemos que implementarle un algoritmo para borrar la imagen y volverla a escribir.

Nuevo blog

Bien como podrán darse cuenta e migrado del wordpress al blogger, pues bien yo espero pronto valla subiendo varios contenidos sobre programación y linux, en algunos casos haré uso del ingles (como pueden darse cuenta), y en otros español. Hago esto por motivos personales y también didácticos. Espero poder subir mas contenidos interesantes y que les pudieran servir en su vida practica.

How to install Nvidia Drivers in CentOS or RedHat

When I was trying install Nvidia Drivers in my Linux I had some mistakes in the installation. The first problem was on the Kernel and gcc headers. When you were installing RedHat or CentOS or any version based or RedHat code by first time you must installing this

1) By first you must be loguin as root and then you must be type this in the console
yum -y install kernel-devel gcc-c++
yum -y upgrade kernel
Before that you must restart your computer and after that you must desactivated the nouveau controller in this grub configuration in: /boot/grub/grub.conf

and then you must added this code (the code in quotes)

title CentOS (2.6.32-358.11.1.el6.x86_64)…"quiet rdblacklist=nouveau nouveau.modeset=0
initrd /initramfs-2.6.32-358.11.1.el6.x86_64.img”

Finally you must restar your computer and then begining the installation in the classic mode:

sh Nvidia...