Etiqueta: truco

  • de los nombres largos y cómo usa Office 2013 las carpetas del sistema

     

    Pues eso… anoche quise dejar más espacio en el disco del sistema (C) y moví algunas carpetas de usuario (Movies, Pictures y Documents) a otra carpeta del disco de datos (E), y sabes… creas una carpeta (si quieres) en el disco de datos (el nuevo destino) y puedes mover las carpetas del usuario a ese nuevo destino y Windows sabrá que esas carpetas (las que decidas mover) las tiene que buscar en la nueva localización cuando quiera hacer uso de ellas.

    Hasta aquí casi todo bien, lo de casi es porque si estás usando algún fichero de algunas de esas carpetas no te dejará moverlas o al menos puede que se queje de que no puede acabar la operación porque hay ficheros que están siendo usados.

     

    Outlook y la ubicación de las carpetas de usuarios

    Hoy cuando he abierto el Outlook (el programa cliente de correo de Office 2013) para acceder a las choricientas cuentas de mail que tengo, va y me dice que nones… que falta el fichero de datos (ver la figura 1), y como resulta que cada cuenta la tengo en varios ficheros de datos, pues… esperaba que me preguntara por todas, pero no, solo preguntó por dos…

    Pero este no es el problema.

    office 2013 y documentos
    Figura 1. Error de Outlook 2013 al no encontrar un fichero de datos

    Si te fijas en el texto de la imagen 1 Outlook 2013 da por hecho de que los datos están en un directorio "fijo", que sí, que está en un directorio fijo, pero en un principio ese directorio era "Documents\Outlook Files" es decir, en el directorio de documentos del usuario creó un directorio para almacenar los ficheros de datos.

    Por tanto, si muevo dicho directorio de usuario a otro disco, Outlook 2013 debería (o tendría que) haberlo buscado en el directorio de datos, no en la ubicación "física" en que estaba en el día en que se guardó.

    Que no es problema esto, ya que después del aviso ese te pregunta dónde localizar el fichero de datos y ya está… lo mismo con el resto de ficheros, que en mi caso al tener tantas cuentas, pues… es un poco rollo tener que decirle dónde están… aparte de que me ha quitado todo lo que tenía en favoritos y la "organización" que en su día le di… pero bueno… aunque es un rollo (por no decir coñazo) no pasa nada… salvo que estas tonterías o cosas mal hechas al final te hacen perder el tiempo… en fin…

    Nota:
    Supongo que el que esos ficheros de datos, a pesar de estar en la carpeta Documentos del usuario que estaba activo, Outlook 2013 los tome como ubicación física es porque al seleccionar dónde guardar y cómo llamar al fichero de datos cuando lo creé, pero… no es excusa, ya que el directorio ese de "Outlook Files" el programa lo crea en la susodicha carpeta de Documentos del usuario.

     

    Los nombres largos en directorios con subdirectorios con nombres largos

    Esa es la otra cosa que te quería comentar, que eso de usar nombres largos está muy bien, que no digo yo que no, pero tampoco hay que abusar…

    Te explico lo que me ha pasado.

    En la carpeta Documentos del usuario tengo guardado ejemplos de Visual Studio para Windows 8. Esos ejemplos, o al menos los que me han dado problemas a la hora de copiar, son páginas web que he descargado y almacenado en una carpeta dentro de Documents, esas páginas tienen títulos largos y, por tanto, al crear la carpeta de ficheros de esa página el nombre de la misma crece un poco más, ya que al final del nombre se le añade "_files" y si a esto le añadimos de que esos ejemplos están en una carpeta llamada "ejemplos async, parallel, serializacion" que a su vez está dentro de otra con este nombre: "_info programación (Win8, Visual Studio)", pues resulta que si en esa carpeta hay un fichero con más de 50 caracteres en el nombre  y la página (y por tanto la carpeta contenedora + _files) tiene el nombre "Async Sample  Accessing the Web Walkthrough (C# and Visual Basic) muestra en C#, VB.NET para Visual Studio 2012" empieza a sumar… y si quieres moverlo de un disco a otro haciendo una copia de la carpeta base completa (que está en C:\Users\<nombre usuario>\Documents), resulta que el sistema operativo se quejará de que no puede leer el fichero de origen o no puede copiarlo en el de destino… así que… he tenido que crear carpetas con un solo carácter a nivel del directorio raíz y aún así… he tenido que comprimir (con WinRar ya que el ZIP del sistema daba error) las carpetas y después extraerlas en el directorio de destino… sí, un rollo… en fin… es lo que tiene usar nombres largos con más nombres largos que a su vez contiene ficheros con nombres largos o muy largos… en fin…

    Aún así, esos ficheros con nombres largos tampoco se podrán editar, ya que el sistema te mostrará un error como el de la figura 2.

    nombres largos
    Figura 2. El nombre del fichero es muy largo

    Y por supuesto si quieres copiarlo en otro sitio, debes buscar una ubicación de destino que tengo un nombre corto, ya que, por ejemplo, al querer copiarlo al escritorio me dio el error que te comentaba de que el nombre es demasiado largo (ver la figura 3).

    source path too long
    Figura 3. El nombre de la ubicación de origen es demasiado larga

     

    Ahí queda eso… para que lo sepas por si te pasa…

     

    Nos vemos.
    Guillermo
    P.S.
    Lee esto también, que seguro que te interesará:
    Si quieres cambiar la carpeta Documets de disco y tienes Office 2013, mejor déjalo cono está…

  • 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

  • Mostrar y cerrar apps en ejecución en Windows Phone 8

     

    Pues eso, que no veía la forma de mostrar las aplicaciones que se están ejecutando en Windows Phone 8 y por tanto tampoco la forma de cerrarlas o cambiar a una recientemente abierta.

    En realidad esto último no es cierto, ya que anteriormente sí que he pasado de la aplicación actual a una abierta con anterioridad, sobre todo para evitar que se "reiniciara" y perdiera lo que ya había hecho. Esto se consigue pulsando la flecha de ir hacia atrás.

    El querer saber cómo cerrar aplicaciones es porque ya me ha pasado dos veces que he querido iniciar la aplicación Nokia Cam Pro o Nokia Pro Cam (que es la misma) porque me he encontrado con un aviso como el de la figura 1.

    wp_ss_20130913_0002_peq
    Figura 1. Nokia Cam Pro necesita más memoria

    Y por tanto necesitaba cerrar alguna de las abiertas para usarla.

    A pesar de no saber cómo hacerlo, el que te indique que cierre alguna aplicación abierta es una "pista" de que se pueden cerrar. Así que… había que averiguar cómo.

    Seguramente el "cómo hacerlo" estará explicado en el manual del Lumina 920, pero… ya sabes lo que suele ocurrir con los manuales y en mi caso, más aún si no están impresos… ¡que (algunos) no los leemos! 🙂

    Así que, busqué cómo hacerlo y me encontré (entre otras cosas) con esta página:

    Cerrar aplicaciones en Windows Phone 7.5 y ahí estaba la respuesta o al menos a mí me ha servido lo que decían.

     

    Para ver las aplicaciones abiertas y cambiar a una de ellas

    Pulsar y mantener pulsada la flecha de ir hacia atrás.

    Esto mostrará las aplicaciones abiertas (ver la figura 2) y podremos cambiar entre ellas.

    wp_ss_20130913_0003
    Figura 2. Lista de aplicaciones abiertas

    Para cambiar a una de ellas, nos desplazamos a la que queremos y pulsamos en ella.

     

    Para cerrar una aplicación abierta

    Simplemente vamos pulsando la flecha de ir hacia atrás hasta que lleguemos a la pantalla que hubiese antes de abrir nuestra aplicación.

    Esto también nos sirve para pasar a las aplicaciones abiertas y que mantengan el estado que tenían la última vez que la abrimos (o al menos abrirla con un estado anteriormente guardado).

     

    Y esto es todo.

    Espero que te sirva.

     

    Nos vemos.
    Guillermo