Archive for the ‘Visual Basic .NET’ Category

Si mi mente no es estática, mi tipado tampoco debería serlo…

Despues de haber leído el articulo de Fernando en Cocoa Mental, se me ocurrió retuiterarlo…y me vi inmerso en un debate con unos interlocutores a los cuales en principio no iba destinado el dardo del autor.

Fernando apuntaba a “Javeros” y “Cpluspluseros”…pero fueron en mayoria “.neteros” (hoy estoy “sembrao” con los palabros) los que se dieron por aludidos, y principalmente usuarios de C#.

Para los que no me conozcáis llevo desde los 10 años rascando código, y voy a cumplir 35 dentro de un mes, y si bien la cantidad y la calidad son los mismo que el tocino y la velocidad, os ruego que hagáis un “auto de fe” sobre lo que os quiero explicar, y al final del post saquéis vuestras propias conclusiones.

En mi día a día principalmente me peleo con .NET y con ObjC+Cocoa, aunque también tengo que entrar al trapo en otras guerras, pero estas no nos aportarían demasiado para el tema que quiero tocar aquí.

Así que, vamos a meternos en harina…

Al contrario que Fernando…veo mas similitudes que diferencias en las dos plataformas que toco, y creo que podemos extrapolar ese pensamiento a todas las plataformas actuales…ahora me explico… ;)

Todas han sido ideadas (con mayor o menor fortuna) para solucionar problemas estándar…y nos ponen en la manos unas herramientas que yendo por la línea  rápida y recta, o dando un largo rodeo…nos permiten (al menos que seamos unos patanes integrales) llegar al mismo sitio…

-Unos harán ese camino dejando suciedad por todos sitios y dando saltitos de aquí para allí mientras caminan…

-Otros irán limpiando el camino y tomando apuntes, incluso dejando miguitas de pan para los que lleguen después…

-Otros, lo harán acompañados de gente y de manera ordenada (estos irán en carreta, turnándose para tirar de la misma y conseguirán cansarse menos)

-Los hay que preferían no hacer ese camino sin consultar previamente los mapas, leerán los apuntes de algún viajero anterior…estudiaran la mejor manera de llegar y verán que con un estricto análisis se podía tomar un atajo que evite pasar una y otra vez por la misma encrucijada…

Al final todos se encuentran delante de una puerta  y pueden abrirla con una llave, o de una pedrada, pero los dos métodos te permitirán entrar

Como veis existen múltiples maneras de hacer las cosas…y eso es común para todas las plataformas…

Bien…a estas alturas del post os estaréis preguntando hacia donde os quiero llevar…seguirme, que ya queda menos… ;)

Los lenguajes y las plataformas, no dejan de evolucionar. Cada una a su ritmo…pero observándose mutuamente…

Si alguno tiene algo realmente bueno, el otro intentara asimilarlo dentro de su core, o implementara algún tipo de “parche” o invento para conseguir el mismo fin…y eso esta pasando constantemente…

Por ejemplo uno de los creadores de Java era un fanático de la plataforma NEXT y se llevo cosas de Objective-C para su nuevo lenguaje.

Un ejemplo técnico sencillo es el tema de los auto-synthetize que nos ahorra unas líneas de código en Objective-C…pues eso existía integrado desde hacia un tiempo antes en .NET, donde declarando las property de una cierta manera se nos generan “por detrás” los getters y los setters necesarios para acceder a ellas…

El otro día descubrí (buscando otra cosa) como “atacar” colecciones de datos con querys’s estilo “SQL” en Objective-C me pareció súper potente para ciertos asuntos…y profundizando en esa búsqueda,  también me di cuenta que eso mismo, se podía hacer en .NET desde la versión 4 del framework atacando los datos con LINQ y con una sintaxis también sospechosamente parecida a SQL

Muchos estaréis pensando que si, que todo muy bonito…pero que, en esencia, el tema de los tipados si que separa a las dos plataformas de manera total…o no?¿

Pues si, y no, una vez más (seguid leyendo hasta el final del post, por favor… ;) xD)…

Para mi el tipado estático realmente representa una carga en el desarollo, y mas cuando has probado las mieles del dinamismo

Yo lidio todos los días con .NET…y puedo trabajar como lo haría con otro lenguaje con tipado dinámico…a eso se le llama “inferencia de tipos” que permite a los lenguajes funcionales soltar lastre y no ser tan estrictos…un buen ejemplo de esto es el lenguaje F# .

En .Net, a partir del framework 4.0 usando declaraciones del tipo “dynamic” el compilador no se queja y manda la llamada necesaria al nuevo motor de ejecución DLR (Dynamic Language Runtime) en lugar del clásico CLR (Common Language Runtime). Y si nos paramos a pensar, antes usando “reflexión” también podíamos  hacer algo parecido (usando Get types), aunque eso era algo mas feote… ;) xD

Por cierto ese nuevo DLR permite cosas muy chulas como ejecutar lenguajes dinámicos como Python (o deberíamos decir Iron Python) bajo .NET y integrarlo plenamente en Visual Studio con muy buenos resultados…

Una vez mas llegamos a lo mismo pero de distinta manera…y todo eso servirá para demostrar algo al final de todo (si no me lio dentro de mis propios pensamientos) ;)

En el post del que surge todo este embolao, Fernando califico a los patrones de diseño como : “una señal de ineficiencia”…

Estoy de acuerdo con esta afirmación?¿ Pues una vez mas si y no, y el que no llegue al final del post no sabrá porque… ;) xDDD

En .NET tenemos mucha libertad para rascar código…tenemos un IDE muy chulo (me encanta Xcode, pero VS2012 esta también muy bien) que permite fácilmente ponerte directamente a crear algo…pero eso no acostumbra a ser una buena idea…Y ahí entran los patrones de diseño…que no dejan de ser una “plantillas” para que no nos descarriemos mucho por el camino…

Y en que lugar deja esto a Objective-C? No usamos con el los patrones de diseño?¿

Pues en realidad si que los usamos y mucho, en casi todo momento…usamos el MVC, el delegado, el observador constantemente…y casi no nos damos cuenta de que lo hacemos…

Simplemente Objective-C y el IDE te empujan a usarlos sin darte cuenta…

Os recomiendo un libro que os ayudara sobre este tema especifico : Pro Design patterns for IOS ;)  y este otro que os servirá para todo…un imprescindible : Design patterns : Elements of reusable object oriented software.

Y ahí es donde quería llevaros desde el principio…

Para mi, el quid de la cuestión no es tanto el tipado, ni los patrones…sino el paradigma o la esencia en si de las propias plataformas y lenguajes

No es un algo, sino el conjunto, el todo, que las hace mejor o peor para conseguir un objetivo

La curva de aprendizaje de alguien que aprende Java o .NET es ascendente…fácil al principio y difícil según se complican las cosas…

Con Objective-C es totalmente a la inversa…te llevas un mazazo al intentar adentrarte en el…y cuando superas ese muro, ya puedes empezar a hacer cosas muy vistosas o complicadas en otras plataformas, sin apenas esfuerzos

Programar con Objective-C te hace tomar decisiones para solventar problemas de manera en cierto modo inducida,  o guiada (un poco como si te llevaran de la mano).

Desarrollas de una cierta manera, cambias la manera de pensar, de enfrentarte a los problemas…usas la potencia del lenguaje dinámico, la potencia al mas alto nivel de los patrones…y puede ser que nunca hayas profundizado ni te hayas interesado en leer nada sobre ninguna de las dos cosas…y sin embargo ahí estas…

Evidentemente, os recomiendo conocer lo mejor posible la plataforma que uséis para poder sacarle rendimiento…y no hacer las cosas por inercia…

Cuanto mas conozcas sobre datos, arquitectura de software, pros, contras, fuerzas y restricciones etc…en mejor profesional te convertirás…necesitas esa información para asimilarla y aplicarla correctamente…

Buenos developers y chapuzas los hay en todas las plataformas…

Pero una de las cosas que me a enseñado la vida, es que no los reconocerás por el lenguaje que dominen, por la plataforma que usen, los reconocerás por la apertura de miras que tengan, la curiosidad que presenten o las ansias de aprender que demuestren…

Por eso quizás el titulo de este post no sea del todo correcto, o quizás si…eso ya lo decidirás tu…

Amplia horizontes, prueba, tantea, estudia, experimenta, pero sobretodo que tu mente no se quede estática… ;)

 

Share

Cerrar MDIChild de un MDIParent

Podemos cerrar todos los formularios MDIChild de un formulario MDIParent

' Se asume que se ejecuta desde el formulario MDIParent usando Me
For Each ChildForm As Form In Me.MdiChildren
    ChildForm.Close()
Next
Share

Vb.net: AutoComplete

Una de las cosas que más quebraderos de cabeza nos puede llegar a dar es la forma en que los usuarios introducen los datos, ya que para una misma referencia podemos llegar a tener variaciones que a la hora de extraer los datos. Por ejemplo, no será lo mismo entrar nombre-apellido que nombre_apellido.

¿Qué podemos hacer? Limitar la imaginación de los usuarios o sugerirles la forma correcta de hacerlo. Una buena manera es utilizar los Auto Complete, que nos permiten sugerir a los usuarios contenido ya entrado que puede corresponder con lo que quieren introducir.

Aquí tenemos un ejemplo para cargar unos datos des de una base de datos.

 DBConnection = New OleDbConnection(DBCONNECTION_STR)
 DBConnection.Open()
 DBCommand = DBConnection.CreateCommand()
 DBCommand.CommandText = SQL_SELECT_STR
 DBCommand.Connection = DBConnection
 DBDataReader = DBCommand.ExecuteReader()
 ' Cargamos los valores
 While (DBDataReader.Read())
    TextBox.AutoCompleteCustomSource.Add(DBDataReader(0)) ' En este caso los datos de la primera columna del resultado devuelto
 End While
 DBConnection.Close()

En el objeto TextBox hay que modificar las propiedades

AutoCompleteMode con el valor Suggest, Append o SuggestAppend (Sugerir, Añadir o Sugerir+Añadir)

AutoCompleteSource con el valor CustomSource, para este caso. Existen otros tipos de fuente para rellenar la colección de auto completado.

Si los valores que queremos poner como sugerencias de AutoComplete los vamos a utilizar en más de un objeto, podemos utilizar una variable de tipo AutoCompleteStringCollection.

Dim stringCollection As New AutoCompleteStringCollection

Cargamos los valores en la colección

While city_reader.Read()
     stringCollection .AddRange(New String() {DBDataReader(0)})
End While

Cargamos la colección en los diferentes objetos en los que queremos sugerir contenido.

TextBox1.AutoCompleteCustomSource = stringCollection 
TextBox2.AutoCompleteCustomSource = stringCollection

 

 

Share

Vb.net – Saltos de linea

Tenemos varias maneras de realizar el salto de linea en VB.net

Utilizando constantes de VB

  • vbNewLine
  • vbCrLf

Utilizanzo la función de caracteres

  • Chr(13)

Utilizando el control de caracteres

  • ControlChars.NewLine
  • ControlChars.CrLf

Utilizando la variable de entorno

  • Environment.NewLine

 

Share

Vb.net : Leer un archivo de texto mediante System.IO

Este snippet es otro de los clásicos a los que tendréis que recurrir en algún momento de vuestras andanzas en vb.net :

Imports System
Imports System.IO
Imports System.Collections

Module Module1

    Sub Main()
        Dim objReader As New StreamReader("c:\test.txt")
        Dim sLine As String = ""
        Dim arrText As New ArrayList()

        Do
            sLine = objReader.ReadLine()
            If Not sLine Is NothingThen
                arrText.Add(sLine)
            End If
        Loop Until sLine Is Nothing
        objReader.Close()

        For Each sLine In arrText
            Console.WriteLine(sLine)
        Next
        Console.ReadLine()
    End Sub

End Module

En otros posts trataremos ahondaremos mas en el tema ficheros…

Share

Vb.Net: Seleccionar fila de DataGrid por código

Para seleccionar una fila de un DataGrid por código podemos hacerlo de la siguiente manera

            DataGrid.ClearSelection()
            DataGrid.CurrentCell = DataGrid.Rows(numRow).Cells(0)
            DataGrid.Refresh()

Caso practico: crear una barra de navegación por el DataGrid, con lo que tendremos que controlar la posición actual y los avances.

Share

Vb.net : Ejemplo basico de trabajo con hilos (threads)

Muchas veces necesitamos lanzar varios procesos que trabajen a la vez, esto se puede hacer mediante threads (hilos).

Os dejo un ejemplo básico sobre los mismos :

Imports System.Threading

Private Sub btnEnviar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnviar.Click
        'Instanciar el hilo
        Dim oHilo As Thread
        'crear objeto y asignarlo al sub que queremos ejecutar
        oHilo = New Thread(AddressOf EjecutarAlgo)
        'lanzar el hilo
        oHilo.Start()
End Sub
Share

Vb.net : Creación de Clases y objetos

Os dejo un Snippet de los básicos, la estructura de una clase en Vb.net :

Public Class Coche
    Public Modelo as String
    Public Precio as Double
    Public NumeroDeVelocidades as Integer
    Private Velocidad as Integer

    Public Sub Acelerar(ByVal km As Integer)
       Velocidad = Velocidad + km
    End Sub

    Public Sub Frenar()
       If Velocidad > 0 Then
          Velocidad = Velocidad -1
       End If
    End Sub

    Public Function ConsutarVelocidad() As Integer
       Return Velocidad
    End Function
End Class

Podremos apreciar como propiedades de la Clase : Modelo, Precio, NumeroDeVelocidades y Velocidad, y como métodos de la clase : Acelerar(km) , Frenar() y ConsultarVelocidad().

Y ahora una muestra de como instanciar dicha clase :

Dim objCoche as Coche= New Coche

Dim VelocidadActual as Integer

objCoche .Modelo = "Seiscento"
objCoche .Precio = 200
objCoche .NumeroDeVelocidades = 21

objCoche .Acelerar(5)
objCoche .Frenar()

VelocidadActual = objCoche .ConsultarVelocidad
Share

Visual Basic.NET : Hola Mundo!

Un clásico moderno… ;)

Module Module1

Sub Main()

Console.WriteLine("Hola mundo!")

End Sub

End Module
Share