VB Async Await CancellationToken

Os dejo un corto sobre Async, Await, como ya sabréis mejora mucho la respuesta del GUI… asi que ya no teneis excusa para dejar a la peña con el relojto esperando que terminen ciertas tareas..  :-))

Private cts As CancellationTokenSource
Async Sub btnStart_Clik(sender As Object, e As EventArgsHandles btnStart.Click
    btnStart.Enabled = False
    Try
        cts = New CancellationTokenSource
        Await Task.Run(Sub()
                           longThingsProcessing(cts.Token)
                       End Sub, cts.Token)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    btnStart.Enabled = True
End Sub
 
Sub btnCancel_Click(sender As Object, e As EventArgsHandles btnCancel.Click
    cts.Cancel()
End Sub
 
Sub longThingsProcessing(ct As CancellationToken)
    Try
        Dim charNumber As Integer = 0
        For x As Integer = 0 To 200000
            ct.ThrowIfCancellationRequested()
            charNumber += 1
            If charNumber > 255 Then charNumber = 0
            updateTitle(String.Format("Doing loop : {0}, Char {1}", x.ToString, Chr(charNumber)))
        Next
    Catch ex As Exception
        updateTitle("Operation was cancelled")
    End Try
End Sub
 
Delegate Sub textUpdate(text As String)
Sub updateTitle(_text As String)
    If Me.InvokeRequired Then
        Dim _me As New textUpdate(AddressOf updateTitle)
        Me.Invoke(_me, _text)
    Else
        Me.Text = _text
        Me.Refresh()
    End If
End Sub

All my life waiting for ‘&B’ and now is comming :-)

Imports System.Text

Module Module1

    Private encoding As New UTF8Encoding

 

    Sub Main()

        ‘int 64

        Dim my_nibbles = &B0111_0011_0110_1001_0111_0101_0100_1100_0100_1100_0101_0000_0110_0101_0101_0000

       

        Console.WriteLine(“My hex  : “ + Hex(my_nibbles).ToString)

        ‘ byte array

        Dim btes As Byte() = BitConverter.GetBytes(my_nibbles)

        ‘ retrieve string

        Dim myName = encoding.GetString(btes)

        Console.WriteLine(“My name : “ + myName)

 

        Console.ReadLine()

    End Sub
End Module

Regards!,
PepLluis,

Helper para leer .xlsx y componerlo en un DataGridView

Atendiendo a la petición de Sefvense en los foros de desarrollo : http://social.msdn.microsoft.com/Forums/es-ES/42c2ade6-a9d8-4b8e-bbe0-79b9d07e794f/estoy-tratando-de-importar-un-documento-csv-a-un-datagridview-en-una-aplicacion-para-windows-form?forum=winformses

os anticipo un helper que estoy preparando para aquellos que necesitan leer de un Excel y presentarlo parcialmente en un DataGridView.

No olvidéis importar el “Microsoft.office.Interop” correspondiente.

Imports Excel = Microsoft.Office.Interop.Excel
 
Public Class excelHelper
    Private workApp As New Excel.Application
    Private worksheet As Excel.Worksheet
    Private workbook As Excel.Workbook
 
    ''' <summary>
    ''' return a datatable with a customized content from xls sheet
    ''' </summary>
    ''' <param name="filePath"></param>
    ''' <param name="sheetName"></param>
    ''' <param name="headToFind"></param>
    ''' <param name="model"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function xlsToDataset_CustomModels(filePath As String, sheetName As String, headToFind As Date, model As dsModelAs DataTable
        Try
            workbook = workApp.Workbooks.Open(filePath, , True)
            worksheet = xlsFindSheet(workbook, sheetName)
            If worksheet Is Nothing Then Throw New Exception(String.Format("worksheet : {0}, not found in this book.", sheetName))
            Dim dt As New DataTable
            Select Case model
                Case dsModel.model_a
                    Dim rowSecondColTitle = 7
                    Dim CellrangeFrom = 1
                    Dim CellrangeTo = 200
                    Dim fromColA As Integer = xlsFindColContent(headToFind, rowSecondColTitle, 410)
                    Dim fromColB As Integer = 3
                    Dim colAContent As String = "Total"
                    dt = fillCustomDatasetModel_A("Descripción", CellrangeFrom, CellrangeTo, rowSecondColTitle, fromColA, colAContent, fromColB, fromColA + 1)
                Case dsModel.model_b
                    ' whatever call
                Case dsModel.model_n
                    ' more whatever
            End Select
            workApp.ActiveWorkbook.Close(False, filePath)
            workApp.Quit()
            Return dt
        Catch ex As Exception
            workApp.Quit()
            Return Nothing
        End Try
    End Function
    ''' <summary>
    ''' return a customized datatable Model A
    ''' </summary>
    ''' <param name="Title"></param>
    ''' <param name="rowRangefrom"></param>
    ''' <param name="rowRangeTo"></param>
    ''' <param name="rowForSecondColTitle"></param>
    ''' <param name="fromCol"></param>
    ''' <param name="whereContain"></param>
    ''' <param name="fillForCol_A"></param>
    ''' <param name="fillForCol_B"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function fillCustomDatasetModel_A(Title As String, rowRangefrom As Integer, rowRangeTo As Integer, rowForSecondColTitle As Integer, fromCol As Integer, whereContain As String, fillForCol_A As Integer, fillForCol_B As IntegerAs DataTable
        Dim dt As New DataTable()
        Dim val As Double
        dt.Columns.Add(Title)
        dt.Columns.Add(worksheet.Cells(rowForSecondColTitle, fromCol).Value)
        For index = rowRangefrom To rowRangeTo
            If Not (worksheet.Cells(index, fillForCol_A).Value Is NothingThen
                If worksheet.Cells(index, fillForCol_A).Value.ToString.Contains(whereContain) Then
                    val = Convert.ToDouble(worksheet.Cells(index, fillForCol_B).Value)
                    dt.Rows.Add(worksheet.Cells(index, fillForCol_A).Value.ToString.Remove(0, whereContain.Length + 1), val.ToString("#000,000"))
                End If
            End If
        Next
        Return dt
    End Function
    ''' <summary>
    ''' find col content into a row range
    ''' </summary>
    ''' <param name="findStr"></param>
    ''' <param name="findRow"></param>
    ''' <param name="startingAt"></param>
    ''' <param name="endingAt"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function xlsFindColContent(findStr As String, findRow As IntegerOptional startingAt As Integer = 0Optional endingAt As Integer = 0As Integer
        For index = startingAt To endingAt
            If findStr = worksheet.Cells(findRow, index).Value Then
                Return index
            End If
        Next
        Return 0
    End Function
    ''' <summary>
    ''' find sheet by name
    ''' </summary>
    ''' <param name="books"></param>
    ''' <param name="sheetName"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function xlsFindSheet(books As Excel.Workbook, sheetName As StringAs Excel.Worksheet
        Try
            For Each wb In workbook.Sheets
                If CType(wb, Excel.Worksheet).Name = sheetName Then
                    Return wb
                End If
            Next
            Return Nothing
        Catch ex As Exception
            Return Nothing
        End Try
    End Function
    ''' <summary>
    ''' enum for to identify models
    ''' </summary>
    ''' <remarks></remarks>
    Enum dsModel
        model_a
        model_b
        model_n
    End Enum
 
End Class

En este ejemplo componemos un datagridview con el modelo predefinido como “dsModel.model_a” donde leemos los totales a partir de la columna 7 buscando una fecha concreta, el contenido de los “rows” creados en el datagridview corresponden a los registros que contienen “Total” y su columna coincide con la fecha solicitada.

Dim excelObj = New excelHelper
Dim findDate As New Date(2014,05,21)
Dim sheetName = "SheetName" 
dgv.DataSource = excelObj.xlsToDataset_CustomModels(My.Settings.xlsFilePath, sheetName, findDate, excelHelper.dsModel.model_a)

 Como digo es un punto de entrada para aportar una idea, pero me comprometo a componer un ejemplo completo que ayude en su comprensión.
Saludos,
PepLluis,

No todos los bluetooth son iguales… alguien lo pone en duda?

Es obvio, pero es curioso comprobar en propias carnes las decenas de matices a tener en cuenta cuando quieres compatibilizar algunos módulos de electrónica con los estándares adoptados en los dispositivos móviles.

Existen cientos de utilidades, a partir de enlazar un dispositivo con una pequeña electrónica y ese es mi ánimo… a los que tengáis interés por el tema contactar conmigo y le damos un empujoncito para crear un mini-catálogo de dispositivos y compatibilidades.

Si es de interés en cuanto pueda os compartiré como “emparejarlos” y posteriormente recibir/enviar datos con un simple proyecto en Visual Studio.

Que por intentarlo no quede! J

Aquí una muestra de nuestro intento en el \\publish :

Saludos,
PepLluis,

Basic 50th Aniversario "do you remember?"

Con VB4 en 1995 nos subió la bilirrubina!
Fue el año en que muchos empezamos a crecer desarrollando aplicaciones Cliente/Servidor!

Y para dar crédito te adjunto una foto del Manual 🙂

Han pasado casi 20 años! Después de repasarlo un poco y compararlo con lo que tenemos hoy en día… “tampoco estamos tan lejos!” jajajajaja!
Memory’s
PepLluis,

 

LEGO EV3 Messenger from Visual Studio over Bluetooth!

En algunas de mis charlas, siempre me gusta enfatizar que Visual Studio es el entorno por excelencia para desarrollar soluciones orientadas a todo tipo de dispositivos… servidores, tabletas, teléfonos, ordenadores de escritorio o incluso chips. No creo que sea necesario desgranar las posibilidades dentro del portfolio de cada una de ellas.

Pues bien, hablando con algunos estudiantes entusiastas del “LEGO LEAGUE” donde parece que quieren encontrar el punto diferencial entre entornos como RCX o ROBOLAB y nuestro VS, tengo que concluirles que también podemos comunicarnos con el EV3 Kit a través de BlueTooth usando Visual Studio… creo que es muy interesante que le deis un repaso al “LEGO challenge” de la pasada competición del “Build for good” en Seattle.

http://blogs.technet.com/b/next/archive/2014/05/06/bringing-technology-back-to-the-playroom-floor.aspx#.U2tKD3mKDcu

No olvidéis darle un repaso al código, es una buena combinación y punto de partida para inciarnos al apasionante mundo de las comunicaciones entre tablets, mobilies y robots también “lego” J

https://ev3messenger.codeplex.com/

Espero vuestros comentarios!
PepLluis,

Basic 50th Aniversario y aun no desarrollas app’s para la tienda en VB?

A la estela de las ultimas entradas y para contradecir a los que tienen asociado BASIC con algo antiguo. Voy a compartir dos recursos sensacionales para asociar dos extremos de aprendizaje… entre “SmallBasic” y las app’s para la “Tienda”.

Dicho esto a los que aun no conocéis la MVA, aprovecho para recomendaros que os fabriquéis un plan de “aprendizaje” para este año, seleccionando los cursos que mejor se adapten a vuestras preferencias.
Y Como aprovechando el tirón de los 50 porque no empezar aprendiendo : 

Como desarrollar apps para la tienda de Windows usando Visual Basic

http://www.microsoftvirtualacademy.com/training-courses/creating-windows-store-apps-using-visual-basic

Feliz VB Learning!
PepLluis,

Imprimir en Negrita… como en los Viejos Tiempos

Un amable lector (Eduardo), a propósito de manejar impresoras al viejo estilo. me Pregunta :

<Estoy mandando a imprimir a una impresora movil, solo que necesito saber como darle formato al texto, es decir quiero mandar cierta linea en negrita, otra linea en un tamaño de fuente mas grande, etc etc, espero me puedas apoyar.>

Te respondo a la pregunta, pensando en aquellos tiempos en los que atacábamos a las impresoras directamente “sin drivers” usando el puerto paralelo o el puerto serie, quien no recuerda las ProPrinter II o las NEC.

Si no recuerdo mal, aunque algunos fabricantes coincidan, cada impresora disponía de un pequeño manual que contenía lo que conocíamos como “Secuencias de Escape”.

Por lo tanto disponíamos de dos clásicos, la selección de negrita : enviando una secuencia de [ESC]+[e] (o bien 0x27+0x45, la selección de ancho con [ESC]+[W] o 0x27+0x57.

Si la impresora la tienes unida al equipo con una interface Serie… desde tu aplicación deberás abrirlo “SerialPort.Open(“COMx”,9600…etc) según la configuración de fabrica y posteriormente mandarle las secuencias con “SerialPort.Write(Chr(27)+Chr(45))” por poner un ejemplo.

He encontrado un link con un antiguo  manual espero que te sirva : http://support.epson.ru/products/manuals/000350/part1.pdf

Saludos,
PepLluis,