Todas las entradas de: peplluis

Enumerar las unidades logicas de nuestros discos


‘ En respuesta a la pregunta de como enumerar las unidades
‘ Logicas de nuestros discos desde el prompt de DOS, os
‘ dejo este ejemplo utilizando el espacio de nombres
‘ My.Computer.Filesystem, en Vb9 y Linq


‘ Una vez compilado el proyecto, puede incluirse
‘ en el archivo de proceso o ‘Batch’ segun necesidad. 



‘ Listar las unidades logicas del Equipo

Module Module1  
  Sub Main()
      ‘ Obtener todas las unidades logicas de mi equipo
      Dim MisUnidades = From Unidad In My.Computer.FileSystem.Drives _
         Select Unidad.Name
      ‘ Componer la informacion que visualizare de mis unidades
      Dim InfoUnidad = From info In MisUnidades _
         Select Unidad = My.Computer.FileSystem.GetDriveInfo(info).Name,
          Volumen = My.Computer.FileSystem.GetDriveInfo(info).VolumeLabel(), _
          Tipo = My.Computer.FileSystem.GetDriveInfo(info).DriveType, _
          Espacio = My.Computer.FileSystem.GetDriveInfo(info).AvailableFreeSpace
      Try
          For Each Info In InfoUnidad
              ‘listar la informacion obtenida
              Console.WriteLine(Info)
          Next
      Catch ex As Exception
         ‘despreciar la informacion de las unidades que no estan a punto
      End Try
      ‘ esperar a que se pulse return
      Console.ReadLine()

  End Sub
End Module

Agregar una conexion de red

»
» Ejemplo de utilizacion de WNetConnection
» Correspondiente al ejemplo de : http://support.microsoft.com/kb/173011/es
» Adaptado a VB9/Vista  y complementando la respuesta del post
» http://forums.microsoft.com/MSDN-ES/ShowPost.aspx?PostID=3423382&SiteID=11
»
» En este ejemplo las variables lpLocalName lpRemoteName se asignan desde
» el codigo, para asignarlos dinamicamente podeis usar un listbox & textbox.
»
» Si os conectais a un recurso de servidor con un Usuario / Clave distinto
» distinto del utilizado para iniciar la session, debereis reasignar
» las variables ‘Usuario’ y ‘Clave’.
»

Public Class Form1
    Private MiRdR As New RecursoDeRed
   
    ‘ Conectar un recurso de RED
       
    Private Sub Conectar()
        ‘Definir el tipo de conexión
        ‘Segun documentacion del API
        MiRdR.dwScope = Recurso.CONNECTED
        MiRdR.dwType = Recurso_Tipo.DISK
        MiRdR.dwDisplayType = Recurso_TipoVista.SHARE
        MiRdR.dwUsage = Recurso_TipoUso.CONNECTABLE

        ‘Definir letra de unidad y nombre del recurso
        MiRdR.lpLocalName = «Z:»
        MiRdR.lpRemoteName = «\\servidor\recurso«
        MiRdR.lpComment = «** Mi Nueva Conexion**»
        MiRdR.lpProvider = «»

        ‘Si las credenciales son diferentes a las actuales
        ‘Sustituir por las adecuadas
        Dim Usuario = vbNullString  ‘Nombre de usuario
        Dim Clave = vbNullString    ‘Clave de acceso

        ‘Llamar a la funcion AñadirUnidad para WNetAddConnection2A
        ‘CONNECT_UPDATE_PROFILE = &H1
        MessageBox.Show( _
             CodigoError( _
              AñadirUnidad(MiRdR, Clave, Usuario, &H1)), _
              «Conectando…» + MiRdR.lpLocalName + » a « + MiRdR.lpRemoteName)
    End Sub
   
    ‘ Desconectar un recurso de red
   
    Private Sub Desconectar()
        MiRdR.lpLocalName = «Z:»
        ‘CONNECT_UPDATE_PROFILE = &H1
        If QuitarUnidad(MiRdR.lpLocalName, &H1, False) = 0 Then
            MessageBox.Show(«La unidad ha sido desconectada.», _
             «Desconectando…» + MiRdR.lpLocalName)
        Else
            MessageBox.Show(«Fallo en la desconexion del dispositivo», _ 
             «ERROR! Desconectando…»)
        End If
    End Sub
   
    ‘ Añadir los botones de Conectar/Desconectar
   
    Private Sub Form1_Load() Handles Me.Load
        Me.Text = «Conectar unidades de Red»
        Dim BotonDeConectar As New Button
        BotonDeConectar.Text = «Conectar»
        BotonDeConectar.Dock = DockStyle.Bottom
        AddHandler BotonDeConectar.Click, AddressOf Conectar
        Dim BotonDeCancelar As New Button
        BotonDeCancelar.Text = «Desconectar»
        BotonDeCancelar.Dock = DockStyle.Bottom
        AddHandler BotonDeCancelar.Click, AddressOf Desconectar

        Me.Controls.AddRange(New Control() {BotonDeConectar, BotonDeCancelar})
    End Sub
End Class


‘ Definicion y Referencias a la libreria mrp.dll
‘ para llamar a las funciones de WNetConnection, Add y Cancel


Module WNet
    Declare Function AñadirUnidad Lib «mpr.dll» Alias «WNetAddConnection2A» (ByRef lpRecursoDeRed As RecursoDeRed, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Integer
    Declare Function QuitarUnidad Lib «mpr.dll» Alias «WNetCancelConnection2A» (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Integer
   
    ‘ Estructura para llamar a la funcion de añadir
   
    Structure RecursoDeRed
        Public dwScope As Integer
        Public dwType As Integer
        Public dwDisplayType As Integer
        Public dwUsage As Integer
        Public lpLocalName As String
        Public lpRemoteName As String
        Public lpComment As String
        Public lpProvider As String
    End Structure
   
    ‘ Definir el recurso
   
    Enum Recurso
        CONNECTED = &H1
        REMEMBERED = &H3
        GLOBALNET = &H2
    End Enum
   
    ‘ Definir el tipo
   
    Enum Recurso_Tipo
        DISK = &H1
        PRINT = &H2
        ANY = &H0
    End Enum
   
    ‘ Definir la vista
   
    Enum Recurso_TipoVista
        DOMAIN = &H1
        GENERIC = &H0
        SERVER = &H2
        SHARE = &H3
    End Enum
   
    ‘ Definir el uso
   
    Enum Recurso_TipoUso
        CONNECTABLE = &H1
        CONTAINER = &H2
    End Enum
   
    ‘ Asignar codigos de retorno errores
   
    Function CodigoError(ByVal Codigo As Integer) As String
        Select Case Codigo
            Case 0 : Return «La unidad se agrego correctamente.»
           
Case 5 : Return «Acceso denegado!»
            Case 66 : Return «El tipo de dispositivo, no es correcto.»
            Case 67 : Return «El nombre de red, no es correcto.»
            Case 85 : Return «La unidad ya esta asignada!»
            Case 86 : Return «La clave de acceso no es valida!»
            Case 170 : Return «Ocupado!»
            Case 1200 : Return «Dispositivo Incorrecto.»
            Case 1202 : Return «El dispositivo se encuentra registrado»
            Case 1203 : Return «Sin red o ruta incorrecta!»
            Case 1204 : Return «El suministrador es Incorrecto.»
            Case 1205 : Return «No se puede abrir el perfil»
            Case 1206 : Return «El perfil es Incorrecto.»
           
Case 1208 : Return «Error extendido»
            Case 1223 : Return «Cancelado!»
            Case Else
                Return «ERROR, Codigo desconocido:» + Codigo.ToString
        End Select
    End Function

End Module

Un clasico caso de herencias entre padres e hijos

Aunque como siempre empezaremos diciendo que este ejemplo responde a las inquietudes de algunas consultas recibidas sobre MDI y de nuevo intentando darle un aire desenfadado, os dejo esta idea para clarificar… o liaros mas en el concepto de heredar.


Espero vuestros comentarios… eso si, que sean amables y con cariño.
Pep Lluis,


‘ Un clasico caso de Herencias…

Public Class ElPadre   
» 
   
» Construir el entorno en tiempo de carga
    »   
Private Sub ElPadre_Load() Handles MyBase.Load
       
‘ Me declaro contenedor de toda mi descendencia
        Me.IsMdiContainer = True
        Me.Text = «Soy el Progenitor, Padre de algunos y Abuelo de otros»
        ‘ Mi primer Hijo tendra un boton para crear mas hijos
        Dim CrearFormHijo As New Button
        CrearFormHijo.Text = «Tener un hijo»
        CrearFormHijo.Dock = DockStyle.Top
        Me.Controls.Add(CrearFormHijo)
        ‘ Invocar la funcion de Crear, al hacer click
        AddHandler CrearFormHijo.Click, AddressOf Crear   
End Sub
    »
    » Crear y Definir el Aspecto de los Hijos del Padre y sus Nietos
    »
    Private Sub Crear()
       
        ‘Definir la primera linea de descendencia
        Dim FormHijo As New MiForm(Me)
        FormHijo.Text = «Yo Soy el Hijo – Descendencia directa»
        ‘Presentar al nieto en sociedad
        FormHijo.Show()
       
        ‘Definir la segunda linea tomando la primera
        ‘como referencia y añadiendo nuevas particularidades
        Dim FormNieto As New MiForm(Me)
        FormNieto.Text = «Yo Soy el Nieto»
       
        ‘Los nietos tienen dos botones… peazo xoyo!
        Dim BotonDelNieto As New Button
        BotonDelNieto.Name = «BotonDelNieto»
        BotonDelNieto.Text = «Abuelo! Que hora es?»
        BotonDelNieto.Dock = DockStyle.Bottom
        FormNieto.Controls.Add(BotonDelNieto)
       
        ‘Llamar al Abuelo al pulsar el boton de todos los descendientes
        AddHandler BotonDelNieto.Click, AddressOf FormHijo.llamarAPapa
       
        ‘Llamar al verdadero padre, sobre el boton particular de los nietos
        AddHandler FormNieto.Controls.Item(0).Click, AddressOf FormNieto.YoSoyElVerdaderoPadre
        ‘Presentar al nieto en sociedad
        FormNieto.Show()
    End Sub
   
    ‘ solo mis hijos y nietos saben la hora
   
    Public Function MensajeDePapa() As String
        Return «Son las « + System.DateTime.Now
    End Function End Class

»
» Origen «genetico» de todos mis form’s
»
Public Class MiForm
    ‘ A su vez heredo todas las particularidades de WinForms
    Inherits Form    ‘ La referencia a mi antepasado
    Private MiPadre As Object
   
    ‘ Nacimiento!
   
    Sub New(ByVal padre As Object)
        ‘ Referenciar y no olvidar mis origenes
        MiPadre = padre
        MdiParent = MiPadre
       
        ‘ Mi descendencia heredara un boton mas que yo.
        
        Dim BotonDelHijo As New Button
        BotonDelHijo.Name = «BotonDelHijo»
        BotonDelHijo.Text = «Papa!… que hora es?»
        BotonDelHijo.Dock = DockStyle.Top
        Controls.Add(BotonDelHijo)
        ‘ Llamar a mi papa por click en boton del hijo
        AddHandler BotonDelHijo.Click, AddressOf llamarAPapa
    End Sub
   
    ‘ LLamar a papa
   
    Sub llamarAPapa()
        MessageBox.Show(MiPadre.mensajeDePapa, «Ummm…»)
    End Sub
   
    ‘ Llamar a mis antecesores… eres tu abuelo?
   
    Sub YoSoyElVerdaderoPadre()
        MessageBox.Show(» Yo soy tu verdadero padre!!», «Aunque te respondio Mi padre»)
    End Sub 

End Class


 

Conversaciones entre lenguages y compiladores – Vasado en una historia Real!

Con vuestro permiso y para no perder costumbre os invito a leer este relato corto en tono de humor… que lo disfrutéis!

Hace algunos días, en una de esas reuniones de profesionales, en las que aprovechando el buen recaudo de una cena, se discuten y se tratan todo tipo de temas sin orden ni concierto; recuerdo como entre medio de disertaciones sobre metodologías, lenguajes y sintaxis, me encontré  “para variar” evocando aquellos tiempos en que el pan era pan, el vino, vino y los lenguajes eran lenguajes de ¡alto nivel!.  

A lo ancho de la alargada mesa  se mantenían diversos “hilos” activos con diversas conversaciones “a saber cual la mejor”. Mientras sin saber porque,  y acaloradamente  empecé a recordar aquellos tiempos en los que los compiladores eras verdaderas joyas de la ingeniería.  Aquellos tiempos en los que sin existir la programación orientada a objeto éramos capaces de depurar los ensamblados de los Intel 8086 de las lanzaderas espaciales “online” y en tiempo real, para terminar llevando a un puñado de astronautas a la luna… de pronto me grite para mis adentros  :

“Pep!!! Eres un viejo incorregible, siempre terminas hablando de cómo era, pareces un petrificado historiador de informática”
A caldo de la conversación y después de mi pausa se fueron apagando el resto de conversaciones. Sin darme cuenta concentre todas las miradas mientras argumentaba que a pesar de entender la incorporación de ciertas metodologías tales como el procedimiento de realizar un “Invoke” para poder manejar datos entre hilos, tenía cierta sensación de que la medida que avanzábamos en las técnicas perdíamos ciertas purezas del lenguaje. Para poner un ejemplo, desde cierto punto de vista aunque no global, podría entender que fuera el propio compilador que decidiera como cruzar esos datos que se generan entre hilos de ejecución diferentes, de forma que no me obligara a invocar un procedimiento a no ser que yo lo explicitara.

Me gustaría poder enseñaros una foto del las caras que reflejaban los que estaban atentos a mi conversación, en ese momento no se si ponían cara de bobo por absortos o porque realmente estaban pensando que Pep  estaba  más loco que una cabra. Una vez mas para mis adentros pensé ..

“quien me mandara a mi meterme en semejantes pasteles! … luego me quejo de mi fama! J”.

En honor a todos los presentes y en pro de mi integridad y dedicado a mis contertulios más próximos Vicenc Masanas y Marc Rubiño, os dejo el apunte que en una línea resume lo estaba intentando explicar y que ¡en una línea! Explica que mis pensamientos no eran tan salidos de contexto ni estaban en absoluto equivocados.

CheckForIllegalCrossThreadCalls = false;

Para los que no estuvisteis en la cena… con este pragma instruimos al compilador si queremos controlar o no, las llamadas entre hilos a pesar de que sean “ilegales”, por lo tanto mi código podrá intercambiar datos entre hilos por contrabando sin necesidad de invoKar a nadie.Eso si en C++… ahora os dejo a vosotros que averigüéis si mi critica a los compiladores de C# o Visual Basic , eran infundadas y disponen de algo parecido.Cuidaros mucho y buen FinDe,
Pep Lluis,

 

Acceder al Espacio System.IO.Ports en C++

Algunos de vosotros en el foro estáis solicitando si es posible utilizar el System.IO.Ports con C++, esperando que esto sea un punto de entrada en un ejemplo súper simple!! De solo enviar y recibir una trama.

System IO Port & C++

Podéis descargaros el archivo adjunto, no esta probado en C++ express, pero supongo que no tendréis ningún problema en ejecutarlo.

Por cierto si reubicáis el proyecto (lo colocáis en un path diferente al original), cuando intentéis recompilarlo os generara un error : C1093 – detallando que no puede encontrar «stdafx.h». El concepto es que el proyecto genera y apunta determinadas referencias en tiempo de compilación, entonces la solución es  hacer un “build>Clean Solution” desde “Generar>Proyecto>Limpiar”. Luego simplemente “F5” J

Espero vuestras valoraciones.
Pep Lluis,

** El proyecto esta realizado con la vesion 9 de Visual Studio. (2008)
A peticion vuestra os dejo el codigo, para utilizarlo con Visual Studio 2005. Solo teneis que crear nuevo proyecto ‘winforms’ arrastrando y soltando un ‘ListBox’ un ‘Boton’ y un SerialPort.

namespace SystemIOPorts_EN_C {

 

      using namespace System;

      using namespace System::ComponentModel;

      using namespace System::Collections;

      using namespace System::Windows::Forms;

      using namespace System::Data;

      using namespace System::Drawing;

 

      /// <summary>

      /// Resumen de Form1

      /// Ejemplo de utilizacion del System.IO.Ports desde C++

      /// (C) Pep Lluis 2008

      ///

      ///

      /// Para realizar las pruebas es necesario insertar un

      /// conector de 9 pins en el puerto serie utilizado

      /// cortocircuitando (puenteando) los pines 2/3

      ///

      /// </summary>

      public ref class Form1 : public System::Windows::Forms::Form

      {

      public:

 

            Form1(void)

            {

                  InitializeComponent();

                  //

                  // Abrir el puerto de comunicaciones

                  // inhibir la verificacion de error de llamadas entre hilos

                  //

                  this->serialPort1->Open();

                  CheckForIllegalCrossThreadCalls = false;

            }

 

      protected:

            /// <summary>

            /// Limpiar los recursos que se estén utilizando.

            /// </summary>

            ~Form1()

            {

                  if (components)

                  {

                        delete components;

                  }

            }

      private: System::IO::Ports::SerialPort^  serialPort1;

      private: System::Windows::Forms::ListBox^  listBox1;

      private: System::Windows::Forms::Button^  button1;

      protected:

      private: System::ComponentModel::IContainer^  components;

 

      private:

            /// <summary>

            /// Variable del diseñador requerida.

            /// </summary>

 

 

#pragma region Windows Form Designer generated code

            /// <summary>

            /// Método necesario para admitir el Diseñador. No se puede modificar

            /// el contenido del método con el editor de código.

            /// </summary>

            void InitializeComponent(void)

            {

                  this->components = (gcnew System::ComponentModel::Container());

                  this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components));

                  this->listBox1 = (gcnew System::Windows::Forms::ListBox());

                  this->button1 = (gcnew System::Windows::Forms::Button());

                  this->SuspendLayout();

                  //

                  // serialPort1

                  //

                  this->serialPort1->BaudRate = 115200;

                  this->serialPort1->DataReceived += gcnew System::IO::Ports::SerialDataReceivedEventHandler(this, &Form1::serialPort1_DataReceived);

                  //

                  // listBox1

                  //

                  this->listBox1->FormattingEnabled = true;

                  this->listBox1->Location = System::Drawing::Point(13, 13);

                  this->listBox1->Name = L«listBox1»;

                  this->listBox1->Size = System::Drawing::Size(259, 95);

                  this->listBox1->TabIndex = 0;

                  //

                  // button1

                  //

                  this->button1->Location = System::Drawing::Point(197, 114);

                  this->button1->Name = L«button1»;

                  this->button1->Size = System::Drawing::Size(75, 23);

                  this->button1->TabIndex = 1;

                  this->button1->Text = L«Enviar»;

                  this->button1->UseVisualStyleBackColor = true;

                  this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

                  //

                  // Form1

                  //

                  this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

                  this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

                  this->ClientSize = System::Drawing::Size(284, 147);

                  this->Controls->Add(this->button1);

                  this->Controls->Add(this->listBox1);

                  this->Name = L«Form1»;

                  this->Text = L«C++ & System.IO.Ports»;

                  this->ResumeLayout(false);

 

            }

#pragma endregion

 

            /// Enviar trama usando System.IO.Ports

      private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

                         this->serialPort1->Write(L«Hola Gente»);

                   }

 

          /// Leer los caracteres recibidos y añadirlos al ListBox

      private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {

                         this->listBox1->Items->Add(serialPort1->ReadExisting());

                   }

 

      };

     

}

 

Delegados?

A menudo preguntamos sobre que son y para que sirven los delegados… valga esta entradrilla :-))

‘Según definición…
‘ Un delegado es un tipo que referencia un método compartido
‘ de un método tipo o una instancia de un objeto
‘ Cualquier procedimiento puede ser utilizado para crear una clase delegada
‘ de la instancia y posteriormente ser invocada a través del delegado
‘ … ea una especie de punteros…

 


‘Aunque el siguiente ejemplo no ilustre todos los usos 
espero sirva de punto de partida para los que empiezan.


‘No olvideis que el delegado puede contener y devolver parámetros…


‘pero eso es trabajo del artista.
 


 Delegate Function MiDelegado()

 Public Class Form1
    Private Encendido As Boolean = False

    Private Sub Form1_Load() Handles MyBase.Load
        ‘construir botón
        Dim MiBoton As New Button
        MiBoton.Text = «Asignar Delegado»
        MiBoton.AutoSize = True
        MiBoton.Dock = DockStyle.Bottom
        ‘al hacer click ejecutar sub
        AddHandler MiBoton.Click, AddressOf EncenderApagar
        ‘añadir botón al form
        Me.Controls.Add(MiBoton)
    End Sub

 
   Private Sub EncenderApagar()
        ‘Crear mi referencia al tipo delegado
        Dim MiRefencia As MiDelegado
        ‘Encender si está apagado / apagar si encendido
        If Not Encendido Then
            ‘asignar referencia a la función de encender
            MiRefencia = AddressOf Encender
        Else
            ‘asignar referencia a la función de apagar
            MiRefencia = AddressOf Apagar
        End If
        ‘Invocar la función en mi delegado
        MessageBox.Show(MiRefencia.Invoke)
    End Sub
   
    ‘Devolver el estado de encendido
    Private Function Encender() As String
        Encendido = True
        Return «Encendido»
    End Function
   
    ‘Devolver el estado de apagado
    Private Function Apagar() As String
        Encendido = False
        Return «Apagado»
    End Function
 End Class

Saludos,
Pep Lluis,

Ya me estas tardando mucho!… pero cuanto es mucho?


En algunas ocasiones puede interesarnos cronometrar el tiempo de determinadas operaciones. Aunque bien entendido que puede hacerse de diversas formas y a determinar la cual mas precisa, os dejo una idea como siempre muy simple de averiguar cuando nos esta tardando cierta operación, ya sea dentro de un bucle, en petición a un procedimiento externo, en una consulta a SQL o cualquier otra transacción.


‘ Simplificado y en VB9

‘Bucles para test del tiempo en ejecucion
Dim Bucles = Val(InputBox(«Numero de iteraciones»))
‘Poner en marcha el cronometro
Dim CronoIncial = System.DateTime.Now
‘Tarea a cronometrar
Dim numero = 0       ‘Variable para la simulacion

For x = 0 To Bucles
     numero += 1
     Text = numero.ToString
     Refresh()
 Next
‘para saber el tiempo empleado! .. restamos
MessageBox.Show(«Tiempo empleado : « + _
               (System.DateTime.Now – CronoIncial).ToString + _

                » s.», «Cronometro»)


…………..


‘ En VB8 Podria lucir como sigue



        ‘Variable simulacion de calculos
        Dim numero As Integer = 0
        ‘Bucles para test del tiempo en ejecucion
        Dim Bucles As Integer = Val(InputBox(«Numero de iteraciones»))
        ‘Poner en marcha el cronometro
        Dim CronoIncial As DateTime = System.DateTime.Now
        ‘Tarea a cronometrar
        For x As Integer = 0 To Bucles
            numero += 1
            Label1.Text = numero.ToString
            Label1.Refresh()
        Next
        ‘Tomar el tiempo del cronometro al finalizar
        Dim CronoFinal As DateTime = System.DateTime.Now
        ‘Restar Fin de Inicio para saber el tiempo empleado!

        MessageBox.Show(«Tiempo empleado : « + (CronoFinal – CronoIncial).ToString + » s.», «Cronometro»


Saludos,
Pep Lluis,

VB9 – Sobre los INICIALIZADORES.

Para añidir otra forma de verlo, a esta serie de «cortos»

    Private Sub Inicializar()
       
        ‘Los Inicializadores de siempre
        Dim MiPersona = New Persona
        With MiPersona
            .Nombre = «Carlos»
            .Apellido = «Arjona»
            .Edad = 28
        End With
       
        ‘Ahora en VB9, inicializadores basados en expresiones
        ‘nos permiten crear colecciones de objetos complejos
        Dim TusPersonas = New List(Of Individuo) _
            { _
             { .Nombre = «Jose», _
               .Apellido = «Garcia»} _
             { .Nombre = «Antonio», _
               .Apeliido = «Garrido»} _
            }
    End Sub
    Partial Class Individuo
        Public Property Nombre As String
        Public property Apellido as String
        Public Property Edad as Integer
    End Class

:-))


 

When VB Becomes OOP / Cuando VB se convirtió en POO

YES!!  Vb2

Sixteen years ago, after unending “Basic” programs, running lines of sequential sentences by number interpreted by a sad Basic runtime compiler, VB born announcing great news, one of more expected features claimed for Basic developers are the Objectoriented programming and now included in this first release.  (… I know.. Not full, light, but OOP 😉 ) , the other one, is changing the classical algorism when write programs, introducing advanced programming paradigms.

With this launch in 1992, VB for first time in several years becomes a first class language… this represent an incredible step for VB programmers and have your first implementation build for DOS space, using ASCII Chars to recreate real windows environment. ¡¡what’s folly!!

The short live of this product and the jumping Windows age, be responsible to not produce enough waves to arrival at wide developers community.  Only few enterprises can develop real applications with this fantastic environment, but I’m sure that the spirit and essence of this language comes inside the heart of all versions.

UMM… good times.  J
Pep Lluis,

 

Hace dieciséis años y después de interminables programas en Basic que ejecutaban líneas secuenciales de sentencias ordenadas por números interpretadas por aburridos compiladores, VB Nace anunciando una gran noticia en torno a la aplicación de nuevos paradigmas de programación avanzada. En esta Ocasión añadiendo la esperada y tan aclamada Programación orientada a objetos, aunque carecía de algunos aspectos primordiales de una POO real, podemos afirmar que era una buena implementación filosóficamente hablando. Con este avance VB se convierte en un lenguaje de primera línea… este gran paso para los programadores de Basic en 1992, vio su primera implementación en DOS y utilizando caracteres ASCII para simular un entorno real de ventanas. ¡Menuda locura! La corta vida de este producto y el despegue de la era de Windows fueron responsables e impidieron que llegara a conocimiento del grueso de la comunidad de desarrolladores. Solo unas pocas empresas pudieron desarrollar aplicaciones reales en este fantástico entorno, aunque estoy seguro de que el espíritu y la esencia del lenguaje continúan presentes en el corazón de todas sus versiones.

UM… qué tiempos aquellos.. J
Pep Lluis,

VB9 – Implicitly Typed Local Variables

Una de las preguntas mas frecuentes en repetidas conversaciones, es : que hay de nuevo en el recien liberado VB9?
Pues bien a modo de cortos y para hacer mas asequible la utilizacion de algunas de las ‘nuevas’ aqui va la primera de una pequeña serie.


OfCourse… espero vuestro comentarios.

 ‘Explicito.. lo de siempre
Dim MiNombre As String = «PepLluis»
Dim MiEdad As Integer = 29
Dim MisPersonas As Persona = New Persona With {.Nombre = «Maria»}
 ‘Implicito, Inferencia en la definicion
Dim TuNombre = «Mauricio»
Dim TuEdad = 39
Dim TusPersonas = New Persona With {.Nombre = «Carmen», .Edad = 20}

‘Nuestra clase Persona
Class Persona
     Public Nombre = «»
     Public Apellido = «»
     Public Edad = 0
End Class

PD. Si asi lo considerais, podemos comentar el codigo, añadiendo mas explicaciones… quizas sea mas clarificador, espero vuestras valoraciones.