Autor: elGuille

  • Cuidadin al actualizar Visual Studio 2019

    Pues eso… en Visual Studio 2019, tanto la Preview como la definitiva, existe una opción supuestamente pensada para mejorar la edición de formularios (tanto de Windows Forms como de XAML) y si trabajas con monitores externos puede que te de problemas si esa opción está seleccionada, que es el estado que tiene cuando lo instalas o actualizas (al menos hasta la versión 16.4.4 de la versión final o la 16.5.0 Preview 2 de la versión Preview).

    En la figura 1 y 2 puedes ver esa opción en concreto (Optimizar la representación de las pantallas de píxeles distintas) tanto en inglés como en español.

    Figura 1. Options > General de Visual Studio 2019 (en inglés)
    Figura 2. Opciones > General de Visual Studio 2019 (en español)

    Cuando tienes esa opción seleccionada el Visual Studio ajusta (y lo peor es que sin avisar) los tamaños de los elementos del formulario (y del propio formulario) para que, en teoría, se ajuste adecuadamente.

    Pero, al menos en mi experiencia, lo que hace es volverte loco… ya que te cambia los tamaños de los formularios o de los controles contenidos en esos formularios… lo último que me ha cambiado es el valor de la propiedad ImageScalingSize que es la que se encarga de mostrarte el tamaño de los iconos en un menú.
    En realidad no me cambió el valor (ya que normalmente esa propiedad no se indica y se usan los valores predeterminados), lo que hizo fue añadir el tamaño 24 para los iconos… y, claro… eran algo grandes 😉

    Comentarte cómo uso el Visual Studio.

    Yo tengo un portátil (laptop) con una resolución de pantalla de 1920×1080 con un monitor externo de 3840×2160.

    El Visual Studio lo abro en el monitor externo e intento que todas las ventanas se abran también en ese mismo monitor.

    La opción que te he comentado, la tengo desactivada (sin marcar) ya que de tenerla me cambia las proporciones/tamaños de los controles y ventanas/formularios.

     

    NOTA: Si vas a hacer pruebas para ver qué ocurre te recomiendo que hagas antes una copia del código con el que vas a probar.

    Nos vemos.
    Guillermo

  • Métodos de Extensión (Extesion Methods) en VB y C#

    Pues eso… te voy a mostrar algunos ejemplos de los métodos de extensión (Extension Methods) que no es ni más ni menos que una forma de extender el funcionamiento de tipos ya existentes. Como de costumbre, el código de ejemplo estará tanto para Visual Basic .NET como para C#.

    Por ejemplo, que es lo que mostraré en este «post», tenemos las cajas de texto (TextBox) a los que le daremos propiedades para convertir el contenido de la propiedad Text en valores de tipo fecha (Date), hora (TimeSpan), enteros (Integer), decimales (Decimal) o Boolean.

    Para hacer esto solo tenemos que tener una importación al espacio de nombres System.Runtime.CompilerServices y aplicar al método de extensión el atributo Extension y definir el método con lo que queramos que amplíe al tipo en cuestión. Y lo importante de ese método es que: el tipo a ampliar será el primer argumento del método.

    Definir los métodos de extensión

    Lo primero que hay que hacer es definir los métodos de extensión.

    Esa definición la haremos en clases estáticas que en el caso de Visual Basic nos servirán los módulos (Module) mientras que en C# tendrán que ser métodos compartidos (static) definidos en una clase también compartida o estática (static).

    Veamos el código de una clase simple que añadirá el método AsDate y AsInteger a un TextBox. De forma que si quieres convertir el contenido de la propiedad Text de la caja de texto TextBox1 en una fecha solo tengas que hacer algo como esto: fecha = TextBox1.AsDate.

    Ejemplo de métodos de extensión para Visual Basic .NET

    Imports System.Windows.Forms
    Imports System.Runtime.CompilerServices
    
    Module ExtensionTextBox
    
        ''' <summary>
        ''' Devuelve un valor Date de la propiedad Text del TextBox indicado.
        ''' Si la fecha no es válida devuelve el 1 de enero de 1900.
        ''' </summary>
        ''' <param name="txt">El TextBox a extender</param>
        <Extension>
        Public Function AsDate(txt As TextBox) As Date
            Dim f = New Date(1900, 1, 1)
    
            Date.TryParse(txt.Text, f)
    
            Return f
        End Function
    
        ''' <summary>
        ''' Devuelve un valor Integer de la propiedad Text del TextBox indicado.
        ''' </summary>
        ''' <param name="txt">El TextBox a extender</param>
        <Extension>
        Public Function AsInteger(txt As TextBox) As Integer
            Dim i As Integer = 0
    
            Integer.TryParse(txt.Text, i)
    
            Return i
        End Function
    
    End Module
    

    Ejemplo de métodos de extensión para C#

    using System.Runtime.CompilerServices;
    using System.Windows.Forms;
    
    public static class ExtensionTextBox
    {
        /// <summary>
        /// Devuelve un valor Date de la propiedad Text del TextBox indicado.
        /// Si la fecha no es válida devuelve el 1 de enero de 1900.
        /// </summary>
        /// <param name="txt">El TextBox a extender</param>
        public static DateTime AsDate(this TextBox txt)
        {
            var f = new DateTime(1900, 1, 1);
    
            DateTime.TryParse(txt.Text, out f);
    
            return f;
        }
    
        /// <summary>
        /// Devuelve un valor Integer de la propiedad Text del TextBox indicado.
        /// </summary>
        /// <param name="txt">El TextBox a extender</param>
        public static int AsInteger(this TextBox txt)
        {
            int i = 0;
    
            int.TryParse(txt.Text, out i);
    
            return i;
        }
    }
    

    Ejemplo de uso de los métodos de extensión

    En este ejemplo tendremos un formulario con un par de cajas de texto y unas etiquetas, además de un botón que hará ciertos cálculos con los datos de las cajas de textos y mostrará el resultado en las etiquetas.

    En la siguiente captura tienes el aspecto del formulario de ejemplo y a continuación verás el código para usar esos métodos de extensión.

    Figura 1. El formulario en modo diseño
    Figura 1. El formulario en modo diseño

    El código del botón «Convertir» en Visual Basic y C#

    Private Sub btnConvertir_Click(sender As Object,
                                   e As EventArgs) Handles btnConvertir.Click
        Dim fecha = txtFecha.AsDate
        LabelFecha.Text = "La fecha + 1 día = " & fecha.AddDays(1).ToString("dddd, dd.MMM.yyyy")
    
        Dim entero = txtEntero.AsInteger
        LabelEntero.Text = $"{entero} * 2 = " & (entero * 2).ToString
    End Sub
    \f0
    
    
    private void btnConvertir_Click(object sender, EventArgs e)
    {
        var fecha = txtFecha.AsDate();
        LabelFecha.Text = "La fecha + 1 día = " + fecha.AddDays(1).ToString("dddd, dd.MMM.yyyy");
        var entero = txtEntero.AsInteger();
        LabelEntero.Text = $"{entero} * 2 = " + (entero * 2).ToString();
    }
    

    Solo comentar que si los métodos de extensión están en otro espacio de nombres distinto al de la aplicación donde se usan, habrá que hacer una importación de ese espacio de nombres para que esos métodos estén accesibles.
    Pero esto es algo «sabido», ya que aquí es como si usáramos el código de cualquier otra clase «estática/compartida»: si queremos acceder a los miembros que define debemos tener acceso a esa clase.

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

    NOTA:
    Los despistes del Guille… resulta que después de publicar este artículo sobre los métodos de extensión, me olvidé… y hace poco (el 24-ago-2020, estoy escribiendo esto el 29 de agosto de 2020) escribí otro artículo sobre el mismo tema… pero con más ejemplos… Te dejo aquí el enlace por si te sirve para aclarar más aún este tema… en fin… ¡la cabeza del Guille! 😉

    Nos vemos.
    Guillermo

  • Cuidadín con los For Each si se modifica el objeto del bucle

    Pues eso… aunque esto ya es algo viejo, y se supone que sabido, el otro día no lo recordé y revisando el código de un procedimiento que, a pesar de tratar con muchos registros de una base de datos de SQL Server, veía que tardaba demasiado… y mientras estaba trabajando el método me entretuve en ver la ventana esa de diagnóstico en la que te muestra todo lo que iba haciendo el código (ver la figura 1), y me percaté que repetía fechas…

    Ventana de las herramientas de diagnóstico de Visual Studio
    Figura 1. La ventana de las Herramientas de diagnósticos de Visual Studio.

    Al principio no caí en porqué lo hacía, así que… me puse a revisar el código con las llamadas a las actualizaciones a la base de datos… y al cabo de un rato caí en que estaba usando un bucle For Each y que la variable de ese bucle era un objeto de la clase que se encarga de actualizar los datos (e incluso de crearlos si no existen en la base de datos) y… ¡se me encendió la bombillita esa Light bulb de… idea!

    Fue cambiarlo a un bucle normal y tardar muchísimo menos Eye rolling smile, creo que una de las veces me llegó a tardar más de media hora y al hacer el cambio se quedó en 4 minutos o menos.
    Y el cambio que hice fue, por ejemplo (en VB), de este:

    For Each p In Productos

    a este otro:

    For i = 0 To Productos.Count - 1
    Dim p = Productos(i)

    Nota:
    El problema de los bucles for each no es solo de Visual Basic, también lo es de C# aunque se escriba de otra forma.

    Y lo cuento aquí para que cuando busque «problemas» me de la solución.

    Es que, por si no lo sabes, cuando no recuerdo cómo hacer algo en VB o C#, busco en Google, pero le añado al final elguille para que salgan los resultados que tengo publicados y, salvo excepciones, encuentro siempre lo que busco Flirt male, así que… ya sabes… Winking smile

    Nos vemos.
    Guillermo