Tip/Trick: Cómo incluír Geeks.ms como buscador en IE 7

Los que uséis Internet Explorer 7 sabréis que hay un buscador arriba a la derecha, en el cual podemos cambiar el proveedor de búsqueda, páginas como Codeproject ya incluyen su propio buscador para ahí, ¿pero que pasa si no lo tenemos como Geeks.ms? Pues relativamente sencillo. En la lista de proveedores haz click en buscar más proveedores.

A la derecha hay un cuadro que pone «Cree su propio».

En el primer cuadro de texto debemos poner:

http://geeks.ms/search/SearchResults.aspx?q=TEST

Y en el segundo, le damos un nombre:

Geeks.ms, por ejemplo.

Le damos a instalar y ya tenemos a Geeks.ms como proveedor de busquedas [:D].

Tip/Trick: Validar un DNI

Esta es una función bastante útil, sirve para validar la letra de un DNI. Pasandole como parámetro el DNI completo, letra incluída.

        bool validarDNI(string dni)
        {
                if (new Regex("[0-9]{8}[A-Za-z]").Match(dni).Success)
		{
                    return ("TRWAGMYFPDXBNJZSQVHLCKE"[(int)long.Parse(dni.Substring(0, 8)) % 23].ToString() ==
                    dni[8].ToString().ToUpper());
            	}
		else
		{
            	    return false;
		}
        }

Espero que os sea útil [;)]

Tip/Trick: Cómo detectar que archivo se está abriendo con nuestra aplicación

Nos encontraremos alguna vez con que nuestro programa tiene algun archivo asociado o algún archivo se podrá abrir con él. Para ello debemos acceder a los argumentos de la aplicación. Si nosotros abriesemos el programa desde línea de comando sería algo así:

app.exe c:archivo.txt

Eso sería lo mismo a en el archivo.txt darle click derecho, abrir con… y seleccionar nuestro programa (app.exe), o arrastrar archivo.txt sobre app.exe.

Para ello como os decía tenemos que acceder a los argumentos de nuestra aplicación, esto no es solo útil para abrir un archivo con el programa, sino también para abrir programas en modo avanzado (por ejemplo «app.exe advanced»,  desde línea de comando).

Para obtener esos argumentos solo tenemos que acceder a Environment.GetCommandLineArgs() que nos devuelve un array de strings, hay un pequeño problema, el argumento 0, es la ruta del ejecutable así que yo he hecho una función para ello:

string getFilePath()
{
    string file = «»;

    foreach (string arg in Environment.GetCommandLineArgs())
    {
        if (System.IO.File.Exists(arg) && Environment.GetCommandLineArgs()[0] != arg)
        {
            file = arg;
        }
    }

    return file;
}

Yo esto lo uso en el Program.Main(), pero bueno, en el load de un form, por ejemplo, también se podria usar sin problemas.

Espero que os sea útil [:)].

Tip/Trick: Crear automáticamente el scheme de un XML

Siguiendo con esta serie de Tip/Tricks, vamos a ver en este como crear un scheme de un XML automáticamente, esto es realmente muy sencillo teniendo el XML del cual queremos crear el scheme. Para ello partiremos de este XML:

<?xml version="1.0" encoding="utf-8"?>
<Libros>
  <Libro>
    <Title>Manual avanzado de Visual Basic 2005</Title>
    <Autor>Jorge Serrano</Autor>
  </Libro>
  <Libro>
    <Title>Code Complete</Title>
    <Autor>Steve Mcconnell </Autor>
  </Libro>
  <Libro>
    <Title>Manual imprescindible de Visual Basic 2005</Title>
    <Autor>Guillermo Som "el Guille"</Autor>
  </Libro>
</Libros>

Bien… Esto lo abrimos como Visual Studio 2005 y le damos en el menú XML a Create scheme con lo que se nos generará un archivo xsd como el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Libros">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="Libro">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Title" type="xs:string" />
              <xs:element name="Autor" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Con lo que ya tenemos el scheme creado [:)]

Espero que os sea útil.

Tip/Trick: Hacer una aplicación Web multidioma

En el post anterior vimos como hacer una aplicación Windows Forms multidioma, ahora vamos a ver exactamente lo mismo, pero en Web.

Para ello una vez que tengamos hecha la web, hacer doble click en la página que queremos hacer multidioma y en el menú herramientas darle a Generar recurso local se nos generará un archivo de recurso en la carpeta App_LocalResources parecido a Default.aspx.resx, ahora debemos copiar ese archivo, pegarlo y cambiarle el nombre a Default.aspx.es-es.resx, Default.aspx.en-us.resx, etc.

El que generó automáticamente será el predeterminado y a partir de ahí es para cada idioma, solo tenemos que editar el archivo de recursos de cada idioma para ser multidioma.

Al igual que en Windows Forms lo podemos hacer reutilizable.

Espero que os sea útil [:D].

Tip/Trick: Hacer una aplicación multidioma

La verdad este es un tip/trick sencillo ya que hacer una aplicación localizable es algo realmente sencillo, en el Form se selecciona Localizable = True, y una vez que tengamos todos los controles en el formulario seleccionamos en la propiedad Language del Form el idioma que queremos editar.

Esto se guarda en un archivo parecido a Form1.es.resx y dentro tendremos un conjunto de claves/valores con los datos:

button1.Text = Aceptar
button2.Text = Cancelar

Si… algunos valores fuesen siempre los mismos, sería sencilla su traducción, como por ejemplo que el boton de aceptar siempre se llamase okButton y el de cancelar cancelButton, ya que se pueden copiar de un archivo de recursos (resx) a otro, de esta forma las traducciones serían reutilizables entre varias aplicaciones o mismo entre diferentes formularios ya que cada formulario lleva sus propios recursos de idioma.

Espero que os sea útil [:)].

Tip/Trick: Hay veces que no usamos el diseñador de Windows Forms

Bueno… esto más que un Tip/Trick es una curiosidad. Me encanta el uso de System.Reflection, hasta tal punto que en algún caso he llegado a no usar el diseñador de Windows Forms de Visual Studio y he creado formularios a través de System.Reflection, el problema que tenemos es que ese objeto ¿dónde tenemos que instanciarlo para lanzarlo con la aplicación al igual que haríamos con el diseñador? La respuesta es el Program.cs, por defecto Visual Studio nos crea el siguiente código:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace CopyDirectory
{
    static class Program
    {
        /// <summary>
        /// Punto de entrada principal para la aplicación.
        /// </summary>

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

La verdad a mi me deja muchas puertas abiertas esto [:D]. Pero lo que queremos ahora nosotros es substituir la linea Applicacion.Run(new Form1()); por un formulario que hayamos creado nosotros y un ejemplo de ello es el siguiente, copio solo el Main():

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Form form = new Form();
    Button button = new Button();
    button.Text = «Aceptar»;

    form.Controls.Add(button);

    Application.Run(form);
}

Esto me deja la puerta abierta no solo a formulario que no fueron creados con Visual Studio (de hecho el uso que yo le he dado a esto es con un formulario creado por Reflection con el metodo AppDomain.CurrentDomain.CreateInstanceAndUnwrap();). Pero por ejemplo… alguna vez podemos querer crear aplicaciones sin interfaz de usuario (sin ser nisiquiera Console, ni Service).

Así como el Tip/Trick de ayer era más útil, este ya se que lo es menos, pero bueno yo lo he tenido que usar [:)] así que alguna utilidad tiene.

Espero que le encontréis como le he encontrado yo utilidad.

Tip/Trick: Cómo copiar una carpeta

Esta mañana necesitaba copiar un directorio en otro, pero me encontré con un «pequeño problema» (estamos mal acostumbrados con el framework). El caso es que System.IO.FileInfo tiene un método CopyTo() para copiar en otro directorio, por lo que nosotros podríamos pensar que System.IO.DirectoryInfo tendría el equivalente para directorio pero no, así que tenemos que crear nosotros el nuestro y esto fue lo que hice:

public void CopyDirectory(string From, string To)
{
    //Creamos el directorio de la aplicacion
    DirectoryInfo dir = new DirectoryInfo(From);

    //Creamos la ruta del directorio donde vamos a copiar
    string _directory = to + «\» + dir.Name;

    //Creamos el directorio
    Directory.CreateDirectory(_directory);

    //Recorremos todos los archivos
    foreach (FileInfo _file in dir.GetFiles())
    {
        //Copiamos el archivo en el directorio
        _file.CopyTo(_directory);
    }

    //Recorremos todos sus directorios
    foreach (DirectoryInfo _dir in dir.GetDirectories())
    {
        //Repetimos lo mismo para el siguiente subdirectorio
        CopyDirectory(_dir.FullName, _directory);
    }
}

Espero que os sea útil.

Un saludo

October .NET Conference

Los próximos 15 y 16 de Octubre se celebrará la primera conferencia multi-idioma de Málaga para desarrolladores de .NET.


La conferencia va a cubrir un amplio rango de temas, y las ponencias estarán disponibles tanto en español como en inglés. Expertos de todo el mundo van a participar durante los dos días que durará el evento. Será tu oportunidad para interactuar con tus compañeros de profesión y charlar con los ponentes durante este evento relajado.


Entre ellos tendremos a expertos nacionales como pueden ser Guillermo Som («el Guille»), Jose Manuel Alarcón, Unai Zorilla, Octavio Hernandez, Hadi Hariri y otros internacionales como el mismisimo Dino Esposito.


Todos ellos con una gran carrera detrás y muy apreciados en la comunidad [:)]



Lo mejor de todo, el registro es completamente gratuito (Aforo limitado)


Os podéis registrar en:


http://www.octoberconference.net/Registration.ES.aspx


Yo no creo que pueda ir, pero bueno… os invito a todos a ir para contarmelo, esto promete mucho [:D].

Aniversario del blog… se me habia pasado :(

Hace unos días (el 26 de julio) fue el aniversario de mi blog, un año ya en geeks.ms [:)] Después de todos los que he probado me quedo donde estoy, aquí en geeks.ms con todos vosotros (los que me leeis, los que se pasan de vez en cuando, los compañeros bloggers, etc. etc. etc.). Es el mejor sitio de blogs que he encontrado después de las pruebas por theSpoke.net, blogger, etc. 

¡Y ya es un año!

Espero poder seguir cumpliendo más con vosotros.

¡Seguid así!

Un saludo a todos!!!