Etiqueta: Visual Studio

Posts relacionados con el entorno de desarrollo (IDE) de Visual Studio

  • Nuevas características de C# 6 y VB 14

     

    Pues eso… que lo prometido es deuda y antes de que se me olvide, pues… te pego la tabla que te comenté antes con las novedades o nuevas características que tendrán los lenguajes principales de .NET en la versión definitiva de Visual Studio 2015 o lo que es lo mismo en .NET 4.6 o en la versión final de Roslyn (.NET Compiler Platform).

    Esta tabla está "tomada prestada" de esta entrada: Languages features in C# 6 and VB 14 del sitio de Roslyn en Codeplex.

    Debes tener en cuenta lo que en página dice sobre estas novedades (está en inglés pero con la ayuda del traductor de Google te lo pongo para que lo entiendas si no sabes mucho inglés):
    Tenga en cuenta que todo está todavía sujeta a cambios – se trata de una vista previa después de todo. Sin embargo, estamos razonablemente seguros acerca de la característica general establecido en este punto.

    La tabla con las características de los lenguajes:

    Feature Example C# VB
    Auto-property initializers public int X { get; set; } = x; Added Exists
    Getter-only auto-properties public int Y { get; } = y; Added Added
    Ctor assignment to getter-only autoprops Y = 15 Added Added
    Parameterless struct ctors Structure S : Sub New() : End Sub : End Structure Added Added
    Using static members using System.Console; … Write(4); Added Exists
    Dictionary initializer new JObject { ["x"] = 3, ["y"] = 7 } Added No
    Await in catch/finally try … catch { await … } finally { await … } Added No
    Exception filters catch(E e) if (e.Count > 5) { … } Added Exists
    Partial modules Partial Module M1 N/A Added
    Partial interfaces Partial Interface I1 Exists Added
    Multiline string literals "Hello<newline>World" Exists Added
    Year-first date literals Dim d = #2014-04-03# N/A Added
    Line continuation comments Dim addrs = From c in Customers ‘ comment N/A Added
    TypeOf IsNot If TypeOf x IsNot Customer Then … N/A Added
    Expression-bodied members public double Dist => Sqrt(X * X + Y * Y); Added No
    Null propagation customer?.Orders?[5]?.$price Added Added
    String interpolation $"{p.First} {p.Last} is {p.Age} years old." Added* Planned
    nameof operator string s = nameof(Console.Write); Added* Planned
    #pragma #Disable Warning BC40008 Added Added
    Smart name resolution   N/A Added
    ReadWrite props can implement ReadOnly   Exists Added
    #region inside methods   Exists Added
    Overloads inferred from Overrides   N/A Added
    CObj in attributes   Exists Added
    CRef and parameter name   Exists Added
    Extension Add in collection initializers   Added Exists
    Improved overload resolution   Added N/A

    *Design changes expected

    Para más información sobre todas las características (con detalle):

    C# feature descriptions (es un PDF)

    Visual Basic feature descriptions (es una página web)

     

    Si quieres probar estas novedades, puedes hacerlo desde la versión preview de Visual Studio 2015 la cual te la puedes descargar desde este enlace.

    VS2015_preview

    Espero que te sirva y… eso… a ver si voy haciendo algunas pruebas…

     

    Nos vemos.
    Guillermo

  • vaya lío… VB 14 es VB 1 y C# 6 es C# 1

     

    Pues eso… que con todo esto de Roslyn (la nueva generación de compiladores de Visual Basic y C#) se ve que la numeración de los compiladores vuelve a empezar desde 1.0.

    En la versión actual de Visual Studio 2013 (con Update 4) las versiones de los compiladores incluidos son estos (tal como podemos ver en las figuras 1 y 2):
    Visual Basic 11
    C# 5.0

     
    Figura 1. Versión del compilador de C# incluido en Visual Studio 2013.4

     
    Figura 2. Versión del compilador de VB incluido en Visual Studio 2013.4

    Donde se han quedado las versiones 12 y 13 de Visual Basic es un misterio (al menos para mí) (*) pero en la versión preview de Visual Studio 2015 (hasta hace poco llamada Visual Studio 14) las versiones de los compiladores eran: C# 6.0 y VB 12, así que… se ve que el compilador de Visual Basic ha ganado dos versiones… 🙂

    (*)Sobre las versiones de VB:
    Yo pensaba que VB 12 era el que se incluía con VS2013 y se ve que mantiene el nombre o número VB 11, pero del VB 13 no recuerdo haber visto nada.
    De hecho VB 12 era el que corresponde con C# 6 en las CTP de Roslyn y posteriores versiones de Visual Studio CTP/Preview, aunque ahora en Roslyn se habla (o escribe) de C# 6 y VB 14.

     

    En el Visual Studio 2015 Preview (Ultimate) las versiones mostradas en las información de los compiladores son la 1.0 (con el número de compilación que no sé de dónde viene, ya que es 41031 y la de Visual Studio es 14.0.223110.1) tal como puedes apreciar en las figuras 3 y 4:

     
    Figura 3. Versión del compilador de C# incluido en Vs2015 Preview

     
    Figura 4. Versión del compilador de VB incluido en Vs2015 Preview

    Pero bueno, por ahora si ves que hablan del compilador C# 6.0 o VB 14 están hablando de lo que vendrá con .NET 4.6 y Visual Studio 2015 (aunque la numeración interna es la 14).

    Por cierto, en los compiladores vienen un montón de novedades… a ver si te pongo una tabla que he visto hace un rato con un resumen de las novedades tanto de C# como de Visual Basic.

     

    Nos vemos.
    Guillermo

  • Detectar pulsación de teclas en el formulario (y controles)

    Pues eso… esto viene a raíz de una consulta sobre cómo detectar la pulsación de teclas en los formularios de Windows Forms, es decir, saber qué tecla se ha pulsado aunque ya se esté detectando en cajas de texto u otros controles.

    En los controles no hay problemas para detectarlo, ya que solo tendremos que escribir código en los eventos de pulsación de teclas: KeyPress, KeyDown o KeyUp del control y asunto arreglado.

    Pero cuando se trata de detectar esas pulsaciones a nivel de formulario, es decir, independientemente de qué control tenga el foco, también podemos usar esos tres métodos de evento en el formulario, pero antes debemos indicarle al runtime de .NET que queremos detectar esas pulsaciones de teclas.

    Para ello debemos asignar un valor True a la propiedad KeyPreview del formulario.

    Distinguir la pulsación en mayúsculas de minúsculas (o no)

    Si queremos detectar la pulsación de teclas sin que nos importe si es una tecla mayúscula o minúscula lo mejor es hacerlo en cualquiera de los eventos KeyDown o KeyUp, ya que en esos eventos además de la tecla pulsada se puede saber si también se pulsa la tecla Shift (cambio de mayúsculas).

    En caso de querer detectar la pulsación de letras en el evento KeyPress tendremos que hacer una doble comprobación, una para la letra en mayúscula y otra para saber si es minúscula.

    Nota del 18/Sep/2020:
    Si quieres detectar la pulsación con la tecla Control (CTRL) o Shift o Alt, es recomendable hacer algo como el código que te indico a continuación.

    Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs)
        If e.KeyCode = Keys.F3 Then
            e.Handled = True
            Buscar()
        ElseIf e.Control Then
            If e.KeyCode = Keys.F Then
                e.Handled = True
                esCtrlF = True
                Buscar()
            ElseIf e.KeyCode = Keys.H Then
                e.Handled = True
                Reemplazar()
            End If
        End If
    End Sub
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.F3)
        {
            e.Handled = true;
            Buscar();
        }
        else if (e.Control)
        {
            if (e.KeyCode == Keys.F)
            {
                e.Handled = true;
                esCtrlF = true;
                Buscar();
            }
            else if (e.KeyCode == Keys.H)
            {
                e.Handled = true;
                Reemplazar();
            }
        }
    }

     

    El orden de pulsación de teclas (en controles y formulario)

    Debido a que podemos usar los tres eventos comentados al principio, lo mismo te interesa saber en qué orden se procesan los eventos.

    El orden es el siguiente:

    1. KeyDown
    2. KeyPress
    3. KeyUp

    Lista 1. Orden en que se procesan los eventos de pulsación de teclas

    Y si estamos comprobando en el formulario además de en los controles, el orden global será el siguiente:

    1. KeyDown del formulario
    2. KeyDown del control
    3. KeyPress del formulario
    4. KeyPress del control
    5. KeyUp del formulario
    6. KeyUp del control

    Lista 2. Orden en que se procesan los eventos de pulsación de teclas cuando se comprueba también en el formulario además de en los controles

    Es decir, el mismo orden que en la lista 1, pero empezando siempre por el formulario y después en el control.

    Veamos un poco de código de ejemplo

    Para esta prueba creamos un proyecto nuevo y al formulario le añadimos los controles mostrados en la figura 1.

    pulsar teclas en formulario
    Figura 1. El formulario de prueba en modo de diseño

    Creamos los eventos KeyDown, KeyPress y KeyUp tanto en el formulario como en las cajas de texto. Para este ejemplo, solo he puesto código para detectar la pulsación en la primera caja de textos (textBox1) y en el formulario (recuerda asignar un valor verdadero a la propiedad KeyPreview del formulario).

    En este código (tanto para Visual Basic como para C#) detectamos la pulsación de las teclas S y W tanto en el textBox1 con en el propio formulario. Están contemplados los tres eventos comentados y en la caja de textos (textBox3) de la parte inferior, a la que he asignado un valor True a la propiedad MultiLine, así como el valor Vertical a la propiedad ScrollBars. con idea de que nos permita desplazarnos por el contenido y veamos la secuencia de pulsación de teclas.

    Nota:
    Más abajo tienes un enlace al proyecto del código de ejemplo.

    Código de ejemplo para C#

    Nota:
    Recuerda asignar estos métodos a los eventos correspondientes.

    // El orden "global" de pulsación es:
    // KeyDown en formulario
    // KeyDown en control
    // KeyPress en formulario
    // KeyPress en control
    // KeyUp en formulario
    // KeyUp en control
    
    // para que detecte las pulsaciones en el formulario 
    // hay que asignar un valor True a la propiedad KeyPreview del formulario
    
    // en KeyDown no diferencia entre mayúsculas y minúsculas
    // en KeyPess si distingue la diferencia
    
    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        switch (e.KeyChar)
        {
            case (char)Keys.W: // mayúsculas
            case (char)(Keys.W + 32): // minúsculas
                label3.Text += "\nTecla W en el formulario";
                textBox3.Text += "\r\nTecla W en el formulario (KeyPress)";
                break;
            case (char)Keys.S:
            case (char)(Keys.S + 32): // minúsculas
                label3.Text += "\nTecla S en el formulario";
                break;
        }
    
    }
    
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        // da igual mayúsculas que minúsculas
        switch (e.KeyCode)
        {
            case Keys.S:
                label3.Text = "Tecla S en el formulario (KeyDown)";
                break;
            case Keys.W:
                label3.Text = "Tecla W en el formulario (KeyDown)";
                textBox3.Text += "\r\nTecla W en el formulario (KeyDown)";
                break;
        }
    }
    
    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        switch (e.KeyValue)
        {
            case (char)Keys.S:
                label3.Text = "Tecla S en el formulario (KeyUp)";
                break;
            case (char)Keys.W:
                label3.Text = "Tecla W en el formulario (KeyUp)";
                textBox3.Text += "\r\nTecla W en el formulario (KeyUp)";
                break;
        }
    
    }
    
    
    // el orden de pulsación es:
    //  KeyDown, KeyPress y KeyUp
    
    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        // e.KeyValue el código numérico
        textBox3.Text += "\r\ntextBox1_KeyDown, tecla: " + e.KeyCode;
    }
    
    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        textBox3.Text += "\r\ntextBox1_KeyPress, tecla: " + e.KeyChar;
    }
    
    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        textBox3.Text += "\r\ntextBox1_KeyUp, tecla: " + e.KeyValue;
    }
    
    

    Código de ejemplo para VB:

    Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
        Select Case e.KeyChar
            Case ChrW(Keys.W), ChrW(Keys.W + 32) ' mayúsculas y minúsculas
                label3.Text &= vbCrLf & "Tecla W en el formulario"
                textBox3.Text &= vbCrLf & "Tecla W en el formulario (KeyPress)"
            Case ChrW(Keys.S), ChrW(Keys.S + 32)
                label3.Text &= vbCrLf & "Tecla S en el formulario"
    
        End Select
    End Sub
    
    Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
        ' da igual mayúsculas que minúsculas
        Select Case e.KeyCode
            Case Keys.S
                label3.Text = "Tecla S en el formulario (KeyDown)"
            Case Keys.W
                label3.Text = "Tecla W en el formulario (KeyDown)"
                textBox3.Text &= vbCrLf & "Tecla W en el formulario (KeyDown)"
        End Select
    End Sub
    
    Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
        Select Case e.KeyCode
            Case Keys.S
                label3.Text = "Tecla S en el formulario (KeyUp)"
            Case Keys.W
                label3.Text = "Tecla W en el formulario (KeyUp)"
                textBox3.Text &= vbCrLf & "Tecla W en el formulario (KeyUp)"
        End Select
    End Sub
    
    
    ' el orden de pulsación es:
    ' KeyDown, KeyPress y KeyUp
    
    Private Sub textBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles textBox1.KeyDown
        ' e.KeyValue el código numérico
        textBox3.Text &= vbCrLf & "textBox1_KeyDown, tecla: " & e.KeyCode
    End Sub
    
    Private Sub textBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles textBox1.KeyPress
        textBox3.Text &= vbCrLf & "textBox1_KeyPress, tecla: " & e.KeyChar
    End Sub
    
    Private Sub textBox1_KeyUp(sender As Object, e As KeyEventArgs) Handles textBox1.KeyUp
        textBox3.Text &= vbCrLf & "textBox1_KeyUp, tecla: " & e.KeyValue
    End Sub
    

    Y esto es todo, espero que te sea de utilidad.

    Y si quieres ver más cosas de cómo detectar la tecla pulsada o cambiar el valor de esa pulsación, lee esto: Detectar la pulsación de teclas.

    Nos vemos.

    Guillermo

    El código del ejemplo

    Este es el proyecto del código mostrado.

    Lo he creado con Visual Studio 2013 Preview, pero el código es completamente compatible con cualquier versión de Visual Studio .NET, aunque es posible que los proyectos solo los puedas abrir con Visual Studio 2010 o posterior (no lo he comprobado).

    Lo que si es seguro es que si añades el formulario a un proyecto creado con cualquier versión de Visual Studio .NET que utilicen el .NET 2.0 o superior, si que te servirá.

    Nombre fichero: Detectar_tecla_en_formulario.zip

    Tamaño: 140 KB (143 434 bytes)

    Fecha: 21 septiembre 2013 14:15:32

    MD5: B80281EBF0C032FBF9487C5B251FD1BB