Categoría: cosas técnicas

Posts relacionados con la programación o manejo o configuración de los oredenadores (computadores)

  • En breve cerraré los foros del Guille

    Pues eso.,.. me refiero a la página: http://foros.elguille.info/ no al blog, ni al sitio ni la página de Facebook Winking smile

    Ya han pasado unos 15 años desde que los puse en marcha (hubo antes otras versiones de los foros, pero me refiero al que está actualmente ¿activo?) y no hay prácticamente movimiento, ni por mi parte… así que… si no cambio de opinión… el 31 de enero de este año 2019 será el último día que se podrá postear en los foros de elGuille.info… y a partir del 1 de febrero de 2019 serán de solo lectura (o solo para consultar y ver los hilos), porque quitarlo no lo voy a quitar, ya que sé que hay respuestas válidas, y muchas… Si acaso quitaré visibilidad a los hilos que no han obtenido respuesta, más que nada para que no aparezcan en los buscadores, que no es plan que alguien busque algo y le aparezca solo la pregunta sin respuesta (que suele ocurrir en muchos foros, jeje).

    Los foros de elGuille.info pasarán a solo lectura el 1 de febrero de 2019
    Los foros de elGuille.info pasarán a solo lectura el 1 de febrero de 2019

    Pues eso… si quieres dar tu opinión, puedes darla en este hilo.

    Gracias.

    Nos vemos.
    Guillermo

  • DoEvents para aplicaciones WPF

    Pues eso… que en las aplicaciones de Windows Presentation Foundation (WPF) no podemos usar el equivalente a DoEvents de Windows Forms, simplemente porque no existe esa funcionalidad para WPF, pero no te preocupes porque aquí te explico cómo crear un método DoEvents listo para usar en las aplicaciones de WPF, por supuesto con el código del VB y C#.

    Yo utilizo DoEvents en las ocasiones que quiero refrescar la pantalla (formulario o ventana) de la aplicación, por ejemplo cuando se está haciendo un proceso largo para que no se quede congelada la aplicación.

    Y anoche me ocurrió eso mientras ejecutaba una aplicación (de WPF) que me fabriqué para copiar el contenido de una lista de canciones (PlayList tipo m3u) en una carpeta. Y como el disco usado para guardar los MP3 era un disco externo, pues… aparte de que eran muchas canciones (354), pues… parecía que la aplicación fallaba, ya que no mostraba la canción que estaba copiando y… pues eso… que hasta yo pensé que me había equivocado escribiendo el código… Angel

    Así que… sabiendo que DoEvents no está definido en WPF y después de probar con que tampoco hay Refresh en los controles de WPF, probé con Thread.Sleep que no solucionó el problema (y no era plan de crear un temporizador), así que… ¡a buscar en Internet!

    Y dio resultado la búsqueda, concretamente en esta página:
    Implement Application.DoEvents in WPF, ¿el problema? ninguno, salvo que, como suele ocurrir por los interneses, todo está con ejemplos para C#, así que… a convertir el código encontrado.

    Este es el código de esa página para simular el DoEvents (en C#):

    public static void DoEvents()
        {
            Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background,
                    new EmptyDelegate(delegate{}));
        }
    
    

    En otra parte del código debes tener la definición de EmptyDelegate:

    private delegate void EmptyDelegate();
    

    No me sonó demasiado a chino mandarín ya que algo parecido usé hace muuuuuuchos años para llamar a otro control desde el método de evento de un temporizador:
    24- Acceder a un control desde un evento de un timer, pero ya ni me acordaba Eye rolling smile

    Y esta es la versión para Visual Basic .NET:

    ' Adaptado de:
    ' http://www.java2s.com/Tutorial/CSharp/0470__Windows-Presentation-Foundation/
    '   ImplementApplicationDoEventsinWPF.htm
    
    Private Delegate Sub EmptyDelegate()
    
    Private Sub DoEvents()
        Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background,
                                            New EmptyDelegate(Sub()
                                                              End Sub))
    End Sub
    

    Te tienes que fiar de mi palabra, pero sin el DoEvents, al pulsar en el botón Copiar la aplicación parece como si se hubiese colgado… hasta pasado un buen rato no termina… (Figura 1)

    Figura 1. Sin el DoEvents, después de pulsar en Copiar la aplicación se queda congelada
    Figura 1. Sin el DoEvents, después de pulsar en Copiar la aplicación se queda congelada

    Sin embargo, poniendo el DoEvents, se va mostrando el progreso de copia. Y de eso se trata… que se vea lo que está haciendo Winking smile

    Pues… ¡ya está! esto es todo…

    Nos vemos.
    Guillermo

  • Si quieres que tu aplicación se muestre en el monitor externo dile que se centre en la pantalla (CenterScreen)

    Pues eso… que estuve un tiempo buscando soluciones para que se mostrasen mis aplicaciones en el monitor secundario (que es el que uso como principal) y resulta que la solución es más simple que todo eso… sí, solo con indicarle que se centre en la pantalla (CenterScreen) es suficiente Winking smile

    Y esto vale tanto para aplicaciones de Windows Forms como para las de WPF (Windows Presentation Foundation).

    En WPF lo haces con este código en el diseñador de la ventana (Window):

    WindowStartupLocation = "CenterScreen"

    En WinForms asigna a la propiedad StartPosition del formulario de inicio el valor CenterScreen.

    Y ya está… ya no tengo más que contarte Winking smile

    Nos vemos.
    Guillermo