Es emocionante explorar las nuevas características de Visual Studio 2010 en su versión Beta 2, a nivel básico una de las primeras sorpresas en el editor largamente anunciada es la incorporación de WPF, aunque parezca a simple vista un detalle de poco interés, debo confesar que una vez empiezas a trabajar con él te acostumbras de tal forma que cuando vuelves a utilizar el anterior (IDE 2008) te sientes como raro y se te antoja como frio y poco agradable.

Realmente el nuevo editor pasa desapercibido si no fuera por la aparición de un combo en la parte inferior derecha en la que al estilo de los mejores procesadores de texto nos deja seleccionar el % de zoom sobre la fuente que tengamos seleccionada.

Algo divertido que ya nos anunciaba Lisa Feigenbaum cuando nos presentaba la beta 1 en pasado año en el ‘Spanish tour 2008’ era la combinación de la tecla ‘Control’ con la rueda del Ratón… es divertido aumentar/disminuir el tamaño con solo rodar el ‘scroll’.

Fui uno de los que pensaron que eran de ese tipo de adornos que no son prácticos, pero debo rectificar y aseguraros de que es todo lo contrario.

Recordad: CTRL+Rueda Mouse (Avanza/Retrocede) J

Otra Característica simpática es la de edición simultánea de líneas múltiples. Ello nos permite seleccionar varias líneas o una selección de columna concreta abarcando varias líneas y escribir directamente en todas ellas.

Lo conseguiréis pulsando la tecla: Efectuando la selección mientras se mantiene la tecla ‘Alternativa’ pulsada.

También podéis conseguirlo manteniendo pulsadas las teclas [Mayúsculas]+[Alternativa] y seleccionando las líneas con las teclas de Cursor [Arriba]/[Abajo]/[Derecha]/[Izquierda]

…un par de facilidades más sobre VS2010!
Pep Lluis,

 

It's exciting to explore the new features of Visual Studio 2010 in its Beta 2 version, at the basic level one of the first surprises in the editor and long announced is the incorporation of WPF, though it may seem at first glance a detail of little interest, I must confess that once you start working with him you get used, when you return to use the previous (2008 IDE) feel as rare and it strikes you as cold and little nice.

Actually the new editor goes unnoticed if you not see outside combo in the bottom right (like best word processors-styleJ) leaving us to select the % zoom applied.

Something fun that already we announced by Lisa Feigenbaum when we had the beta 1 last year in the ' Spanish tour 2008 ' was the combination of the key control with the mouse scroll… is funny increase / decrease the size, only shooting the scroll. I was one of those who thought were “ornaments are not practical”, but I must rectify and sure that is the very opposite.

Remember: CTRL+ Mouse Scroll (Up / Down)

Other nice feature is the simultaneous editing of multiple lines. This allows us to select multiple lines or a particular column selection spanning multiple lines and write directly to all of them. Just means undertaking the selection while keeping the [Alternative] down. You can also do so by holding down [Shift] [Alternative] keys and select the lines with the cursor keys [up] / [down] / [Right] / [Left]

... a couple of facilities more on VS2010!

Pep Lluis,

 

 

 

Posted by peplluis | with no comments
Filed under:

Es otra de las preguntas que se repite :

“En mis aplicaciones de VB6 utilizaba MS Chart para poder incrustar sencillos graficos a mi aplicación… he estado buscando en los ‘ocx’ y los componentes .NET en Visual Studio 2008 y no doy en encontrar si existe MS Chart para .NET”
Javier.

Bueno… la respuesta es muy fácil, solo tienes que descargar / instalar el Add-on de MS Chart para Visual Studio 2008. Creo recordar que necesitas tener instalado el SP1, después de instalarlo en la pestaña ‘Data’ del ‘toolbox’ te aparecerá ‘Chart’ y ya sabes… solo tienes que arrastrar y soltar J

MSChart_VisualStudioAddOn.exe

Espero que te sea de utilidad.

Posted by peplluis | with no comments
Filed under:

' Repondiendo a la pregunta sobre si
' Se puede cambiar la velocidad de Transmsion/Recepcion dinamicamente
'
'..     Dim MiPuerto As New System.IO.Ports.SerialPort
'..     MiPuerto = My.Computer.Ports.OpenSerialPort("COM1")
'
'En este ejemplo enviamos una trama “Hola” a una velocidad diferente
'cada vez que invoquemos el procedimiento EnviarTrama
'
'Evidentemente podeis asociarlo a un combo, de manera que utilice la
'velocidad asociada a la selección del mismo

… Sub EnviarTrama …
        Select Case MiPuerto.BaudRate
            Case 19200
                MiPuerto.BaudRate = 9600
            Case 9600
                MiPuerto.BaudRate = 4800
            Case 9600
                MiPuerto.BaudRate = 2400
            Case Else
                MiPuerto.BaudRate = 19200
        End Select
        MiPuerto.WriteLine("Hola... enviando a :" + MiPuerto.BaudRate.ToString)

Saludos;
Pep Lluis,

Posted by peplluis | with no comments

        

'// Utilizar VStudio 2010 Beta 2, con este código.
'
'// El propósito de este código es mostrar el uso 
'// de los indicadores de enumeraciones utilizando
'// conversiones hexadecimales (por ejemplo!).
'//
'// (c)(r) :-) PepLluis 2009

'// Para entender este ejemplo, imagina que
'// necesitas controlar algún dispositivo, ya sea
'// a través de Ethernet, USB o Puerto Serie, para
'// Supervisar or controlar las operaciones de
'// paro o marcha, trabando solo con dos bytes...
'// el primero de ellos mapeando los bits de
'// salida y el segundo los de entrada, después
'// de esto solo necesitaras enviar el byte de
'// salida al dispositivo o supervisar la entrada
'// cuando se produzca un cambio en su valor.

'// Este ejemplo además muestra el uso de
'// la continuación implícita de línea y los
'// inicializadores para poder añadir todos los
'// Controles necesarios en el form, en un solo
'// golpe.
.

'// Los comentarios y el código están en Ingles
'// por tema de difusión, no dudes en pedírmelos
'// en Castellano, si lo consideras oportuno

'// Test this code with Visual Studio 2010 Beta 2.
'

'// the purpose of this code is just show and play '// with flag's enumerations and play using
'// hexadecimals conversions.
'//
'// (C)(R) :-) PepLluis 2009

'// To understand this sample... imagine you need
'// control some devices using Ethernet, USB or
'// Serial Ports to supervise and set/reset their
'// status with start/stop operations, just two
'// bytes... the first one to map input bits
'// and the second to map output bits, after
'// this you only need send output byte to device
'// or supervise received byte when value change.

'// this sample also show how use implicit line
'// continuation and initializers to add controls
'// in one shot in load event (for example).

 

 

Y aqui el Codigo...

'Define input channel
<FlagsAttribute()> Public Enum InputChannel
    PowerAlarm = 1
    LowVoltage = 2
    HighVoltage = 4
    OverCurrent = 8
    PowerGood = 16
    ShortCircuit = 32
    WithoutLoad = 64
    OutOfService = 128
End Enum

'' Define output channel
<FlagsAttribute()> Public Enum OutputChannel
    Engine_Axis1 = 1
    Engine_Axis2 = 2
    Engine_Axis3 = 4
    Smoke_Vent = 8
    Refrigerator = 16
    Blast_Furnace = 32
    TransPort_Belt = 64
    Emergency_Stop = 128
End Enum

'// You can add dynamically items to enum and no changes are needed inside code... just rebuild
'

Public Class FlagsEnumerationSample
    Private Sub When_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Title
        Me.Text = "Playing with Flag's Enum's"
        'Add all labels and textbox in one shot
        Me.Controls.AddRange({New Label With {.Name = "lblHexcaptn",
                                              .AutoSize = True,
                                              .Location = New Point(5, 10),
                                              .Text = "Output Value:"},
                              New Label With {.Name = "lblHexValue",
                                              .AutoSize = True,
                                              .Location = New Point(75, 10),
                                              .Text = "0x00", .Height = 20},
                              New Label With {.Name = "lblInputVal",
                                              .AutoSize = True,
                                              .Location = New Point(140, 10),
                                              .Text = "Input Value : 0x"},
                              New TextBox With {.Name = "txtInputVal",
                                                .MaxLength = 2,
                                                .Width = 20,
                                                .Location = New Point(220, 8),
                                                .Text = "00"}
                            })

        'Add one customized button for every item in enumeration
        Dim NextPos As Integer = 30                                             'Point for this button (30=initial top pos)
        For Each elem In [Enum].GetValues(GetType(OutputChannel))               'iterate output enum
            Me.Controls.Add(New CustomButton(New Point(20, NextPos), elem))     'add new button with new point position for elem
            AddHandler Me.Controls(elem.ToString).Click, AddressOf OutPutOnOff  'When button is click put output on/off
            NextPos += Me.Controls(elem.ToString).Height                        'Calculate next point location for next elem
        Next

        NextPos = 30                                                            'Initial top pos for first element
        For Each elem In [Enum].GetValues(GetType(InputChannel))                'Iterate input enum
            Me.Controls.Add(New CustomLabel(New Point(160, NextPos), elem))     'Add customized label for any bit input in enum
            NextPos += Me.Controls(elem.ToString).Height                        'Calculate location for next label
        Next
        'Simulate input value... refresh labels when textbox value change
        AddHandler Me.Controls("txtInputVal").TextChanged, AddressOf InputsOnOff

        Me.Height = NextPos + 50                                                'Fix form height, after last control + 50
    End Sub

    Private Outputs As Byte = 0                                                 'Output channel (Byte)
    '
    'Change On/Off output bit status of sender
    'remark : TAG property of button is used as bit weight
    Sub OutPutOnOff(ByVal sender As System.Object, ByVal e As System.EventArgs)
        If Outputs And CType(sender, Button).Tag Then                           'Flic /Flac output bit
            Outputs = Outputs Xor CType(sender, Button).Tag                     'Set Off if On
            sender.BackColor = Color.GreenYellow                                'GreenYellow if Off
        Else
            Outputs = Outputs Or CType(sender, Button).Tag                      'Set On if Off
            sender.BackColor = Color.Red                                        'Reed if On
        End If
        Me.Controls("lblHexValue").Text = "0x" + Hex(Outputs)
    End Sub

    Private Inputs As Byte? = 0                                                 'Input channel (Byte)
    'Change color of label when bit is On or Off
    'remark : TAG property of label is used as bit weight
    Sub InputsOnOff()
        Try
            Inputs = "&h0" + Me.Controls("txtInputVal").Text                    'Read & convert text as Hex value
        Catch ex As Exception
            Me.Controls("txtInputVal").Text = ""                                'Wrong format... clear textbox
        End Try

        For Each Elem In [Enum].GetNames(GetType(InputChannel))                 'for each item in enum
            If Inputs And CType(Me.Controls(Elem), Label).Tag Then              'Red Color if bit is On, Green if off
                Me.Controls(Elem).BackColor = Color.Red
            Else
                Me.Controls(Elem).BackColor = Color.GreenYellow
            End If
        Next
    End Sub
End
Class

'
' Just My customizes Button to select and display outputs
Class CustomButton
    Inherits Button
    '
    ' Create using
    '   _location inside form
    '   _elem     particular item of enumeration
    Sub New(ByVal _location As Point, ByVal _elem As [Enum])
        Me.Tag = CType(_elem, OutputChannel)                    'My Bit weight
        Me.Name = _elem.ToString                                'My Name
        Me.Text = Me.Name                                       'Name to Show
        Me.Width = 100                                          'Wide
        Me.Location = _location                                 'Set Position
        Me.BackColor = Color.GreenYellow                        'Initial Color
    End Sub
End
Class

'
' Just My customized Label to display Inputs
Class CustomLabel
    Inherits Label
    '
    ' Create using
    '   _location pos inside form
    '   _elem     particular item of enumeration
    Sub New(ByVal _location As Point, ByVal _elem As [Enum])
        Me.Tag = CType(_elem, InputChannel)                     'My Bit weight
        Me.Name = _elem.ToString                                'My Name
        Me.Text = Me.Name                                       'Name to Show
        Me.Width = 100                                          'Wide
        Me.Location = _location                                 'Position
        Me.TextAlign = ContentAlignment.MiddleCenter            'Align
        Me.BackColor = Color.GreenYellow                        'Initial color
        Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle  'Set Border
    End Sub
End
Class

Salud,
Pep Lluis,

Posted by peplluis | with no comments
Filed under:

A la Cargaaaa!!!

o bien pensado..... a la Descargaaaaaa!!! Cool

http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx

Este video quizas pueda ayudarte si quieres alguna pista, para que la descarga y la instalación sea mas asequible.

http://channel9.msdn.com/shows/10-4/10-4-Episode-33-Downloading-and-Installing-Visual-Studio-2010-Beta-2/

Que lo disfruteis y espero vuestros comentarios.
Pep Lluis,

 

Posted by peplluis | with no comments
Filed under:

' A menudo dejamos de utilizar las enumeraciones por falta de comprensión.
'
' Recibo algunas preguntas en tanto a cómo utilizarlas, el presente ejemplo intenta
' clarificar su uso, así como dar algunas perspectivas nuevas, dando a conocer
' algunas características poco conocidas.

' Por definición, una enumeración corresponde a una integral asociada a un contenido como constante

' En la Sub New, destacar...
'   .destacar como en 'Nombres' obtenemos el tipo de la enumeración 'Electrodomésticos'
'   .el uso de [enum].GetNames en forma de array para añadir todos los ítems sin necesidad de iteraciones
'   .Para hacer mas legible el código utilizando una expresión declarativa de la misma

'   .Identificar su correspondencia

 

' Si mañana tengo una escapada hablaremos del atributo para uso como flag : <FlagsAttribute>
'

Class EnumeracionSimple
    Inherits Form

    Enum Electrodomesticos
        Horno
        Nevera
        Encimera
        Campana
        Batidora
        Plancha
        Secadora
        Balanza
    End Enum

    Sub New()
        AñadirComboConEnumeracion() 'Un combo con los ítems de la enumeración
        CodigoMasLeible(7)
        Identificando(2)

    End Sub

 

    'Un combo con los ítems de la enumeración
    Sub AñadirComboConEnumeracion()
        'Al crear la clase
        Dim MiCombo As New ComboBox               'Crear ComboBox
        Dim Nombres = GetType(Electrodomesticos)  'Obtener el tipo de la enum
        'Un combobox con toda la enumeración
        MiCombo.Items.AddRange([Enum].GetNames(Nombres).ToArray)    'Añadir todos sus nombres
        MiCombo.Dock = DockStyle.Fill                               'Dock
        Me.Controls.Add(MiCombo)                                    'Añadir el Combo al Form
    End Sub

    'Clarificando cada caso en la selección
    Sub CodigoMasLeible(ByVal Seleccion As Integer)
        Select Case Seleccion
            Case Electrodomesticos.Balanza
                MsgBox("Hola desde Balanza")
            Case Electrodomesticos.Batidora
                MsgBox("Hola desde Batidora")
            Case Electrodomesticos.Encimera
                MsgBox("Hola desde Encimera")
        End Select
    End Sub

    'Identificando la selección
    Sub Identificando(ByVal Electodomestico As Integer)
        MessageBox.Show("Su nombre es  : " + CType(Electodomestico, Electrodomesticos).ToString)
    End Sub
End
Class

Posted by peplluis | with no comments
Filed under: ,

Come learn about what’s coming in the next release of Visual Basic. Code faster with language features like implicit line continuation, auto-implemented properties, statement lambdas, interoperability with dynamic languages, simplified Office application deployment, and more! Understand, navigate, and test code more easily than ever with the latest code-focused tools. Take advantage of multi-monitor support, zoom, and rich extensibility in the newly designed IDE. In this demo-packed session, we’ll show how to use all of these new capabilities to boost your development experience with Visual Studio 2010!

Bio:
Lisa Feigenbaum is a Community Program Manager for Visual Studio Managed Languages. She has been a member of the Visual Basic team since 2004. Before her current role, Lisa was the Program Manager for the Visual Basic Editor and Debugger. You can find Lisa on Channel9 or read her posts on the VB team blog http://blogs.msdn.com/vbteam. Before joining Microsoft, Lisa earned an M.Sc. and B.A. in Applied Mathematics from Harvard University.

NOTA: Para los que no podais asistir al CodeCamp aclarar que esta sesión será un comunicación online con Redmond y se hará en inglés.
Nivel: 200

On : 18th October 2009, 17:15PM (GMT+1)
Toll free: +1 (866) 500-6738
Toll: +1 (203) 480-8000
Participant code: 3116969
Attendee URL:  https://www.livemeeting.com/cc/microsoft/join?id=MeetLisa&role=attend&pw=Attend

 World Wide Access Telephone Numbers
Spain, Madrid Microsoft IT 91 391 98 00 

 

Posted by peplluis | with no comments
Filed under:

        

Este verano Octavio Hernández (C# MVP) y Pep Lluis Bano (VB MVP ) tuvimos la suerte de entrevistar a Lisa para un artículo publicado en la revista DotNetMania. El texto en español está disponible como un archivo adjunto al final de este post, así como en el resumen.

This past summer I was interviewed by C# MVP Octavio Hernandez and VB MVP Pep Lluis Bano for an article that was published in the Spanish magazine DotNetMania . The Spanish text is available as an attachment at the end of this post, as well as in summary.

 

 

Click : Interview on Visual Basic and C# in Visual Studio with DotNetMania

Que lo disfruteis!
Pep Lluis,

Posted by peplluis | with no comments
Filed under:

Muchos de los que nos acostumbramos al uso de ‘Printer.Print’ en visual Basic 6, padecemos de ciertas dificultades para adaptarnos al nuevo uso de ‘PrintDocument’.

Con la intención de responder a numerosas preguntas sobre el tema y facilitar esas transiciones que finalmente nos aportan un montón de beneficios, me complace compartir con vosotros este pequeño ejemplo de cómo generar un listado usando el ‘moderno’ PrintDocument, dandole un estilo muy chapado a la antigua J.

Espero que os sea útil!

©Pep Lluis

‘Este ejemplo se ha compilado con la versión Beta 1 del compilador FW 4.0, aunque no tendréis dificultad alguna en adaptar el concepto a cualquier versión anterior del framework.

Imports System.Drawing.Printing

Public Class Form1
    'Crear el PrintDocument
    Private ListadoDeArticulos As New PrintDocument
    'Simulación tabla de Artículos
    Private Articulos As New DataTable("Articulos")

    Private Sub Form1_Load() Handles MyBase.Load

        'Función de imprimir paginas
        AddHandler ListadoDeArticulos.PrintPage, AddressOf Me.ImprimirListado

        '
        ' Simular tabla Artículos
        '
        Articulos.Columns.Add("Codigo")
        Articulos.Columns.Add("Descripcion")
        Articulos.Columns.Add("Precio")
        Articulos.Rows.Add("001", "Resistencia 100ohms", "0,15")
        Articulos.Rows.Add("002", "Transistor 2n2234", "1,00")
        Articulos.Rows.Add("003", "Microprocesador Z80", "5,40")
        Articulos.Rows.Add("004", "UART 16C450", "3,45")
        Articulos.Rows.Add("005", "Resistencia 200ohms", "0,12")
        Articulos.Rows.Add("006", "Transistor 2n2222", "1,22")
        

       ' Lanzar la ejecución del listado
        ListadoDeArticulos.Print()

    End Sub

 

    'Seleccionar la fuente para el listado
    Dim Fuente_Pagina As New Font("Lucida Console", 10)
    'Fijar los márgenes Derecho / Izquierdo
    Dim Margen_Izquierdo As Single = 0
    Dim Margen_Superior As Single = 0
    'Controlar la posición Vertical/NºPagina
    Dim PosicionLinea As Single = 0
    Dim ContadorLinea As Single = 0
    Dim Numero_Pagina As Single = 1
    'Memorizar la posición en curso dentro del Dataset
    Dim Puntero As Single = 0

    '
    ' Imprimir el Listado de Artículos
    '
    Sub ImprimirListado(ByVal sender As Object, ByVal Pagina As PrintPageEventArgs)

        'Ajustes para el Control de Pagina
        Dim Lineas_Pagina As Single = Pagina.MarginBounds.Height / Fuente_Pagina.GetHeight(Pagina.Graphics)
        ContadorLinea = 0
        Margen_Izquierdo = Pagina.MarginBounds.Left
        Margen_Superior = Pagina.MarginBounds.Top

        'Cabecera del Listado
        ImprimirUnaLinea(Pagina, "Electronica NAVI")
        ImprimirUnaLinea(Pagina, "Listado de Artículos sin ningún orden ni concierto")
        ImprimirUnaLinea(Pagina, "Vic (Barcelona) a fecha : " + DateTime.Now + " ,Pagina : " + Numero_Pagina.ToString)
        ImprimirUnaLinea(Pagina, "")
        ImprimirUnaLinea(Pagina, "Código Descripción                                               Precio")
        ImprimirUnaLinea(Pagina, "------ --------------------------------------------------------- --------")
        Dim Articulo As DataRow
        Dim Linea As String = Space(80)
        '
        'Recorrer la tabla de artículos / imprimir una línea por fila
        For Indice As Single = Puntero To Articulos.Rows.Count - 1
            Articulo = Articulos.Rows(Indice)
            If ContadorLinea < Lineas_Pagina Then
                'posicionar la columna según item/articulo
                Mid(Linea, 2) = Articulo.Item("Codigo")
                Mid(Linea, 8) = Articulo.Item("Descripcion")
                Mid(Linea, 66) = Articulo.Item("Precio")
                'imprimir la linea
                ImprimirUnaLinea(Pagina, Linea)
            Else
                Exit For
            End If
        Next
        'Memorizar la posicion del primer artículo/siguiente Pagina
        Puntero = Articulos.Rows.IndexOf(Articulo)
        '
        'Comprobar si existen artículos para listar
        If Puntero < Articulos.Rows.Count - 1 Then
            Numero_Pagina += 1          'Incrementar numero de página
            Pagina.HasMorePages = True  'SI tengo más paginas a imprimir
        Else
            ImprimirUnaLinea(Pagina, "------ --------------------------------------------------------- --------")
            Numero_Pagina = 1           'Numero de pagina a 1 (Para el proximo listado)
            Pagina.HasMorePages = False 'No Tengo mas paginas para imprimir
        End If
    End Sub
    '
    ' Imprimir una linea
    '

   'Lambda para con el cálculo de la posición de la línea
    Dim Pos = Function() As Single
                Return Margen_Superior + ContadorLinea * Fuente_Pagina.GetHeight(Pagina.Graphics)
             
End Function

    Sub ImprimirUnaLinea(ByVal Pagina As PrintPageEventArgs, ByVal Linea As String)
        'Imprimir la línea con la fuente seleccionada y en Negro
        Pagina.Graphics.DrawString(Linea, Fuente_Pagina, Brushes.Black, Margen_Izquierdo, Pos())
        'Incrementar el contador de líneas
        ContadorLinea += 1
    End Sub

End Class

PD. Me gustara recibir vuestros comentarios, opiniones y aportaciones.

Posted by peplluis | 3 comment(s)
Filed under:


Me complace compartir con vosotros un gran evento para la comunidad de desarrolladores, se trata de una nueva edición del CodeCamp esta vez en Tarragona. Dos días completos dedicados a reunir al mayor número de profesionales, estudiantes y entusiastas entono charlas, mesas redondas y lo más importante un punto de reunión para contactar de tu a tu, con los profesionales más reconocidos de nuestro sector.

Ahora ya no tienes excusa, sin duda el evento más importante de este año, de la comunidad para la comunidad.

No tardes en registrarte : www.codecamp.es

Nos vemos el 17/18 de octubre en Tarragona.
Pep Lluis,

 

Posted by peplluis | 6 comment(s)
Filed under:

Para los que tengáis eReader, tiempo que perder y aun no dispongáis del libro “Robot Dispensador para MSDN Video” (año 2005), ahora lo tenéis disponible en formato electrónico. Os lo podéis descargar de :

https://www.luarna.com/Paginas%20comunes/DispFormAutor.aspx?idautor=44

Espero que un recurso más J
Saludos,
Pep Lluis,

Posted by peplluis | 3 comment(s)
Filed under:

Pep MSC51 

Este fue mi primer ordenador con interprete Basic diseñado construido totalmente a Mano por un tal PepLluis. ¡Menudos tiempos!
Es grato reencontrarme con el después de casi 25 años.

El procesador es un INTEL MCS51 con el interprete Basic incrustado en PROM del propio chip.

Como veis no solo Bill tiene juguetitos de museo :-))
Saludos,

Posted by peplluis | with no comments
Filed under:

        

Para alguno de nosotros, ya seamos de sistemas o desarrolladores, es habitual encontrarnos frente una situación de problemas cuando intentamos instalar determinados dispositivos USB en sistemas de 64 Bits, en esos casos la respuesta suele ser :

 ‘el fabricante es el responsable de suministrar los adaptadores para su electrónica’

 Cierto, es verdad y es la respuesta correcta, pero de hecho el usuario necesita utilizar su dispositivo y es obvio que no puede esperar indefinidamente a que el fabricante decida suministrar o desarrollar un adaptador para 64 bits y para nuestro sistema operativo.

En algunos escenarios esto representa que el usuario no se decida a instalar la nueva versión de Windows y retroceda a las versiones anteriores con soporte a dichos dispositivos, que traducido significa instalar una versión antigua X86 del sistema. No olvidemos que algunos fabricantes importantes de electrónica están suministrando instaladas las versiones X86 en sus equipos nuevos cuya electrónica es X64 y además algunos incluyen los DVD ‘downgrade’ para instalar XP. Es difícil de entender porque, supongo que puede ser por esto.

Para los ingenieros que decididamente quieran aprovechar la arquitectura de X64 sin renunciar a utilizar estos dispositivos y sus ‘drivers’ existe un buen recurso que puede resolver la situación en algunos casos. SI!, ahora podemos utilizar los viejos dispositivos USB y las antiguas aplicaciones que rodaban en XP utilizando el nuevo ‘XPMode’ de WIN7. porque este incluye soporte para compartir o adjuntar dispositivos USB por lo que solo necesitas instalar el complemento Virtual PC & XPMode en tu sistema, entonces podrás instalar y usar el viejo adaptador USB con tu vieja aplicación rodando sin ningún problema (o al menos eso espero. J), ademas podras lanzar todas las aplicaciones instaladas en XPMode directamente desde el menu de inicio sin arrancar el Visual PC…

Por ejemplo, algunos utilizamos conversores USB-Serie o dispositivos USB para su uso con electrónica de entornos integrados de desarrollo que se comunican con emuladores, depuradores o circuitos especificos, una vez instalados en XPMode se comportan como un autentico XP nativo (además en el continuamos disponiendo del aclamado Hyperterminal).  Sin duda XPMode es una nueva gran característica para no demorar por más tiempo el uso de Windows 7 en su versión X64 por falta de 'Drivers'.

Espero que esto ayude a sortear (lo sé! No todos!) Pero algunos problemas derivados en la necesidad de utilizar drivers X86 en sistemas X64.

Pep Lluis,

PD. Puedes descargar XPMode para WIN7 siguiendo este link :

http://www.microsoft.com/windows/virtual-pc/download.aspx

Many people found problems when try use their USB devices in X64 system. When report this trouble, the normal answer is :

‘It is the responsibility of the manufacture to provide drivers for their hardware’

Yes! This is true and is the correct response, but in fact the user need use this device and is obvious cannot wait indefinitely to manufacturer regarding if decide deliver or not deliver the driver for x64 system.

In some scenarios this represent that the user does not install the new version of Windows and comeback to older versions or finally in the best of cases simple select to run x86 version of O.S., because normally in some cases and old electronics the manufacturer only give support for x86 versions. Don’t forget some important PC manufacturers deliver only windows x86 versions with new X64 PC hardware, and give included XP DVD’s downgrade. Is hard to understand for why (may be for this)

For engineers that clear decide run with X64 versions, have a good resource to solve this problem, when manufacturer only supply X86 or XP driver versions. Yes! Now you can use old USB devices and XP Applications using XPMode, because now include new support to share or attach USB devices. Just need install Virtual PC & XPMode in your Windows 7 X64 and you can install & use the old USB-Serial Adaptor with your old application running with no problems. (I hope )

For example, many people using USB-Serial legacies or USB Devices are for their use with electronics IDE’s. Now with XPMode you can use all old IDE’s and communicate with debuggers, in circuit emulators or electronic devices installed in XPMode (Virtual PC) like be in native XP (yes in XP still running Hyperterminal “claimed for many people”) and missing in Vista). With no doubt this is a great new feature to no delay more using Windows 7 X64 Version.

I hope this help to solve (I know… not all) but some device driver X86 implementation scenario.

Pep Lluis,

PS. You can download XPMode for WIN7 from : http://www.microsoft.com/windows/virtual-pc/download.aspx 

 

 

 

Posted by peplluis | 2 comment(s)
Filed under:

 

         Saber sobre la disponibilidad de nuestros puertos serie antes de su selección en un combobox.

  How to know about availability of our computer serial ports before select one from a combo box.

A menudo las aplicaciones que requieren seleccionar un dispositivo antes de efectuar algún tipo de comunicacion, no ofrecen ninguna información adicional sobre el estado del dispositivo. Sobre todo si hablamos del puerto serie, normalmente nos ofrecen una simple enumeración de los COM. Esto último es el causante de que la aplicación nos permita seleccionar un puerto que en ocasiones no existe o está siendo usado por otro programa.

Os propongo una idea con la intención de mejorar y facilitar la selección de este tipo de dispositivos en nuestras aplicaciones.

Básicamente se trata de enumerar en un ‘ComboBox’ personalizado los puertos existentes en nuestro equipo, utilizando el mandato :

My.Computer.Ports.SerialPortNames.ToArray

En el momento de la inicialización del ‘combobox’ asignaremos el evento de ‘DrawItem’ a la función que enriquecerá el aspecto, añadiendo al nombre un rectángulo coloreado y el texto correspondiente a la disponibilidad del puerto.

AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status

No dudéis en contactar conmigo si necesitáis aclarar o necesitáis entender alguna parte del código.

Para poder darle mayor difusión los comentarios del código están en inglés, aunque si os parece oportuno y necesario puedo posteároslo también en español.

Sometimes our communications applications are required to select any type of external device, and normally these applications are not giving any extra information about their availability. This is the case when talk around serial ports, normally when select the port only have a simple enumeration of COM’s, this may be confusing at time leaving at users selecting inexistent ports or ports that simply are already in use.

With this sample, you can improve and make easy these device selections in our applications.

The main think is enumerate serial port inside our customized ‘ComboBox’, using :

My.Computer.Ports.SerialPortNames.ToArray

After when initialize our combo only need assign ‘DrawItem’ event to function with our personalized combo draw,

AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status

This function are adding red rectangle and “busy” text when no have availability, and green rectangle and “available” text when the port is free.

Please no doubt in contact with me if you need any other explanation or opinion about this.

 

 SerialEnum_Es

SerialEnum_en 

 

public partial class Form1 : Form
    {
        //Enumerate Serial Ports on Machine
        //Get Serial Port availability
        String[] Puertos = System.IO.Ports.SerialPort.GetPortNames();

 

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            this.comboBox1.DrawMode = DrawMode.OwnerDrawVariable;       //seleccionar mi propio modo de arrastre

            this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;  //aspecto al men desplegable

            this.comboBox1.DataSource = Puertos;                        //puertos serie disponibles

            this.comboBox1.TabIndex = 0;                                //seleccione en primer lugar tabIndex

        }

 

       

        private void comboBox1_DrawItem_1(object sender, DrawItemEventArgs CmboItem)

        {

            // Dibuja el fondo del item.

            CmboItem.DrawBackground();

            // Los valores por defecto si el puerto est disponible.

            string status = "Disponible";

            SolidBrush brush = new SolidBrush(Color.Green);

            System.Drawing.Font font = this.Font;

            Brush fontbrush = Brushes.Black;

            Rectangle rectangle = new Rectangle(2, CmboItem.Bounds.Top + 2, CmboItem.Bounds.Height - 4, CmboItem.Bounds.Height - 4);

            // Comprobar disponibilidad del puerto

            try

            {

                // Si abre y cierra los puertos sin excepcin.

                // dibuja el item con la fuente por defecto y rectngulo verde.

                System.IO.Ports.SerialPort PortTest = new System.IO.Ports.SerialPort();

                PortTest.PortName = Puertos[CmboItem.Index].ToString();

                PortTest.Open();

                PortTest.Close();

            }

            catch (Exception ex)

            {

                // Si el puerto no est disponible

                // dibuja el item con la fuente cursiva y tachado y rectngulo rojo

                brush = new SolidBrush(Color.Red);

                status = "En Uso";

                font = new Font(FontFamily.GenericSansSerif, this.Font.Size, FontStyle.Italic ^ FontStyle.Strikeout);

                fontbrush = Brushes.DimGray;

            }

            // llenar item combo con rectangulo.

            CmboItem.Graphics.FillRectangle(brush, rectangle);

            // escribir el texto con la condicin actual del puerto de este item.

            CmboItem.Graphics.DrawString(Puertos[CmboItem.Index].ToString() + " - " + status, font, fontbrush, new RectangleF(CmboItem.Bounds.X + rectangle.Width, CmboItem.Bounds.Y, CmboItem.Bounds.Width, CmboItem.Bounds.Height));

            // dibujar foco del rectngulo cuando el ratn est sobre un item.

            CmboItem.DrawFocusRectangle();

        }

    }

 

Posted by peplluis | 2 comment(s)

Atendiendo a una consulta de los foros de MSDN, me complace compartir con vosotros una solución para asignar los ajustes de apertura del puerto serie al vuelo.

Entendiendo que en algunas situaciones, puede ser ventajoso poder cambiar la velocidad, paridad, bits... etc, ‘On Line’. Aunque para la mayoría de comunicaciones con dispositivos dichos parámetros son ajustados en tiempo de puesta en marcha y no acostumbran a variar en el transcurso del tiempo.

Esperando os sea útil… Saludos,
Pep Lluis,

PD. Si queréis podéis descargaros la solución de ejemplo en ‘attachments’.

using System;

using System.IO.Ports;

using System.Windows.Forms;

 

namespace SerialPortSettings

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            // Asignar las Velocidades seleccionables al Combo

            object[] Velocidades = { 19200, 9600, 4800, 2400, 1200 };

            this.comboBox_bits_por_segundo.Items.AddRange(Velocidades);

           

            // Asignar Paridades Seleccionables desde la enumeracion

            foreach (string s in Enum.GetNames(typeof(Parity)))

            {

                this.comboBox_paridad.Items.Add(s);

            }

           

            // Seleccionar los items por defecto

            this.comboBox_bits_por_segundo.SelectedIndex = 0;

            this.comboBox_paridad.SelectedIndex = 0;

            // Abrir el puerto serie con los items por defecto

            SeleccionCambiada(sender,e);

            // Asignar la funcion a ejecutar por disparo de evento al cambio de indice en el combobox

            this.comboBox_bits_por_segundo.SelectedIndexChanged += new System.EventHandler(this.SeleccionCambiada);

            this.comboBox_paridad.SelectedIndexChanged += new System.EventHandler(this.SeleccionCambiada);

        }

 

       

        private void SeleccionCambiada(object sender, EventArgs e)

        {

            // Deberemos añadir un control de excepciones si queremos capturar posibles errores

 

            // Para reasignar valores... primero cerrar el puerto

            this.serialPort1.Close();

            // Asignar los nuevos Settings

            this.serialPort1.BaudRate = Convert.ToInt16(comboBox_bits_por_segundo.Text);

            this.serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox_paridad.Text);

 

            this.serialPort1.Open();

            // Ver las asignaciones actuales.

            this.Velocidad.Text = this.serialPort1.BaudRate.ToString();

            this.Paridad.Text = this.serialPort1.Parity.ToString();

        }

 

    }

}

 

Posted by peplluis | 8 comment(s)

Si es vuestro caso os deseo unos felices dias de descanso. En caso contrario paciencia pues finalmente todo llega.

Estare respondiendo a vuestras solucitudes en tanto finalicen los dias donde internet es algo inacesible para los que no disponemos de 3G, el WiFi es inexistente y se desconoce la implementacion de los conectores RJ45 :-)

Cuidaros mucho y hasta la vuelta!
Salud,
Pep Lluis,

Posted by peplluis | with no comments
Filed under:

ParallelWon  SingleAndParallel Single

 Una de las novedades más excitantes de Visual Studio 2010 y el Framework, sin duda es la incorporación de las librerías para el uso de la ejecución en paralelo “paralelismo” o TPL (Task Parallel Library), pudiendo por fin sacar provecho a los ya extendidos multiprocesadores y/o múltiples ‘cores’.

Parece sencillo pero… no esta tan claro.

Es evidente que el uso de un simple ‘Parallel.For’ como cualquier otro proceso a través del framework, requiere de un número de recursos para conformar o organizar, planear y finalmente realizar la ejecución, además podemos suponer que este paralelismo se apoya sobre ‘threading’, por lo que debemos entender su aplicación dentro de escenarios donde exista un uso intensivo en la ejecución de tareas especificas y que estas justifiquen el consumo inicial de recursos en términos de rendimiento.

Con dichas conjeturas, está claro que un simple ‘for next’ siempre ganara en velocidad a un ‘parallel.for’,  si su ejecución se limita a la iteración sobre una simple estructura o lista y bien entendiendo en funciones cuya ejecución se realiza en una sola pasada.

Sin embargo la situación sufre un cambio radical cuando nuestro bucle itera en llamadas a funciones que realizan tareas con cierta carga de proceso.

Sin ninguna otra pretensión me complace compartir con vosotros un punto de entrada para evaluar la conveniencia o no de usar el paralelismo en determinadas tareas. También es evidente que no se trata de una herramienta formal, simplemente pretende ser un punto de entrada para experimentar de forma sencilla y asequible la implementación de escenarios muy básicos.

Esperando vuestras valoraciones, espero que llame vuestra atención y os complazca.

Cuidaros Mucho!
Pep Lluis,

Para probar la aplicación, necesitareis tener instalada la versión beta de Visual Studio 2010 y crear un nuevo proyecto ‘Windows Form Application’ deberemos añadir y distribuir en su form1 las siete etiquetas (del Label1 al Label7) correspondientes a la visualización de los datos del proceso, dos ‘NumericUpDown’ para proporcionarle el numero de bucles e iteraciones, un ‘Progressbar’ para comparar tiempos de ejecución y listo … con copiar y pegar el código adjunto, podréis utilizar este “tester” para vuestra primera aplicación en paralelo J

No dudéis en contactar conmigo si necesitáis cualquier aclaración o si necesitáis que os envíe el prototipo para este proyecto.

 With no doubt  one of the most exciting features in Visual Studio 2010 and Framework 4 is parallel computing or TPL (Task Parallel Library), being able finally to take benefit of multiprocessors  and multi core systems. 

This seems clear and simple but… may be need consider some aspects before J

It is evident that the use of simple Parallel.For' like any other process through framework, requires a minimum number of resources to conform, to organize, to plan and finally to make the execution, in addition we can suppose that this parallelism leans on `threading', reason why must be applied within scenes where have an intensive use of processes execution or long tasks, at end only this may justify these initial consumption of resources in performance terms.

With these conjectures, it is clear that simple `for next' always won in speed to `parallel.for', if their execution are limited to iterate on a simple structure or list, as well understanding this functions inside single flow process and made one to one.

Nevertheless the situation undergoes a radical change when our iteration calls to functions that make tasks with certain load of process.

Without any other pretension it pleases to me to share with you an entry point to evaluate the convenience of using parallelism in certain tasks. Also it is evident that one is not a formal tool, simply tries to be an entry point to start with a reasonable simple form and the implementation of very basic scenes.

Waiting for your evaluation, I hope this short explanation pleases to you.

Take care!
Pep Lluis,

Ps: No doubt in contacting with me if you need any extra explanation or if you need that I sent this prototype to you.

Imports System.Threading

' Simple Skeleton to test 'parallel.for'
' Pep Lluis 14.07.2009
'
' Compare/test time execution of single over parallel task's

' To run require Visual Studio 2010 Beta
' To catch Illegal Cross threat's exceptions, correct appropriate code
' or set false, Checking cross thread calls.

Public Class SingleOrParallel
    Dim _timer As New System.Timers.Timer
    Private Sub SingleOrParallel_Load() Handles MyBase.Load
        AddHandler _timer.Elapsed, AddressOf Testing    'Run Test every elapsed time
        _timer.Interval = 1000                          'elapsed time to 1s
        _timer.Enabled = True                           'run timer
    End Sub

    Dim Elapsed1, Elapsed2 As Double                    'define elapsed memory’s
    Sub Testing()
        _timer.Enabled = False                          'Stop timer
        Me.Label5.Text = "Running Test"
        loops = Me.NumericUpDown1.Value                 'read number of loops
        SequentialFor()                                 'Call Sequential for
        ParallelFor()                                   'Call Parallel for
        '
        ' Show results
        If Elapsed1 > Elapsed2 Then
            Label3.ForeColor = Drawing.Color.Red        'Parallel won
            Label4.ForeColor = Drawing.Color.Green
            'show execution time & differences between parallel & single
            Me.ProgressBar1.Value = (Elapsed2 * 100 / Elapsed1)
            Label5.Text = "fast " + (100 - Int(Elapsed2 / Elapsed1 * 100)).ToString + "%"
            Label6.Text = Elapsed1.ToString             'Single time
            Label7.Text = Elapsed2.ToString             'Parallel time
        Else
            Label3.ForeColor = Drawing.Color.Green      'Single won
            Label4.ForeColor = Drawing.Color.Red
            Me.ProgressBar1.Value = (Elapsed1 * 100 / Elapsed2)
            Label5.Text = "fast " + (100 - Int(Elapsed1 / Elapsed2 * 100)).ToString + "%"
            Label6.Text = Elapsed2.ToString             'Parallel time
            Label7.Text = Elapsed1.ToString             'Single time
        End If
        ' put result bottom progressbar value
        Label7.Left = (Me.ProgressBar1.Left +
                      ((ProgressBar1.Width / ProgressBar1.Maximum) * ProgressBar1.Value)) -
                      (Label7.Width / 2)
        _timer.Enabled = True                           'start timer to next test
    End Sub

 

    Dim loops As Integer
    Dim Chrono As New Stopwatch

    Sub SequentialFor()
        Chrono.Start()              'Start watch
        ' Conventional for next
        For n = 0 To loops
            SomeTask()
        Next
        ' remember Elapsed time
        Elapsed1 = Chrono.Elapsed.TotalMilliseconds
        Chrono.Stop()               'Watch stop
        Chrono.Reset()              'reset!
    End Sub

    Sub ParallelFor()
        Chrono.Start()              'Start wath
        ' parallel for
        Parallel.For(0, loops, Sub(n)
                                   SomeTask()
                               End Sub)
        ' remember Elapsed time
        Elapsed2 = Chrono.Elapsed.TotalMilliseconds
        Chrono.Stop()               'Watch stop
        Chrono.Reset()              'reset!
    End Sub

    '
    'Simulated task
    Sub SomeTask()
        'Your task here
        Thread.SpinWait(NumericUpDown2.Value)
    End Sub

End Class 

In this sample readings do not seem respond to the real milliseconds, I recommend use `ElapsedTicks' instead `Elapsed.TotalMilliseconds”, these correspond directly to ticks of chrono, eliminating any other interpretation.

Regards,

Posted by peplluis | with no comments
Filed under:

Sin duda un montón de historias reales, con buenas razones y argumentos que te desvelaran “el porqué” millones de desarrolladores utilizan Visual Basic.

Las encontraras haciendo clic en este enlace: I'm a VB!

Que las disfrutes!

 

Posted by peplluis | with no comments
Filed under:

Flag 

Today after more than 15 years, an old customer, comes to me asking support to change the original computer in his factory. These projects are started in 1992 and are controlling four machines in manufacturing process. Of course this is not notice!!, the new is in 2009 the application still running in Windows 3.11 and using DDE to exchange data with PLC (Programmable logic Controller) across serial port. This computer are linked to Novell Lan connecting with Server data bases (to interchange data from/to others department’s) using DB's from computer associates format J and need Jet 1.0 (first version of access) to work in windows… my Got!

When the customer are explaining... “after all this good years, finally the computer are break!”, I’m thinking in how give a fast response to nonstop factory production… may be upgrading from Visual Basic 3.0 to VB 2010?

Noooooooooooo!

Just need find and install from floppy’s Jet DataBase Engine and run setup application (from old Visual Basic 3.0 project), the great news is that all is working with NO PROBLEMS in Vista Business 32 bits.! DDE Included!.

With no doubt this is a strange history. After this I have explain to customer: the gold years of Win311 and Dbase 3 is gone J, and may be a good idea invest thinking in the next 15 years!.

There are some who say “may be in 15 years more” change the old Novell land by Windows & SQL Server, but now in the fact, they have a new computer with Vista, this is a got first step to start the change. Finally I’m sure that the crisis comes with people like us, performing jobs with no caducity time, in the next project I write in splash windows “Best Before 2012” Jajajaja.

Regards,
Pep Lluis,

PS.  To unbelievers, I can send screenshots of Vista & VB3 APP running.

Posted by peplluis | with no comments
Filed under:

Segun rezan estas son las estadisticas de este humilde Blog.

Estadísticas actualizadas 1 Jun 2009@06:55GMT: 63,261 visitas [?]
Total desde 30 Jun 2008: 63,261. 24horas previas: 187.

Cuando empecé a introducirme en todo esto de los Blogs, me sorprendía mucho cuando alguien hacia volar estadísticas del tipo “1 millón de Visitas”… “30.000 Descargas diarias” sin duda son cifras de vértigo!

A mi manera de entender, me parecía poco menos que exagerado, pensar que tantas personas pudieran interactuar contra la vitrina o expositor que expresaba las opiniones, consejos y en definitiva las explicaciones de la bitácora de vuelo de un navegante más.

“Pensando en los millones de navegantes que hay por ahí, con un montón de cosas para explicar, mucho más interesantes que yo.” Siempre tenía la sensación que esas personas debían estar 24h pendientes de todo el meollo para poder atender ese frenético ritmo de “visitaciones”.

Pues mi sorpresa se hace realidad cuando después de 11 meses de Blog me encuentro con las inevitables estadísticas y hago realidad del hecho de haber recibido más de 63 mil Visitas.

Estoy convencido que un número tan modesto deja indiferente (o provoca una sonrisa insolente en el peor de los casos) a la gran mayoría de analistas en estadísticas web. Sin embargo reflexionando y pensando que quizás probablemente esos 63 mil accesos han sido provocados por las mismas personas (unos pocos miles) buscando una y otra vez algo que no encuentran y pensando que al final lo han encontrado y les ha sido útil; explicare que provocan el despertar de una sensación de satisfacción muy gratificante, de una sensación de agradecimiento, pues intentando servir y con la responsabilidad de sentirme leído, me renueva el compromiso y las ganas de continuar aquí dedicando esas escasas horas de ocio, mejorando desde la trastienda de la tecnología, con mi granito de arena y la única intención de acortar la distancias entre la cabeza de carrera, el pelotón y el furgón de cola (desde donde os escribo) J.

Cuidaros mucho y no olvidéis que estoy aquí por vosotros.
Pep Lluis,

Posted by peplluis | 4 comment(s)
Filed under:
More Posts Next page »