<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Blog alskare</title>
	<atom:link href="http://alskare.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://alskare.wordpress.com</link>
	<description>.Net y lo que surja</description>
	<lastBuildDate>Sun, 06 Feb 2011 16:00:13 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='alskare.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Blog alskare</title>
		<link>http://alskare.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://alskare.wordpress.com/osd.xml" title="Blog alskare" />
	<atom:link rel='hub' href='http://alskare.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Traslado del blog</title>
		<link>http://alskare.wordpress.com/2010/11/02/traslado-del-blog/</link>
		<comments>http://alskare.wordpress.com/2010/11/02/traslado-del-blog/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 13:26:47 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[Personales]]></category>

		<guid isPermaLink="false">https://alskare.wordpress.com/2010/11/02/traslado-del-blog/</guid>
		<description><![CDATA[Bueno, pues como que no hay bien ni mal que cien años dure, ha llegado la hora de probar nuevos vientos. ¡Cómo me complico la existencia para comentar que, sencillamente, traslado el blog a una nueva ubicación: http://geeks.ms/blogs/jvelasco/ Confío que desde allí pueda seguir disfrutando tanto como lo he hecho aquí y que, entre otras [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=169&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Bueno, pues como que no hay bien ni mal que cien años dure, ha llegado la hora de probar nuevos vientos. ¡Cómo me complico la existencia para comentar que, sencillamente, traslado el blog a una nueva ubicación: <a title="http://geeks.ms/blogs/jvelasco/" href="http://geeks.ms/blogs/jvelasco/">http://geeks.ms/blogs/jvelasco/</a></p>
<p>Confío que desde allí pueda seguir disfrutando tanto como lo he hecho aquí y que, entre otras cosas, pueda mantener una periodicidad de publicación superior a la que he tenido aquí. </p>
<p>Gracias a todos los que habéis ido siguiendo el blog y, por supuesto, gracias a todos por vuestros comentarios que han ido ayudando con ideas y en la depuración del código.</p>
<br />Filed under: <a href='http://alskare.wordpress.com/category/personales/'>Personales</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/169/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/169/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/169/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=169&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2010/11/02/traslado-del-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>
	</item>
		<item>
		<title>Calculo de Semana Santa con C#</title>
		<link>http://alskare.wordpress.com/2010/04/05/calculo-de-semana-santa-con-c/</link>
		<comments>http://alskare.wordpress.com/2010/04/05/calculo-de-semana-santa-con-c/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 17:19:53 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://alskare.wordpress.com/2010/04/05/calculo-de-semana-santa-con-c/</guid>
		<description><![CDATA[Hacía ya bastante tiempo que no tocaba el blog, así que ya va siendo hora de añadir algún que otro post. A ver si tengo tiempo estos días para poder hacer un par de entradas que tengo en mente, aunque el quehacer diario nos impide dedicarnos todo lo que queremos. En esta ocasión le toca [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=163&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hacía ya bastante tiempo que no tocaba el blog, así que ya va siendo hora de añadir algún que otro post. A ver si tengo tiempo estos días para poder hacer un par de entradas que tengo en mente, aunque el quehacer diario nos impide dedicarnos todo lo que queremos.</p>
<p>En esta ocasión le toca el turno a unos cálculos que he tenido que realizar para poder calcular ciertos días de la Semana Santa. Para documentarme, debo reconocer que tan sólo he echado mano de nuestra querida wikipedia (<a title="http://es.wikipedia.org/wiki/C%C3%A1lculo_de_la_fecha_de_Pascua#C.C3.A1lculo" href="http://es.wikipedia.org/wiki/C%C3%A1lculo_de_la_fecha_de_Pascua#C.C3.A1lculo" target="_blank">http://es.wikipedia.org/wiki/C%C3%A1lculo_de_la_fecha_de_Pascua#C.C3.A1lculo</a>), así que ha sido bastante sencillo dicho cálculo. Como siempre, intento explicar un poco los pasos seguidos para lograr el fin.</p>
<p>A primera vista, los cálculos se ven sencillos, puesto que se trata de conseguir los residuos de una serie de divisiones. Quizás el único hándicap puede venir representado por la tabla de constantes que se muestra en la página de la Wikipedia. ¿Cómo lo solvento?. Pues, como siempre intento hacer, sin complicarme la vida, es decir, una estructura dentro de la clase que me permita almacenar los valores y un método que los cargue:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#cc6633;">#region</span> Constantes cálculo
<span style="color:#0000ff;">private</span> <span style="color:#0000ff;">struct</span> ParConstantes
{
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> M { get; set; }
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> N { get; set; }
}

<span style="color:#0000ff;">private</span> ParConstantes getPar(<span style="color:#0000ff;">int</span> anio)
{
    ParConstantes p = <span style="color:#0000ff;">new</span> ParConstantes();
    <span style="color:#0000ff;">if</span> (anio &lt; 1583) { <span style="color:#0000ff;">throw</span>
            <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(<span style="color:#006080;">&quot;El año deberá ser superior a 1583&quot;</span>); }
    <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 1700) { p.M = 22; p.N = 2; }
    <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 1800) { p.M = 23; p.N = 3; }
    <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 1900) { p.M = 23; p.N = 4; }
    <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 2100) { p.M = 24; p.N = 5; }
    <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 2200) { p.M = 24; p.N = 6; }
    <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 2299) { p.M = 25; p.N = 0; }
    <span style="color:#0000ff;">else</span> { <span style="color:#0000ff;">throw</span>
        <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(<span style="color:#006080;">&quot;El año deberá ser inferior a 2299&quot;</span>); }
    <span style="color:#0000ff;">return</span> p;
}
<span style="color:#cc6633;">#endregion</span></pre>
</div>
<p>&#160;</p>
<p>Así, una vez está solventado el problema de la tabla de las constantes, lo único que queda es el tema de los cálculos. En esta ocasión, dejo la clase completa, puesto que no tiene mayor complicación.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> System;

<span style="color:#0000ff;">namespace</span> jnSoftware.Calculos
{

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Cálculo de Semana Santa</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#0000ff;">class</span> SemanaSanta
    {
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span> a;
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span> b;
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span> c;
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span> d;
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span> e;
        <span style="color:#0000ff;">private</span> DateTime pascuaResurreccion;

        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span> anio;

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Constructor de la clase</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;anio&quot;&gt;Entero que representa el año del que se quiere calcular la </span>
        <span style="color:#008000;">/// semana santa.&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;exception cref=&quot;ArgumentOutOfRangeException&quot;&gt;Se produce cuando se intenta calcular</span>
        <span style="color:#008000;">/// la semana santa de un año no contemplado.&lt;/exception&gt;</span>
        <span style="color:#0000ff;">public</span> SemanaSanta(<span style="color:#0000ff;">int</span> anio)
        {
            <span style="color:#0000ff;">try</span>
            {
                <span style="color:#0000ff;">this</span>.anio = anio;
                calculaDomingoPascua();
            }
            <span style="color:#0000ff;">catch</span> { <span style="color:#0000ff;">throw</span>; }
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Cálculo del domingo de Pascua o domingo de Resurrección.</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">void</span> calculaDomingoPascua()
        {
            ParConstantes p = getPar(anio);
            a = anio % 19;
            b = anio % 4;
            c = anio % 7;
            d = (19 * a + p.M) % 30;
            e = (2 * b + 4 * c + 6 * d + p.N) % 7;

            <span style="color:#0000ff;">if</span> (d + e &lt; 10)
            {
                pascuaResurreccion = <span style="color:#0000ff;">new</span> DateTime(anio, 3, d + e + 22);
            }
            <span style="color:#0000ff;">else</span>
            {
                pascuaResurreccion = <span style="color:#0000ff;">new</span> DateTime(anio, 4, d + e - 9);
            }

            <span style="color:#008000;">// Excepciones</span>
            <span style="color:#0000ff;">if</span> (pascuaResurreccion == <span style="color:#0000ff;">new</span> DateTime(anio, 4, 26))
                pascuaResurreccion = <span style="color:#0000ff;">new</span> DateTime(anio, 4, 19);

            <span style="color:#0000ff;">if</span> (pascuaResurreccion == <span style="color:#0000ff;">new</span> DateTime(anio, 4, 25) &amp;&amp; d == 28 &amp;&amp; e == 6 &amp;&amp; a &gt; 10)
                pascuaResurreccion = <span style="color:#0000ff;">new</span> DateTime(anio, 4, 18);
        }

        <span style="color:#cc6633;">#region</span> Constantes cálculo
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">struct</span> ParConstantes
        {
            <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> M { get; set; }
            <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> N { get; set; }
        }

        <span style="color:#0000ff;">private</span> ParConstantes getPar(<span style="color:#0000ff;">int</span> anio)
        {
            ParConstantes p = <span style="color:#0000ff;">new</span> ParConstantes();
            <span style="color:#0000ff;">if</span> (anio &lt; 1583) { <span style="color:#0000ff;">throw</span>
                    <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(<span style="color:#006080;">&quot;El año deberá ser superior a 1583&quot;</span>); }
            <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 1700) { p.M = 22; p.N = 2; }
            <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 1800) { p.M = 23; p.N = 3; }
            <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 1900) { p.M = 23; p.N = 4; }
            <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 2100) { p.M = 24; p.N = 5; }
            <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 2200) { p.M = 24; p.N = 6; }
            <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (anio &lt; 2299) { p.M = 25; p.N = 0; }
            <span style="color:#0000ff;">else</span> { <span style="color:#0000ff;">throw</span>
                <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(<span style="color:#006080;">&quot;El año deberá ser inferior a 2299&quot;</span>); }
            <span style="color:#0000ff;">return</span> p;
        }
        <span style="color:#cc6633;">#endregion</span>

        <span style="color:#cc6633;">#region</span> Propiedades públicas

        <span style="color:#0000ff;">public</span> DateTime MiercolesCeniza
        {
            get { <span style="color:#0000ff;">return</span> SabadoSanto.AddDays(7 * -6 - 3 ); }
        }

        <span style="color:#0000ff;">public</span> DateTime ViernesDolores
        {
            get { <span style="color:#0000ff;">return</span> pascuaResurreccion.AddDays(-9); }
        }

        <span style="color:#0000ff;">public</span> DateTime DomingoRamos
        {
            get { <span style="color:#0000ff;">return</span> pascuaResurreccion.AddDays(-7); }
        }

        <span style="color:#0000ff;">public</span> DateTime JuevesSanto
        {
            get { <span style="color:#0000ff;">return</span> pascuaResurreccion.AddDays(-3); }
        }

        <span style="color:#0000ff;">public</span> DateTime ViernesSanto
        {
            get { <span style="color:#0000ff;">return</span> pascuaResurreccion.AddDays(-2); }
        }

        <span style="color:#0000ff;">public</span> DateTime SabadoSanto
        {
            get { <span style="color:#0000ff;">return</span> pascuaResurreccion.AddDays(-1); }
        }

        <span style="color:#0000ff;">public</span> DateTime DomingoResurreccion
        {
            get { <span style="color:#0000ff;">return</span> pascuaResurreccion; }
        }

        <span style="color:#cc6633;">#endregion</span>

    }

}</pre>
</div>
<p>Tal como puede apreciarse, tan sólo se trata de calcular el Domingo de Resurrección ( o Domingo de Pascua) y, a partir de ahí, realizar la diferencia en días para obtener el resto.</p>
<p>No sé si me he dejado alguna otra fecha así que animo, como siempre ha hecho el lector de este blog, a completar, entre todos, las posibles fechas que puedan ser calculadas a partir de las fechas aquí calculadas.</p>
<br />Filed under: <a href='http://alskare.wordpress.com/category/c/'>C#</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/163/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=163&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2010/04/05/calculo-de-semana-santa-con-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>
	</item>
		<item>
		<title>Enviar correo electr&#243;nico desde ASP.NET (II) &#8211; Configurando el Web.Config</title>
		<link>http://alskare.wordpress.com/2010/01/03/enviar-correo-electrnico-desde-asp-net-ii-configurando-el-web-config/</link>
		<comments>http://alskare.wordpress.com/2010/01/03/enviar-correo-electrnico-desde-asp-net-ii-configurando-el-web-config/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 19:19:21 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[ASP.Net]]></category>

		<guid isPermaLink="false">http://alskare.wordpress.com/2010/01/03/enviar-correo-electrnico-desde-asp-net-ii-configurando-el-web-config/</guid>
		<description><![CDATA[¡Hay que ver lo que tiene esto de dedicarse al mundillo de la programación!, que a veces te cansas de hacer un copiar y pegar de cosas que tienes por ahí perdidas y ni te preocupas de mirar cómo solventarlo de otra manera. Me llegó la hora de entonar el mea culpa por no haber [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=162&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>¡Hay que ver lo que tiene esto de dedicarse al mundillo de la programación!, que a veces te cansas de hacer un copiar y pegar de cosas que tienes por ahí perdidas y ni te preocupas de mirar cómo solventarlo de otra manera. Me llegó la hora de entonar el <em>mea culpa</em> por no haber visto antes un punto tan sencillo.</p>
<p>En una de las empresas en las que trabajo tienen un server dedicado en 1and1 y la verdad es que es todo un lujazo programar en un sitio en el que no tienes que preocuparte de si el ISP te deja añadir un componente u otro. La verdad es que ya nos ha tocado sufrir lo suyo en este sentido.</p>
<p>Hace ya algún tiempo escribí un artículo &#8211; <a href="http://alskare.wordpress.com/2009/08/19/enviar-correo-electrnico-desde-asp-net/" target="_blank">Enviar correo electrónico desde ASP.NET</a> &#8211; en el que dejaba una clase que servía para enviar correos electrónicos desde ASP (bueno, la verdad es que la misma clase tiene utilidad si quieres usarla en una aplicación de escritorio). No obstante, enviar un correo electrónico desde ASP es una tarea mucho más fácil si almacenas la configuración del servidor SMTP en el Web.Config del modo siguiente:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">system.net</span><span style="color:#0000ff;">&gt;</span>
  <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">mailSettings</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">smtp</span> <span style="color:#ff0000;">from</span><span style="color:#0000ff;">=&quot;usuario@dominio.com&quot;</span><span style="color:#0000ff;">&gt;</span> <span style="color:#008000;">&lt;!--Cuenta válida en el servidor de correo SMTP--&gt;</span>
      <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">network</span> <span style="color:#ff0000;">host</span><span style="color:#0000ff;">=&quot;servidorSMTP&quot;</span> <span style="color:#ff0000;">password</span><span style="color:#0000ff;">=&quot;contraseña&quot;</span> <span style="color:#ff0000;">userName</span><span style="color:#0000ff;">=&quot;userSMTP&quot;</span> <span style="color:#0000ff;">/&gt;</span>
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">smtp</span><span style="color:#0000ff;">&gt;</span>
  <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">mailSettings</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">system.net</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
<p>De esta manera, cada vez que queramos crear un nuevo mensaje de correo electrónico, bastará con introducir unas pocas sentencias de código que, lógicamente, pueden complicarse dependiendo de la necesidad:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#008000;">/// &lt;summary&gt;</span>
 <span style="color:#008000;">/// Envío de un mensaje de correo electrónico</span>
 <span style="color:#008000;">/// &lt;/summary&gt;</span>
 <span style="color:#008000;">/// &lt;param name=&quot;address&quot;&gt;Dirección de destino&lt;/param&gt;</span>
 <span style="color:#008000;">/// &lt;param name=&quot;subject&quot;&gt;Asunto del mensaje&lt;/param&gt;</span>
 <span style="color:#008000;">/// &lt;param name=&quot;body&quot;&gt;Mensaje&lt;/param&gt;</span>
 <span style="color:#008000;">/// &lt;remarks&gt;</span>
 <span style="color:#008000;">/// En caso de cambio de la configuración de la cuenta del remitente, </span>
 <span style="color:#008000;">/// deberá realizarse en el fichero Web.config</span>
 <span style="color:#008000;">/// &lt;/remarks&gt;</span>
 <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span> SendMessage(<span style="color:#0000ff;">string</span> address, <span style="color:#0000ff;">string</span> subject, <span style="color:#0000ff;">string</span> body)
 {
     System.Net.Mail.MailMessage message = <span style="color:#0000ff;">new</span> System.Net.Mail.MailMessage();
     <span style="color:#008000;">// Dirección de destino</span>
     message.To.Add(address);
     <span style="color:#008000;">// Asunto </span>
     message.Subject = subject;
     <span style="color:#008000;">// Mensaje </span>
     message.Body = body;

     System.Net.Mail.SmtpClient smpt = <span style="color:#0000ff;">new</span> System.Net.Mail.SmtpClient();
     smpt.Send(message);
 }</pre>
</div>
<br />Posted in ASP.Net  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/162/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/162/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/162/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=162&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2010/01/03/enviar-correo-electrnico-desde-asp-net-ii-configurando-el-web-config/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>
	</item>
		<item>
		<title>Gestionar cuentas de Outlook desde C#</title>
		<link>http://alskare.wordpress.com/2009/12/06/gestionar-cuentas-de-outlook-desde-c/</link>
		<comments>http://alskare.wordpress.com/2009/12/06/gestionar-cuentas-de-outlook-desde-c/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 17:45:50 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Outlook]]></category>

		<guid isPermaLink="false">http://alskare.wordpress.com/2009/12/06/gestionar-cuentas-de-outlook-desde-c/</guid>
		<description><![CDATA[Tras haberme peleado un tiempo con el tema de poder configurar la firma de Outlook desde una aplicación propia, tema que puede encontrarse en el post http://alskare.wordpress.com/2009/11/09/aadir-firma-en-outlook/, me quedé con las ganas de poder profundizar un poco más en el tema de cómo se gestiona el tema de las cuentas de correo en el registro [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=161&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Tras haberme peleado un tiempo con el tema de poder configurar la firma de Outlook desde una aplicación propia, tema que puede encontrarse en el post <a href="http://alskare.wordpress.com/2009/11/09/aadir-firma-en-outlook/" target="_blank">http://alskare.wordpress.com/2009/11/09/aadir-firma-en-outlook/</a>, me quedé con las ganas de poder profundizar un poco más en el tema de cómo se gestiona el tema de las cuentas de correo en el registro del sistema, más que nada, porque estoy más que seguro que en breve necesitaré modificar no sólo la firma en la cuenta predeterminada.</p>
<p>Aunque la idea inicial es la de partir del artículo anterior, rápidamente me doy cuenta de alguna imprecisión cometida por mi parte. Imagino que las prisas y las ganas de acabar rápido logran que, en un primer intento, te dejes algún cabo suelto. En este caso, opto por dejar el artículo anterior tal cuál está y así me permitiré, desde aquí, realizar todas las correcciones o anotaciones que considere necesarias.</p>
<h2>Una clave del registro controla las cuentas</h2>
<p>La principal imprecisión a la que me refería es cuando indicaba que el primer byte de una determinada clave del registro “apuntaba” a la dirección de la cuenta por defecto. Después de haber intentado algún cambio en mi propio ordenador, casi me quedo sin poder entrar en Outlook al producir un error nada más entrar. </p>
<p>- ¿Qué has hecho para poder provocar este error?.    <br />- Casi nada, tan sólo cambiar directamente, desde el registro, el primer byte que se muestra (el de la cuenta predeterminada) por el de otra cuenta válida     <br />- Así, ¿sin más?. ¿Qué ha ocurrido?     <br />- Poca cosa. No me di cuenta que el valor de dicha entrada no es un byte, <strong>son 4 bytes en formato Little Endian</strong>. Y además, esta misma clave contiene el orden en el que se encuentran las cuentas de correo. Fíjate en el ejemplo siguiente, mi cuenta por defecto es la que está en la clave 0000000b, la siguiente cuenta en la lista de Outlook es la 00000005 y así sucesivamente.</p>
<p>&#160;<img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="registro" border="0" alt="registro" src="http://alskare.files.wordpress.com/2009/12/registro.jpg?w=644&#038;h=120" width="644" height="120" /> </p>
<p>- ¿has conseguido arreglarlo?.    <br />- Siempre que toco el registro, hago antes una copia de la rama (menos mal que no le digo que he tenido que descubrir lo del Litte Endian porque no conseguía entrar en Outlook)</p>
<h2>Lectura de las cuentas configuradas</h2>
<p>Una vez que conocemos tanto la cuenta predeterminada como el resto de cuentas de Outlook, tan sólo nos hace falta hacer una lectura de las mismas, así que empezamos creando una lectura, precisamente de los nombres de las cuentas.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#008000;">/// &lt;summary&gt;</span>
<span style="color:#008000;">/// Obtiene una lista con las claves de las cuentas de Outlook</span>
<span style="color:#008000;">/// &lt;/summary&gt;</span>
<span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span>[] getOutlookAccounts()
{
    RegistryKey rkRaiz = Registry.CurrentUser;

    <span style="color:#0000ff;">string</span> ramaCuentas =
          <span style="color:#006080;">&quot;Software\\Microsoft\\Windows NT&quot;</span>
           + <span style="color:#006080;">&quot;\\CurrentVersion\\Windows Messaging Subsystem&quot;</span>
           + <span style="color:#006080;">&quot;\\Profiles\\Outlook\\9375CFF0413111d3B88A00104B2A6676&quot;</span>;

    List&lt;<span style="color:#0000ff;">string</span>&gt; listaCuentas = <span style="color:#0000ff;">new</span> List&lt;<span style="color:#0000ff;">string</span>&gt;();
    RegistryKey rkCuentas = rkRaiz.OpenSubKey(ramaCuentas);

    <span style="color:#008000;">// Lectura del valor que contiene las cuentas de Outlook</span>
    <span style="color:#0000ff;">object</span> oCuentas = rkCuentas.GetValue(<span style="color:#006080;">&quot;{ED475418-B0D6-11D2-8C3B-00104B2A6676}&quot;</span>);
    <span style="color:#0000ff;">if</span> (oCuentas != <span style="color:#0000ff;">null</span> &amp;&amp; oCuentas.GetType().Equals(<span style="color:#0000ff;">typeof</span>(<span style="color:#0000ff;">byte</span>[])))
    {
        <span style="color:#0000ff;">byte</span>[] cuentas = (<span style="color:#0000ff;">byte</span>[])oCuentas;
        <span style="color:#0000ff;">for</span> (<span style="color:#0000ff;">int</span> i = 0; i &lt; cuentas.Length; i += 4)
        {
            <span style="color:#008000;">// Traspaso de Little Endian a Big Endian</span>
            StringBuilder sb = <span style="color:#0000ff;">new</span> StringBuilder();
            sb.Append(((<span style="color:#0000ff;">byte</span>)(cuentas.GetValue(i + 3))).ToString(<span style="color:#006080;">&quot;X2&quot;</span>).ToLower());
            sb.Append(((<span style="color:#0000ff;">byte</span>)(cuentas.GetValue(i + 2))).ToString(<span style="color:#006080;">&quot;X2&quot;</span>).ToLower());
            sb.Append(((<span style="color:#0000ff;">byte</span>)(cuentas.GetValue(i + 1))).ToString(<span style="color:#006080;">&quot;X2&quot;</span>).ToLower());
            sb.Append(((<span style="color:#0000ff;">byte</span>)(cuentas.GetValue(i))).ToString(<span style="color:#006080;">&quot;X2&quot;</span>).ToLower());

            listaCuentas.Add(sb.ToString());
        }
    }
    <span style="color:#0000ff;">return</span> listaCuentas.ToArray();
}</pre>
</div>
<h2>Leer información de una cuenta </h2>
<p>Una vez tenemos una lista con las cuentas de correo existentes, podemos empezar a pensar en cómo extraer la información de cada una de las cuentas. Para ello, nos creamos una clase auxiliar para poder almacenar la información.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">namespace</span> jnSoftware.Outlook.Accounts
{

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Clase que representa una cuenta de correo de Outlook en el registro</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> MailAccount
    {

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene el orden en el que se encuentra la cuenta de correo en la lista de</span>
        <span style="color:#008000;">/// Outlook</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> OrderList { get; <span style="color:#0000ff;">internal</span> set; }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene el nombre de la clave que contiene la información de la cuenta en </span>
        <span style="color:#008000;">/// el registro</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> AccountID { get; <span style="color:#0000ff;">internal</span> set; }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene un valor que indica si la cuenta es la predeterminada</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">bool</span> IsDefaultAccount
        { get { <span style="color:#0000ff;">return</span> OrderList == 0; } }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene la cuenta de correo asociada a la cuenta</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Email { get; <span style="color:#0000ff;">internal</span> set; }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene el nombre de la cuenta de correo.</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> AccountName { get; <span style="color:#0000ff;">internal</span> set; }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene el valor establecido como firma para nuevos mensajes</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> NewSignature { get; <span style="color:#0000ff;">internal</span> set; }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene el valor establecido como firma para los mensajes que </span>
        <span style="color:#008000;">/// se responden</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> ReplySignature { get; <span style="color:#0000ff;">internal</span> set; }

    }
}</pre>
</div>
<p>A partir de ahora, <em>la imaginación al poder</em>. Además de los métodos que se nos pueden ocurrir en un primer momento, la verdad es que, pensando un poco en detalle, las posibilidades son amplias. Incluyamos algún ejemplo:</p>
<ul>
<li>Obtener una lista con la información de todas las cuentas </li>
<li>Obtener información de una cuenta concreta (por Id o por cuenta de correo) </li>
<li>Obtener información de la cuenta de correo predeterminada </li>
<li>Cambiar la firma de una cuenta concreta (no sólo la cuenta predeterminada) </li>
</ul>
<p>Partiendo de los puntos anteriores desarrollo una clase que permita realizar los trabajos mencionados, aunque me imagino que, en el momento que tenga un poco de tiempo acabaré creando alguna aplicación en WinForms que permita realizar estos cambios de un modo más amigable. De momento, con la librería actual se pueden realizar muchos cambios desde, por ejemplo, un inicio de sesión en una red.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> System;
<span style="color:#0000ff;">using</span> System.Collections.Generic;
<span style="color:#0000ff;">using</span> System.Text;
<span style="color:#0000ff;">using</span> Microsoft.Win32;

<span style="color:#0000ff;">namespace</span> jnSoftware.Outlook.Accounts
{

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Gestión de cuentas de correo de Outlook</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> MailAccounts
    {

        <span style="color:#0000ff;">private</span> Dictionary&lt;<span style="color:#0000ff;">string</span>, MailAccount&gt; cuentasOutlook;

        <span style="color:#008000;">// Las cuentas de correo dependen directamente de HKCU</span>
        <span style="color:#0000ff;">private</span> RegistryKey rkRaiz
        { get { <span style="color:#0000ff;">return</span> Registry.CurrentUser; } }

        <span style="color:#008000;">// De la rama siguiente dependen todas las cuentas de correo definidas</span>
        <span style="color:#008000;">// en Outlook</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> ramaCuentas =
               <span style="color:#006080;">&quot;Software\\Microsoft\\Windows NT&quot;</span>
                + <span style="color:#006080;">&quot;\\CurrentVersion\\Windows Messaging Subsystem&quot;</span>
                + <span style="color:#006080;">&quot;\\Profiles\\Outlook\\9375CFF0413111d3B88A00104B2A6676&quot;</span>;

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene las cuentas de correo de Outlook definidas en el registro</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
        <span style="color:#0000ff;">public</span> List&lt;MailAccount&gt; GetAccounts()
        {
            readInfoAccounts();
            <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> List&lt;MailAccount&gt;(cuentasOutlook.Values);
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene información de una cuenta de correo determinada</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;accountID&quot;&gt;Identificador de la cuenta de correo. Se corresponde </span>
        <span style="color:#008000;">/// con el nombre de la rama del registro&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;exception cref=&quot;ArgumentOutOfRangeException&quot;&gt;Se produce la excepción cuando no </span>
        <span style="color:#008000;">/// se encuentra la cuenta especificada en &lt;paramref name=&quot;accountID&quot;/&gt;&lt;/exception&gt;</span>
        <span style="color:#0000ff;">public</span> MailAccount GetAccount(<span style="color:#0000ff;">string</span> accountID)
        {
            readInfoAccounts();
            <span style="color:#0000ff;">try</span>
            {
                <span style="color:#0000ff;">return</span> cuentasOutlook[accountID];
            }
            <span style="color:#0000ff;">catch</span> (KeyNotFoundException ex)
            {
                <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(<span style="color:#006080;">&quot;No existe la cuenta solicitada&quot;</span>, ex);
            }
            <span style="color:#0000ff;">catch</span> { <span style="color:#0000ff;">throw</span>; }
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene información de la cuenta establecida por defecto</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> MailAccount GetDefaultAccount()
        {
            <span style="color:#0000ff;">string</span>[] cuentas = getOutlookIdAccounts();
            <span style="color:#0000ff;">return</span> GetAccount(cuentas[0]);
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene información de una cuenta de correo en base a su dirección electrónica</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;email&quot;&gt;Cuenta de correo de la que se quiere recuperar la información&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;exception cref=&quot;ArgumentOutOfRangeException&quot;&gt;Se produce cuando  no se encuentra la </span>
        <span style="color:#008000;">/// cuenta de correo especificada en &lt;paramref name=&quot;email&quot;/&gt;.&lt;/exception&gt;</span>
        <span style="color:#0000ff;">public</span> MailAccount GetAcountByEmail(<span style="color:#0000ff;">string</span> email)
        {
            readInfoAccounts();

            MailAccount retVal = <span style="color:#0000ff;">null</span>;
            <span style="color:#008000;">// Como en la Uni, desarrollamos un algoritmo de búsqueda</span>
            <span style="color:#0000ff;">foreach</span> (MailAccount cuenta <span style="color:#0000ff;">in</span> cuentasOutlook.Values)
            {
                <span style="color:#0000ff;">if</span> (cuenta.Email == email)
                {
                    retVal = cuenta;
                    <span style="color:#0000ff;">break</span>;
                }
            }
            <span style="color:#0000ff;">if</span> (retVal != <span style="color:#0000ff;">null</span>)
            { <span style="color:#0000ff;">return</span> retVal; }
            <span style="color:#0000ff;">else</span> { <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(<span style="color:#006080;">&quot;Cuenta de correo no encontrada&quot;</span>); }
        }

        <span style="color:#008000;">/// &lt;param name=&quot;email&quot;&gt;Cuenta de correo de la que se quiere establecer la firma&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;newSignature&quot;&gt;Nombre de la firma que quiere establecerse en la cuenta de </span>
        <span style="color:#008000;">/// correo para mensajes nuevos&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;replySignature&quot;&gt;Nombre de la firma que quiere establecerse en la cuenta </span>
        <span style="color:#008000;">/// de correo para mensajes respondidos&lt;/param&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span> SetSignature(<span style="color:#0000ff;">string</span> email, <span style="color:#0000ff;">string</span> newSignature, <span style="color:#0000ff;">string</span> replySignature)
        {
            MailAccount cuenta = GetAcountByEmail(email);

            <span style="color:#008000;">// TODO : Queda pendiente una comprobación para que existan las firmas </span>
            <span style="color:#008000;">// en la carpeta de firmas.</span>

            RegistryKey rkCuenta = rkRaiz.OpenSubKey(ramaCuentas + <span style="color:#006080;">&quot;\\&quot; + cuenta.AccountID, true);
            rkCuenta.SetValue(&quot;</span>New Signature<span style="color:#006080;">&quot;, GetFirmaCodificada(newSignature));
            rkCuenta.SetValue(&quot;</span>Reply-Forward Signature<span style="color:#006080;">&quot;, GetFirmaCodificada(replySignature));
        }

        /// &lt;summary&gt;
        /// Realiza la lectura de las cuentas definidas en el registro
        /// &lt;/summary&gt;
        private void readInfoAccounts()
        {
            cuentasOutlook = new Dictionary&lt;string, MailAccount&gt;();
            string[] cuentas = getOutlookIdAccounts();
            for (int i = 0; i &lt; cuentas.Length; i++)
            {
                MailAccount m = getInfoAccount(cuentas[i]);
                m.OrderList = i;
                cuentasOutlook.Add(m.AccountID, m);
            }
        }

        /// &lt;summary&gt;
        /// Recupera la información de una cuenta determinada.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;</span>accountID<span style="color:#006080;">&quot;&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        private MailAccount getInfoAccount(string accountID)
        {
            MailAccount m = new MailAccount();
            m.AccountID = accountID;

            RegistryKey rkCuentas = rkRaiz.OpenSubKey(ramaCuentas + &quot;</span>\\<span style="color:#006080;">&quot; + accountID, false);
            m.Email = binaryToString(rkCuentas.GetValue(&quot;</span>Email<span style="color:#006080;">&quot;));
            m.NewSignature = binaryToString(rkCuentas.GetValue(&quot;</span>New Signature<span style="color:#006080;">&quot;));
            m.ReplySignature = binaryToString(rkCuentas.GetValue(&quot;</span>Reply-Forward Signature<span style="color:#006080;">&quot;));
            m.AccountName = binaryToString(rkCuentas.GetValue(&quot;</span>Account Name<span style="color:#006080;">&quot;));

            return m;
        }

        /// &lt;summary&gt;
        /// Obtiene una lista con las claves de las cuentas de Outlook
        /// &lt;/summary&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        private string[] getOutlookIdAccounts()
        {
            List&lt;string&gt; listaCuentas = new List&lt;string&gt;();
            RegistryKey rkCuentas = rkRaiz.OpenSubKey(ramaCuentas, false);

            // Lectura del valor que contiene las cuentas de Outlook
            object oCuentas = rkCuentas.GetValue(&quot;</span>{ED475418-B0D6-11D2-8C3B-00104B2A6676}<span style="color:#006080;">&quot;);
            if (oCuentas != null &amp;&amp; oCuentas.GetType().Equals(typeof(byte[])))
            {
                byte[] cuentas = (byte[])oCuentas;
                for (int i = 0; i &lt; cuentas.Length; i += 4)
                {
                    // Traspaso de Little Endian a Big Endian
                    StringBuilder sb = new StringBuilder();
                    sb.Append(((byte)(cuentas.GetValue(i + 3))).ToString(&quot;</span>X2<span style="color:#006080;">&quot;).ToLower());
                    sb.Append(((byte)(cuentas.GetValue(i + 2))).ToString(&quot;</span>X2<span style="color:#006080;">&quot;).ToLower());
                    sb.Append(((byte)(cuentas.GetValue(i + 1))).ToString(&quot;</span>X2<span style="color:#006080;">&quot;).ToLower());
                    sb.Append(((byte)(cuentas.GetValue(i))).ToString(&quot;</span>X2<span style="color:#006080;">&quot;).ToLower());

                    listaCuentas.Add(sb.ToString());
                }
            }
            return listaCuentas.ToArray();
        }

        /// &lt;summary&gt;
        /// Decodifica una cadena del registro en una cadena ASCII.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;</span>cadena&quot;&gt;Cadena del registro. Devuelve <span style="color:#0000ff;">string</span>.empty si la
        <span style="color:#008000;">/// cadena estuviese vacía.&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> binaryToString(<span style="color:#0000ff;">object</span> cadena)
        {
            StringBuilder sb = <span style="color:#0000ff;">new</span> StringBuilder();
            <span style="color:#0000ff;">if</span> (cadena != <span style="color:#0000ff;">null</span>)
            {
                <span style="color:#0000ff;">if</span> (cadena.GetType().Equals(<span style="color:#0000ff;">typeof</span>(<span style="color:#0000ff;">byte</span>[])))
                {
                    <span style="color:#0000ff;">byte</span>[] entrada = (<span style="color:#0000ff;">byte</span>[])cadena;
                    ASCIIEncoding ascii = <span style="color:#0000ff;">new</span> ASCIIEncoding();

                    <span style="color:#008000;">// Bucle para eliminar los bytes vacíos que se colocan en el registro</span>
                    <span style="color:#0000ff;">for</span> (<span style="color:#0000ff;">int</span> i = 0; i &lt; entrada.Length; i++)
                    {
                        <span style="color:#0000ff;">if</span> (entrada[i] != 0)
                        {
                            sb.Append(ascii.GetString(entrada, i, 1));
                        }
                        i++;
                    }
                }
            }
            <span style="color:#0000ff;">return</span> sb.ToString();
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Codifica el nombre de la firma en un array de Bytes</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;returns&gt;La codificación se hace tal cómo lo hace Outlook&lt;/returns&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">byte</span>[] GetFirmaCodificada(<span style="color:#0000ff;">string</span> nombreFirma)
        {
            <span style="color:#008000;">// Codificación del nombre de la firma</span>
            ASCIIEncoding ascii = <span style="color:#0000ff;">new</span> ASCIIEncoding();
            <span style="color:#0000ff;">byte</span>[] firmaSinCeros = ascii.GetBytes(nombreFirma);

            <span style="color:#008000;">// La firma de Outlook contiene un byte vacío por cada byte del nombre,</span>
            <span style="color:#008000;">// así que incluyo un List para no complicarme la vida y añadirle los </span>
            <span style="color:#008000;">// bytes vacíos.</span>
            List&lt;<span style="color:#0000ff;">byte</span>&gt; firmaConCeros = <span style="color:#0000ff;">new</span> List&lt;<span style="color:#0000ff;">byte</span>&gt;();

            <span style="color:#008000;">// Se añaden los ceros a la firma</span>
            <span style="color:#0000ff;">foreach</span> (<span style="color:#0000ff;">byte</span> b <span style="color:#0000ff;">in</span> firmaSinCeros)
            {
                firmaConCeros.Add(b);
                firmaConCeros.Add(<span style="color:#0000ff;">new</span> <span style="color:#0000ff;">byte</span>());
            }

            <span style="color:#008000;">// No sé la razón, pero la firma le añade dos bytes más</span>
            firmaConCeros.Add(<span style="color:#0000ff;">new</span> <span style="color:#0000ff;">byte</span>());
            firmaConCeros.Add(<span style="color:#0000ff;">new</span> <span style="color:#0000ff;">byte</span>());

            <span style="color:#0000ff;">return</span> firmaConCeros.ToArray();
        }

    }       <span style="color:#008000;">// class</span>
}           <span style="color:#008000;">// namespace</span></pre>
</div>
<p>&#160;</p>
<p>En esta ocasión no dejo las librerías listas para la descarga puesto que así intento obligarme a crear una tercera entrega dedicada a Outlook en la que intentaré que se puedan establecer algunos cambios desde una aplicación WinForms.</p>
<br />Posted in C#, Outlook  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/161/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=161&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2009/12/06/gestionar-cuentas-de-outlook-desde-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>

		<media:content url="http://alskare.files.wordpress.com/2009/12/registro.jpg" medium="image">
			<media:title type="html">registro</media:title>
		</media:content>
	</item>
		<item>
		<title>A&#241;adir firma en Outlook program&#225;ticamente</title>
		<link>http://alskare.wordpress.com/2009/11/09/aadir-firma-en-outlook/</link>
		<comments>http://alskare.wordpress.com/2009/11/09/aadir-firma-en-outlook/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 18:22:33 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[Outlook]]></category>

		<guid isPermaLink="false">http://alskare.wordpress.com/2009/11/09/aadir-firma-en-outlook/</guid>
		<description><![CDATA[La inserción de elementos que se añadan al final de nuestros mensajes en Outlook es una tarea realmente sencilla, puesto que bastará con acudir, desde el propio Outlook al menú Herramientas, Opciones, Formato de correo y “trastear” un poco con el apartado de Firma. No obstante, en una de las empresas en las que trabajo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=156&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>La inserción de elementos que se añadan al final de nuestros mensajes en Outlook es una tarea realmente sencilla, puesto que bastará con acudir, desde el propio Outlook al menú <strong>Herramientas, Opciones, Formato de correo</strong> y “trastear” un poco con el apartado de <strong>Firma</strong>. </p>
<p>No obstante, en una de las empresas en las que trabajo se me ha encargado la tarea de configurar a todos los usuarios una firma estándar para todos los mensajes salientes de Outlook. Debo advertir que en esta empresa no existe ningún tipo de servidor del tipo Exchange, es más, los usuarios van conectando de modo automático a una serie de servidores POP3/IMAP de los que van descargando todos los mensajes. Con estas condiciones, sólo me quedan un par de caminos a seguir: o consigo realizar algún tipo de “distribución” de las firmas con alguna directiva de sistema o me tocará añadir, a mano, las firmas de todos los usuarios. No es que sean muchos usuarios, pero a la veintena sí que llegan y, la verdad, ante cualquier cambio, prefiero encontrar la manera más cómoda de hacerlo.</p>
<p>Si a estos prolegómenos le añadimos que algún usuario entra al sistema bien sea mediante Terminal Server o bien mediante la red de la oficina, hecho que provoca que se desactive la firma aunque esté, casi reconozco que no me queda otro remedio que intentar encontrar algún tipo de solución “programática” para el cambio de la firma. Nunca he sabido la causa de la desactivación de la firma, aunque en algún foro he leído que puede ser consecuencia de tener Word como editor del correo de Outlook, pero cualquiera les quita el corrector ortográfico a la gente… (si con él puesto ya te escriben hortografía, ni me imagino cómo sería sin él).</p>
<p>Uno de las primera cosas que más me llama la atención con el tema de las firmas es que, como Outlook permite crear mensajes en tres tipos de formato distintos, cada formato podría tener una firma diferente. Todo depende de qué opción tengamos seleccionada en <strong>Herramientas</strong>, <strong>Opciones</strong>, <strong>Formato de correo</strong>: HTML, Texto enriquecido (formato RTF) o Texto sin formato (ASCII). Por tanto empiezo creando tres ficheros con el mismo nombre, adecuando el formato a cada una de las tres opciones:</p>
<ul>
<li>MiFirma.htm </li>
<li>MiFirma.rft </li>
<li>MiFirma.txt </li>
</ul>
<h2>Ubicación de las firmas</h2>
<p>Con alguna que otra “trampilla” logro descubrir que Outlook tiene un lugar especial en el que almacena las firmas y que éste lugar depende de la versión de Outlook, así, resumo las carpetas de almacenaje en la tabla siguiente:</p>
<table border="1" cellspacing="0" cellpadding="2" width="613">
<tbody>
<tr>
<td valign="top" width="63"><strong>Versión</strong></td>
<td valign="top" width="548"><strong>Carpeta</strong></td>
</tr>
<tr>
<td valign="top" width="63">O2003</td>
<td valign="top" width="548">\Documents and Settings\%USERNAME%Datos de programa\Microsoft\Signatures</td>
</tr>
<tr>
<td valign="top" width="63">O2007</td>
<td valign="top" width="548">\Documents and Settings\%USERNAME%Datos de programa\Microsoft\Firmas</td>
</tr>
</tbody>
</table>
<p>¡Cómo me divierten este tipo de cambios!. Ahora resulta que tendremos que mirar la versión del usuario antes de empezar a hacer nada… Bueno, vamos a empezar a copiar los ficheros en dichas carpetas.</p>
<p>Un pequeño apunte para usuarios de Outlook 2003 que quieran añadir imágenes en la firma. Por un lado, las imágenes podrían estar almacenadas en una carpeta /images, justo a continuación de las rutas mencionadas en la tabla anterior y, para hacer insertar dichas imágenes, bastará con referenciarlas como src=”images/nombreImagen.jpg”, Además, deberemos acudir a <strong>Herramientas</strong>, <strong>Opciones</strong>, <strong>Formato de Correo</strong>, <strong>Formato de Internet</strong> y activar la opción <em>Si un mensaje HTML contiene imágenes ubicadas en Internet, envíe una copia de las mismas en vez de la referencia de su ubicación</em>.</p>
<h2>Establecimiento de la firma</h2>
<p>Este es el apartado más peliagudo de todo el proceso puesto que, una vez copiados los ficheros de las firmas, de forma manual sería sencillo seguir los pasos indicados al principio (<strong>Herramientas</strong>, <strong>Opciones</strong>, <strong>Formato de Correo</strong> y seleccionar como firma la denominada <strong>MiFirma</strong>), no obstante, éste sería el paso que querría evitar. Al fin y al cabo, una copia de ficheros puedo hacerla por medio de un simple fichero batch que se ejecute una vez que entre el usuario, gracias a las GPO, pero me queda averiguar cómo podría activar esta firma a los usuarios que quiera. </p>
<p>En las GPO que uso, por lo menos en la versión 2003 no está incluye ningún tipo de opción que permita definir la firma que tiene activa el usuario. De alguna búsqueda extraigo algún fragmento para las directivas que, según los autores, permiten establecer esta opción, pero las pruebas que hago no son fructíferas y no sólo no me establecen ningún tipo de firma sino que desactivan la opción de poder cambiar de firma, así que me decido a buscar algún otro tipo de solución.</p>
<p>Vamos a jugar un poco con el registro del sistema para llevarnos una desagradable sorpresa. Las cuentas que normalmente tenemos configuradas en Outlook están “almacenadas” en la rama siguiente:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">HKEY_CURRENT_USER
  \Software
    \Microsoft
      \Windows NT
        \CurrentVersion
          \Windows Messaging Subsystem
            \Profiles
              \Outlook
                \9375CFF0413111d3B88A00104B2A6676</pre>
</div>
<p>Y, para desespero, las “reglas del juego” son las siguientes: En la clave mencionada existe una clave, concretamente la clave {ED475418-B0D6-11D2-8C3B-00104B2A6676}, que tiene un tipo de datos REG_BINARY. El primer byte del valor de esta cadena incluye un número (en mi caso, por ejemplo, es el 0b). Este dato nos informará de la cuenta que hay por defecto y que será una de las ramas de la clave del cuadro anterior. Una de las cosas buenas que le veo es que, tanto para O2003 como para O2007, es la misma rama.</p>
<p>&#160;<img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://alskare.files.wordpress.com/2009/11/image.png?w=644&#038;h=198" width="644" height="198" /> </p>
<p>Así, una vez hemos podido encontrar la cuenta predeterminada en Outlook, es fácil ver existen dos claves que se refieren a la firma. Estas dos claves, por supuesto, también son valores REG_BINARY y son las siguientes:</p>
<ul>
<li>New Signature </li>
<li>Reply-Forward Signature </li>
</ul>
<h2>Un poco de código C#</h2>
<p>Debo reconocer que este punto lo escribo días más tarde que el resto del post; la razón es muy sencilla, en algún sitio he visto algún script de VisualScript que permitía el cambio requerido en el registro para el tema de las firmas, pero a la hora de intentar implementarlo, siempre me he encontrado con problemas de seguridad al escribir en el registro. Entre esto y que no soy muy ducho con el tema de VisualScript, he optado por crear una pequeña utilidad en C# que me escriba las claves que necesito.</p>
<p>El objetivo de la aplicación, que posteriormente ejecutaré desde las GPO de Windows Server tendrá que ser una aplicación de consola que se ejecute con un parámetro, concretamente, el nombre de la firma que se quiere “predeterminar” en Outlook. Algo así cómo :</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">CambiaFirma.exe MiFirma</pre>
</div>
<p>Por tanto, echo mano de una clase que desconocía hasta el momento, pero que me ha gustado bastante, la clase <strong>Microsoft.Win32.RegistryKey</strong>, puesto que resuelve casi todos los problemas de escritura en el registro.</p>
<p>Muestro la clase tal cual, incluyendo una pantalla de consola que muestra el error en caso de que exista. Imagino que en la implementación final la quitaré para que, en caso de problemas no aparezca la pantallita. </p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> System;
<span style="color:#0000ff;">using</span> System.Collections.Generic;
<span style="color:#0000ff;">using</span> System.Text;
<span style="color:#0000ff;">using</span> Microsoft.Win32;

<span style="color:#0000ff;">namespace</span> CambiaFirma
{

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Ejecución del programa de cambio de firma</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#0000ff;">class</span> CambiarFirma
    {

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Inicio de la aplicación. Comprobación de argumento y gestión </span>
        <span style="color:#008000;">/// de la firma</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;args&quot;&gt;Deberá incluir un parámetro: NombreFirma&lt;/param&gt;</span>
        <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> Main(<span style="color:#0000ff;">string</span>[] args)
        {
            <span style="color:#0000ff;">try</span>
            {
                <span style="color:#008000;">// Lectura de parámetros para obtener el nombre de la firma</span>
                <span style="color:#0000ff;">if</span> (args.Length != 1)
                    <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> ArgumentException(<span style="color:#006080;">&quot;Debe añadirse el nombre de la firma como parámetro&quot;</span>);
                <span style="color:#0000ff;">string</span> nombreFirma = args[0];

                <span style="color:#008000;">// Gestión de firma</span>
                GestionFirma gf = <span style="color:#0000ff;">new</span> GestionFirma(nombreFirma);
                gf.EscribeFirma();
            }
            <span style="color:#0000ff;">catch</span> (Exception ex)
            {
                MuestraError(ex);
            }
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Muestra un error por pantalla de consola</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;&lt;/param&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> MuestraError(Exception ex)
        {
            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine(<span style="color:#006080;">&quot;ERROR EN CREACIÓN DE FIRMA&quot;</span>);
            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(ex.Message);
            Console.ForegroundColor = ConsoleColor.White;

            <span style="color:#0000ff;">for</span> (<span style="color:#0000ff;">int</span> i = Console.CursorTop; i &lt; Console.WindowHeight - 1; i++)
            {
                Console.WriteLine();
            }
            Console.Write(<span style="color:#006080;">&quot;Pulsa una tecla para continuar ... : &quot;</span>);
            Console.ReadKey(<span style="color:#0000ff;">true</span>);
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Clase que añade una firma a la cuenta por defecto de Outlook</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;remarks&gt;Provado en Outlook 2003 y Outlook 2007&lt;/remarks&gt;</span>
    <span style="color:#0000ff;">class</span> GestionFirma
    {
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> NombreFirma { get; set; }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Constructor de la clase.</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;nombreFirma&quot;&gt;</span>
        <span style="color:#008000;">/// Texto que representa la firma que se insertará en Outlook</span>
        <span style="color:#008000;">/// &lt;/param&gt;</span>
        <span style="color:#0000ff;">public</span> GestionFirma(<span style="color:#0000ff;">string</span> nombreFirma)
        {
            NombreFirma = nombreFirma;
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Cambia el registro del sistema de manera que la firma quedará activada</span>
        <span style="color:#008000;">/// en Outlook</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span> EscribeFirma()
        {
            RegistryKey r = GetRamaCuentaPredeterminadaOutlook();

            <span style="color:#0000ff;">byte</span>[] firma = GetFirmaCodificada(NombreFirma);

            <span style="color:#008000;">// Escritura de los valores</span>
            r.SetValue(<span style="color:#006080;">&quot;New Signature&quot;</span>, firma);
            r.SetValue(<span style="color:#006080;">&quot;Reply-Forward Signature&quot;</span>, firma);
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene la rama del registro correspondiente a la cuenta predeterminada </span>
        <span style="color:#008000;">/// de Outlook</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
        <span style="color:#0000ff;">private</span> RegistryKey GetRamaCuentaPredeterminadaOutlook()
        {
            <span style="color:#008000;">// Lectura de la rama \\HKCU</span>
            RegistryKey rkRaiz = Registry.CurrentUser;

            <span style="color:#008000;">// Lectura de la rama en al que se almacena el correo</span>
            RegistryKey rkCorreo =
                rkRaiz.OpenSubKey(
                        <span style="color:#006080;">&quot;Software\\Microsoft\\Windows NT&quot;</span>
                        + <span style="color:#006080;">&quot;\\CurrentVersion\\Windows Messaging Subsystem&quot;</span>
                        + <span style="color:#006080;">&quot;\\Profiles\\Outlook\\9375CFF0413111d3B88A00104B2A6676&quot;</span>);

            <span style="color:#008000;">// Se obtiene el valor de la clave que contiene la cuenta predeterminada</span>
            <span style="color:#0000ff;">byte</span>[] cuentaDefecto = (<span style="color:#0000ff;">byte</span>[])rkCorreo.GetValue(<span style="color:#006080;">@&quot;{ED475418-B0D6-11D2-8C3B-00104B2A6676}&quot;</span>);

            <span style="color:#008000;">// Se obtiene el valor de la subclave que contiene la cuenta predeterminada</span>
            <span style="color:#0000ff;">string</span> claveCuentaDefecto = <span style="color:#006080;">&quot;000000&quot;</span> + ((<span style="color:#0000ff;">byte</span>)(cuentaDefecto.GetValue(0))).ToString(<span style="color:#006080;">&quot;X2&quot;</span>).ToLower();

            <span style="color:#008000;">// Se abre la rama con la cuenta predeterminada con permisos de escritura</span>
            RegistryKey rkCuentaDefecto = rkCorreo.OpenSubKey(claveCuentaDefecto, <span style="color:#0000ff;">true</span>);

            <span style="color:#0000ff;">return</span> rkCuentaDefecto;
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Codifica el nombre de la firma en un array de Bytes</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;returns&gt;La codificación se hace tal cómo lo hace Outlook&lt;/returns&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">byte</span>[] GetFirmaCodificada(<span style="color:#0000ff;">string</span> nombreFirma)
        {
            <span style="color:#008000;">// Codificación del nombre de la firma</span>
            ASCIIEncoding ascii = <span style="color:#0000ff;">new</span> ASCIIEncoding();
            <span style="color:#0000ff;">byte</span>[] firmaSinCeros = ascii.GetBytes(nombreFirma);

            <span style="color:#008000;">// La firma de Outlook contiene un byte vacío por cada byte del nombre,</span>
            <span style="color:#008000;">// así que incluyo un List para no complicarme la vida y añadirle los </span>
            <span style="color:#008000;">// bytes vacíos.</span>
            List&lt;<span style="color:#0000ff;">byte</span>&gt; firmaConCeros = <span style="color:#0000ff;">new</span> List&lt;<span style="color:#0000ff;">byte</span>&gt;();

            <span style="color:#008000;">// Se añaden los ceros a la firma</span>
            <span style="color:#0000ff;">foreach</span> (<span style="color:#0000ff;">byte</span> b <span style="color:#0000ff;">in</span> firmaSinCeros)
            {
                firmaConCeros.Add(b);
                firmaConCeros.Add(<span style="color:#0000ff;">new</span> <span style="color:#0000ff;">byte</span>());
            }

            <span style="color:#008000;">// No sé la razón, pero la firma le añade dos bytes más</span>
            firmaConCeros.Add(<span style="color:#0000ff;">new</span> <span style="color:#0000ff;">byte</span>());
            firmaConCeros.Add(<span style="color:#0000ff;">new</span> <span style="color:#0000ff;">byte</span>());

            <span style="color:#0000ff;">return</span> firmaConCeros.ToArray();
        }
    }

}</pre>
</div>
<p>Ahora, con el programita éste ya puedo ejecutarlo de tal manera que, cada vez que un usuario inicie la sesión, se le establezca la firma deseada en la cuenta predeterminada de Outlook.</p>
<p>Confío que no me hagan establecer una firma para cada una de las cuentas que tengan configuradas en Outlook, pero con los jefes “tan listos” de las empresas, nunca se sabe…”Si total, como es algo fácil establecer la firma… ¿Ves?, sólo hay que hacer <strong>Herramientas, Opciones, Formato de correo</strong>…</p>
<p>Como siempre, dejo enlace para descarga por si alguien no tiene el compilador o, sencillamente, no tiene ganas de hacer un Copy &amp; Paste.</p>
<p>Descarga del programa: <a href="http://www.velasco.biz/html/descargas/CambiaFirma.zip" target="_blank">aquí</a></p>
<br />Posted in Outlook  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/156/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=156&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2009/11/09/aadir-firma-en-outlook/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>

		<media:content url="http://alskare.files.wordpress.com/2009/11/image.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>C#. Generador de Passwords aleatorios</title>
		<link>http://alskare.wordpress.com/2009/10/13/c-generador-de-passwords-aleatorios/</link>
		<comments>http://alskare.wordpress.com/2009/10/13/c-generador-de-passwords-aleatorios/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 11:35:35 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Helpers]]></category>
		<category><![CDATA[NetFramework]]></category>

		<guid isPermaLink="false">http://alskare.wordpress.com/2009/10/13/c-generador-de-passwords-aleatorios/</guid>
		<description><![CDATA[Estoy más que seguro que cualquiera de nosotros hemos sido usuarios en cualquier ocasión de algún tipo de herramienta similar a la que intento crear en estos momentos. De hecho, con una búsqueda bastante genérica en Google surgen multitud de rutinas en cualquier lenguaje. No obstante, como soy de aquellas personas que prefiere crear sus [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=154&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Estoy más que seguro que cualquiera de nosotros hemos sido usuarios en cualquier ocasión de algún tipo de herramienta similar a la que intento crear en estos momentos. De hecho, con una búsqueda bastante genérica en Google surgen multitud de rutinas en cualquier lenguaje. No obstante, como soy de aquellas personas que prefiere crear sus propias rutinas antes de hacer un “Copia y Pega” de lo que han hecho otros, me dispongo a la creación de una utilidad que me permita obtener contraseñas de una manera aleatoria.</p>
<h2></h2>
<h2>¿Qué necesito?</h2>
<p>En principio, sólo necesito una rutina que me permita generar un password de 8 caracteres, y que incluya, al menos, un número, un carácter no alfanumérico y algún carácter en mayúscula. Podemos apreciar enseguida que, aunque la necesidad inminente es bastante sencilla, lo mejor es poder parametrizar estos elementos a los que podemos llamar “Caracteres especiales”:</p>
<ul>
<li>Números </li>
<li>Mayúsculas </li>
<li>Símbolos </li>
</ul>
<p>Debo reconocer que, a la hora de parametrizar valores, soy un amante de los porcentajes y, en este principio, baso muchas de las rutinas creadas. Es decir, si genero una rutina que me permita crear una contraseña de 10 caracteres, prefiero decir que tenga un 20% de números, un 20% de mayúsculas y otro 20% de símbolos para que la contraseña tenga: 2 números + 2 letras mayúsculas + 2 símbolos + 4 caracteres normales en minúscula. De esta manera, si tengo que ampliar la longitud de la contraseña a 20 caracteres, automáticamente cambiará el número de caracteres especiales, manteniendo la proporción.</p>
<p>Otro de los puntos a tener en cuenta es que los caracteres que pueden emplearse no siempre serán válidos en todos los entornos, por tanto, aunque no me he preocupado de parametrizar este punto, sí que he tenido la precaución de “separarlo” por si alguien tiene que añadir/eliminar algún carácter no compatible, por ejemplo, con un determinado servidor de correo.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">string</span> caracteres = <span style="color:#006080;">&quot;abcdefghijklmnopqrstuvwxyz&quot;</span>;
<span style="color:#0000ff;">string</span> numeros = <span style="color:#006080;">&quot;0123456789&quot;</span>;
<span style="color:#0000ff;">string</span> simbolos = <span style="color:#006080;">&quot;%$#@+-=&amp;&quot;</span>;</pre>
</div>
<h2>¿Cómo enfoco el resultado?</h2>
<p>En mi caso, con contraseñas de 8 caracteres suelo pasar. De hecho, debo reconocer que la necesidad de la creación de una rutina que cree passwords automáticamente viene dada por una aplicación Web que tengo que crear en la que, cuando un usuario pierde una contraseña, se le enviará por e-correo y, la primera vez que entre, tendrá que cambiarla, así que prima más la “estética” de la contraseña que la seguridad. Lo que pasa es que, a la gente le gusta más ver símbolos raros que cualquier nombre.</p>
<p>Pues eso, que la idea inicial es la de crear un constructor estándar con 8 caracteres, de los cuales tendrá un 20% de caracteres especiales. Otro constructor que permita crear una contraseña con una longitud variable y otro que permita definir todo:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> GeneradorPassword()
{ }

<span style="color:#0000ff;">public</span> GeneradorPassword(<span style="color:#0000ff;">int</span> longitudCaracteres)
{ }

<span style="color:#0000ff;">public</span> GeneradorPassword(<span style="color:#0000ff;">int</span> longitudCaracteres,
                         <span style="color:#0000ff;">int</span> porcentajeMayusculas,
                         <span style="color:#0000ff;">int</span> porcentajeSimbolos,
                         <span style="color:#0000ff;">int</span> porcentajeNumeros)
{ }</pre>
</div>
<p>En cuanto al sistema de crear la rutina, no me complico tampoco la vida:</p>
<ol>
<li>Creo una cadena con la longitud de la contraseña todo en minúscula </li>
<li>Obtengo el número de caracteres especiales a añadir </li>
<li>Obtengo una posición aleatoria para colocar los caracteres especiales </li>
<li>Reemplazo los caracteres especiales en las posiciones obtenidas. </li>
</ol>
<h2>El resultado</h2>
<p>Dejo la rutina tal cuál me ha quedado:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> System;
<span style="color:#0000ff;">using</span> System.Collections.Generic;
<span style="color:#0000ff;">using</span> System.Text;

<span style="color:#0000ff;">namespace</span> jnSoftware.Utiles
{
    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Clase que permite la generación de una contraseña. </span>
    <span style="color:#008000;">/// La contraseña contiene un número de caracteres fijos y permite especificar el porcentaje</span>
    <span style="color:#008000;">/// de caracteres en mayúsculas y símbolos que se quieren obtener</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> GeneradorPassword
    {

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Enumeración que permite conocer el tipo de juego de carácteres a emplear</span>
        <span style="color:#008000;">/// para cada carácter</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">enum</span> TipoCaracterEnum { Minuscula, Mayuscula, Simbolo, Numero }

        <span style="color:#cc6633;">#region</span> Campos

        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span> porcentajeMayusculas;
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span> porcentajeSimbolos;
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span> porcentajeNumeros;
        Random semilla;

        <span style="color:#008000;">// Caracteres que pueden emplearse en la contraseña</span>
        <span style="color:#0000ff;">string</span> caracteres = <span style="color:#006080;">&quot;abcdefghijklmnopqrstuvwxyz&quot;</span>;
        <span style="color:#0000ff;">string</span> numeros = <span style="color:#006080;">&quot;0123456789&quot;</span>;
        <span style="color:#0000ff;">string</span> simbolos = <span style="color:#006080;">&quot;%$#@+-=&amp;&quot;</span>;

        <span style="color:#008000;">// Cadena que contiene el password generado</span>
        <span style="color:#0000ff;">private</span> StringBuilder password;

        <span style="color:#cc6633;">#endregion</span>

        <span style="color:#cc6633;">#region</span> Propiedades

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene o establece la longitud en carácteres de la contraseña a obtener</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> LongitudPassword { get; set; }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene o establece el porcentaje de carácteres en mayúsculas que </span>
        <span style="color:#008000;">/// contendrá la contraseña</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;exception cref=&quot;ArgumentOutOfRangeException&quot;&gt;Se produce al intentar introducir</span>
        <span style="color:#008000;">/// un valor que no coincida con un porcentaje&lt;/exception&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> PorcentajeMayusculas
        {
            get { <span style="color:#0000ff;">return</span> porcentajeMayusculas; }
            set
            {
                <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">value</span> &lt; 0 || <span style="color:#0000ff;">value</span> &gt; 100)
                    <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(<span style="color:#006080;">&quot;El porcentaje es un número entre 0 y 100&quot;</span>);
                porcentajeMayusculas = <span style="color:#0000ff;">value</span>;
            }
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene o establece el porcentaje de símbolos que contendrá la contraseña</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;exception cref=&quot;ArgumentOutOfRangeException&quot;&gt;Se produce al intentar introducir</span>
        <span style="color:#008000;">/// un valor que no coincida con un porcentaje&lt;/exception&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> PorcentajeSimbolos
        {
            get { <span style="color:#0000ff;">return</span> porcentajeSimbolos; }
            set
            {
                <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">value</span> &lt; 0 || <span style="color:#0000ff;">value</span> &gt; 100)
                    <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(<span style="color:#006080;">&quot;El porcentaje es un número entre 0 y 100&quot;</span>);
                porcentajeSimbolos = <span style="color:#0000ff;">value</span>;
            }
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene o establece el número de caracteres numéricos que contendrá la contraseña</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;exception cref=&quot;ArgumentOutOfRangeException&quot;&gt;Se produce al intentar introducir</span>
        <span style="color:#008000;">/// un valor que no coincida con un porcentaje&lt;/exception&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> PorcentajeNumeros
        {
            get { <span style="color:#0000ff;">return</span> porcentajeNumeros; }
            set
            {
                <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">value</span> &lt; 0 || <span style="color:#0000ff;">value</span> &gt; 100)
                    <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(<span style="color:#006080;">&quot;El porcentaje es un número entre 0 y 100&quot;</span>);
                porcentajeNumeros = <span style="color:#0000ff;">value</span>;
            }
        }

        <span style="color:#cc6633;">#endregion</span>

        <span style="color:#cc6633;">#region</span> Constructores
        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Constructor. La contraseña tendrá 8 caracteres, incluyendo una letra mayúscula, </span>
        <span style="color:#008000;">/// un número y un símbolo</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> GeneradorPassword()
            : <span style="color:#0000ff;">this</span>(8)
        { }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Constructor. La contraseña tendrá un 20% de caracteres en mayúsculas y otro tanto de </span>
        <span style="color:#008000;">/// símbolos</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;longitudCaracteres&quot;&gt;Longitud en carácteres de la contraseña a obtener&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;exception cref=&quot;ArgumentOutOfRangeException&quot;&gt;Se produce al intentar introducir</span>
        <span style="color:#008000;">/// un porcentaje de caracteres especiales mayor de 100&lt;/exception&gt;</span>
        <span style="color:#0000ff;">public</span> GeneradorPassword(<span style="color:#0000ff;">int</span> longitudCaracteres)
            : <span style="color:#0000ff;">this</span>(longitudCaracteres, 20, 20, 20)
        { }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Constructor</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;longitudCaracteres&quot;&gt;Longitud en carácteres de la contraseña a obtener&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;porcentajeMayusculas&quot;&gt;Porcentaje a aplicar de caracteres en mayúscula&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;porcentajeSimbolos&quot;&gt;Porcenta a aplicar de símbolos&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;porcentajeNumeros&quot;&gt;Porcentaje de caracteres numéricos&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;exception cref=&quot;ArgumentOutOfRangeException&quot;&gt;Se produce al intentar introducir</span>
        <span style="color:#008000;">/// un porcentaje de caracteres especiales mayor de 100&lt;/exception&gt;</span>
        <span style="color:#0000ff;">public</span> GeneradorPassword(<span style="color:#0000ff;">int</span> longitudCaracteres, <span style="color:#0000ff;">int</span> porcentajeMayusculas, <span style="color:#0000ff;">int</span> porcentajeSimbolos, <span style="color:#0000ff;">int</span> porcentajeNumeros)
        {
            LongitudPassword = longitudCaracteres;
            PorcentajeMayusculas = porcentajeMayusculas;
            PorcentajeSimbolos = porcentajeSimbolos;
            PorcentajeNumeros = porcentajeNumeros;

            <span style="color:#0000ff;">if</span> (PorcentajeMayusculas + porcentajeSimbolos + PorcentajeNumeros &gt; 100)
                <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(
                <span style="color:#006080;">&quot;La suma de los porcentajes de caracteres especiales no puede superar el &quot;</span> +
                <span style="color:#006080;">&quot;100%, es decir, no puede ser superior a la longitud de la contraseña&quot;</span>);
            semilla = <span style="color:#0000ff;">new</span> Random(DateTime.Now.Millisecond);
        }

        <span style="color:#cc6633;">#endregion</span>

        <span style="color:#cc6633;">#region</span> Métodos públicos

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene el password</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> GetNewPassword()
        {
            GeneraPassword();
            <span style="color:#0000ff;">return</span> password.ToString();
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Permite establecer el número de caracteres especiales que se quieren obtener</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;numeroCaracteresMayuscula&quot;&gt;Número de caracteres en mayúscula&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;numeroCaracteresNumericos&quot;&gt;Número de caracteres numéricos&lt;/param&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;numeroCaracteresSimbolos&quot;&gt;Número de caracteres de símbolos&lt;/param&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span> SetCaracteresEspeciales(
            <span style="color:#0000ff;">int</span> numeroCaracteresMayuscula
            , <span style="color:#0000ff;">int</span> numeroCaracteresNumericos
            , <span style="color:#0000ff;">int</span> numeroCaracteresSimbolos)
        {
            <span style="color:#008000;">// Comprobación de errores</span>
            <span style="color:#0000ff;">if</span> (numeroCaracteresMayuscula
                    + numeroCaracteresNumericos
                    + numeroCaracteresSimbolos &gt; LongitudPassword)
                <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> ArgumentOutOfRangeException(
                    <span style="color:#006080;">&quot;El número de caracteres especiales no puede superar la longitud del password&quot;</span>);

            PorcentajeMayusculas = numeroCaracteresMayuscula * 100 / LongitudPassword;
            PorcentajeNumeros = numeroCaracteresNumericos * 100 / LongitudPassword;
            PorcentajeSimbolos = numeroCaracteresSimbolos * 100 / LongitudPassword;
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Constructor. La contraseña tendrá 8 caracteres, incluyendo una letra mayúscula, </span>
        <span style="color:#008000;">/// un número y un símbolo</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">string</span> GetPassword()
        {
            <span style="color:#008000;">// Se crea un método estático para facilitar el uso</span>
            GeneradorPassword gp = <span style="color:#0000ff;">new</span> GeneradorPassword();
            <span style="color:#0000ff;">return</span> gp.GetNewPassword();
        }

        <span style="color:#cc6633;">#endregion</span>

        <span style="color:#cc6633;">#region</span> Métodos de cálculo

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Método que genera el password. Primero crea una cadena de caracteres </span>
        <span style="color:#008000;">/// en minúscula y va sustituyendo los caracteres especiales</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">void</span> GeneraPassword()
        {
            <span style="color:#008000;">// Se genera una cadena de caracteres en minúscula con la longitud del </span>
            <span style="color:#008000;">// password seleccionado</span>
            password = <span style="color:#0000ff;">new</span> StringBuilder(LongitudPassword);
            <span style="color:#0000ff;">for</span> (<span style="color:#0000ff;">int</span> i = 0; i &lt; LongitudPassword; i++)
            {
                password.Append(GetCaracterAleatorio(TipoCaracterEnum.Minuscula));
            }

            <span style="color:#008000;">// Se obtiene el número de caracteres especiales (Mayúsculas y caracteres) </span>
            <span style="color:#0000ff;">int</span> numMayusculas = (<span style="color:#0000ff;">int</span>)(LongitudPassword * (PorcentajeMayusculas / 100d));
            <span style="color:#0000ff;">int</span> numSimbolos = (<span style="color:#0000ff;">int</span>)(LongitudPassword * (PorcentajeSimbolos / 100d));
            <span style="color:#0000ff;">int</span> numNumeros = (<span style="color:#0000ff;">int</span>)(LongitudPassword * (PorcentajeNumeros / 100d));

            <span style="color:#008000;">// Se obtienen las posiciones en las que irán los caracteres especiales</span>
            <span style="color:#0000ff;">int</span>[] caracteresEspeciales =
                    GetPosicionesCaracteresEspeciales(numMayusculas + numSimbolos + numNumeros);
            <span style="color:#0000ff;">int</span> posicionInicial = 0;
            <span style="color:#0000ff;">int</span> posicionFinal = 0;

            <span style="color:#008000;">// Se reemplazan las mayúsculas</span>
            posicionFinal += numMayusculas;
            ReemplazaCaracteresEspeciales(caracteresEspeciales,
                 posicionInicial, posicionFinal, TipoCaracterEnum.Mayuscula);

            <span style="color:#008000;">// Se reemplazan los símbolos</span>
            posicionInicial = posicionFinal;
            posicionFinal += numSimbolos;
            ReemplazaCaracteresEspeciales(caracteresEspeciales,
                 posicionInicial, posicionFinal, TipoCaracterEnum.Simbolo);

            <span style="color:#008000;">// Se reemplazan los Números</span>
            posicionInicial = posicionFinal;
            posicionFinal += numNumeros;
            ReemplazaCaracteresEspeciales(caracteresEspeciales,
                 posicionInicial, posicionFinal, TipoCaracterEnum.Numero);
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Reemplaza un caracter especial en la cadena Password</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">void</span> ReemplazaCaracteresEspeciales(
                                        <span style="color:#0000ff;">int</span>[] posiciones
                                        , <span style="color:#0000ff;">int</span> posicionInicial
                                        , <span style="color:#0000ff;">int</span> posicionFinal
                                        , TipoCaracterEnum tipoCaracter)
        {
            <span style="color:#0000ff;">for</span> (<span style="color:#0000ff;">int</span> i = posicionInicial; i &lt; posicionFinal; i++)
            {
                password[posiciones[i]] = GetCaracterAleatorio(tipoCaracter);
            }
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene un array con las posiciones en las que deberán colocarse los caracteres</span>
        <span style="color:#008000;">/// especiales (Mayúsculas o Símbolos). Es importante que no se repitan los números</span>
        <span style="color:#008000;">/// de posición para poder mantener el porcentaje de dichos carácteres</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#008000;">/// &lt;param name=&quot;numeroPosiciones&quot;&gt;Valor que representa el número de posiciones</span>
        <span style="color:#008000;">/// que deberán crearse sin repetir&lt;/param&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">int</span>[] GetPosicionesCaracteresEspeciales(<span style="color:#0000ff;">int</span> numeroPosiciones)
        {
            List&lt;<span style="color:#0000ff;">int</span>&gt; lista = <span style="color:#0000ff;">new</span> List&lt;<span style="color:#0000ff;">int</span>&gt;();
            <span style="color:#0000ff;">while</span> (lista.Count &lt; numeroPosiciones)
            {
                <span style="color:#0000ff;">int</span> posicion = semilla.Next(0, LongitudPassword);
                <span style="color:#0000ff;">if</span> (!lista.Contains(posicion))
                {
                    lista.Add(posicion);
                }
            }
            <span style="color:#0000ff;">return</span> lista.ToArray();
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Obtiene un carácter aleatorio en base a la &quot;matriz&quot; del tipo de caracteres</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">char</span> GetCaracterAleatorio(TipoCaracterEnum tipoCaracter)
        {
            <span style="color:#0000ff;">string</span> juegoCaracteres;
            <span style="color:#0000ff;">switch</span> (tipoCaracter)
            {
                <span style="color:#0000ff;">case</span> TipoCaracterEnum.Mayuscula:
                    juegoCaracteres = caracteres.ToUpper();
                    <span style="color:#0000ff;">break</span>;
                <span style="color:#0000ff;">case</span> TipoCaracterEnum.Minuscula:
                    juegoCaracteres = caracteres.ToLower();
                    <span style="color:#0000ff;">break</span>;
                <span style="color:#0000ff;">case</span> TipoCaracterEnum.Numero:
                    juegoCaracteres = numeros;
                    <span style="color:#0000ff;">break</span>;
                <span style="color:#0000ff;">default</span>:
                    juegoCaracteres = simbolos;
                    <span style="color:#0000ff;">break</span>;
            }

            <span style="color:#008000;">// índice máximo de la matriz char de caracteres</span>
            <span style="color:#0000ff;">int</span> longitudJuegoCaracteres = juegoCaracteres.Length;

            <span style="color:#008000;">// Obtención de un número aletorio para obtener la posición del carácter</span>
            <span style="color:#0000ff;">int</span> numeroAleatorio = semilla.Next(0, longitudJuegoCaracteres);

            <span style="color:#008000;">// Se devuelve una posición obtenida aleatoriamente</span>
            <span style="color:#0000ff;">return</span> juegoCaracteres[numeroAleatorio];
        }

        <span style="color:#cc6633;">#endregion</span>

    }
}</pre>
</div>
<p>&#160;</p>
<p>La rutina puede probarse gracias a los amigos de velasco.biz: <a href="http://www.velasco.biz/html/desarrollo/GeneraPassword.aspx" target="_blank">Probar rutina</a></p>
<br />Posted in C#, Helpers, NetFramework  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/154/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=154&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2009/10/13/c-generador-de-passwords-aleatorios/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>
	</item>
		<item>
		<title>C# Personalizar la ordenaci&#243;n de listas con IComparable</title>
		<link>http://alskare.wordpress.com/2009/09/19/c-personalizar-la-ordenador-de-listas-con-icomparable/</link>
		<comments>http://alskare.wordpress.com/2009/09/19/c-personalizar-la-ordenador-de-listas-con-icomparable/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 10:53:11 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[NetFramework]]></category>

		<guid isPermaLink="false">http://alskare.wordpress.com/2009/09/19/c-personalizar-la-ordenador-de-listas-con-icomparable/</guid>
		<description><![CDATA[Hace poco, designios extraños de la vida, me ha tocado hacer una ordenación de una serie de objetos string tal como se hacía en la antigüedad. Cuando hablo de la antigüedad, tan sólo dejo correr un poco la memoria hasta los tiempos en que vestía con un jersey de cuello alto y unos pantalones cortos. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=150&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hace poco, designios extraños de la vida, me ha tocado hacer una ordenación de una serie de objetos string tal como se hacía en la antigüedad. Cuando hablo de la antigüedad, tan sólo dejo correr un poco la memoria hasta los tiempos en que vestía con un jersey de cuello alto y unos pantalones cortos. Entonces, al pasar por los pasillos de las aulas, no era nada extraño escuchar una especie de canto gregoriano (pero a lo pobre) en el que una panda de alumnos que pensaban más en el pájaro del árbol de enfrente que en lo que estaban haciendo, solían recitar: a, b, c, ch (che), d, e , f, g, h, i, j, k, l, m, n, ñ, o, p, q, r, rr (erre doble), s, t, u, v, w, x, y, <em>y</em> zeta.</p>
<p>Bueno, el caso es que esta vez no me ha tocado hacer nada sobre la rr, pero sí que he tenido que hacer un sistema de ordenación en el que quedase contemplado la letra <em>che</em>. Por cierto, dicen que la curiosidad mata al gato y, como soy muy cotilla, se me ha ocurrido buscar la letra en la R.A.E y, ¡sorpresa!, ¡Todavía existe! (<a title="http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&amp;LEMA=che" href="http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&amp;LEMA=che" target="_blank">http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&amp;LEMA=che</a>).</p>
<p>Siempre me voy por las ramas, así que… al lío:</p>
<p>Vamos a crear un ejemplo con la socorrida clase Persona y, como haremos uso de una colección List&lt;Persona&gt;, le implementamos la interfaz IComparable. Aunque ya sabemos que el resultado no será el que andamos buscando, nos dará una idea de cómo nos realizaría la ordenación cualquier colección que nos permita realizar una ordenación de los objetos Persona.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> System;
<span style="color:#0000ff;">using</span> System.Collections.Generic;

<span style="color:#0000ff;">namespace</span> OrdenacionStrings
{
    <span style="color:#0000ff;">class</span> Ordenando
    {
        <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> Main(<span style="color:#0000ff;">string</span>[] args)
        {
            List&lt;Persona&gt; gente = <span style="color:#0000ff;">new</span> List&lt;Persona&gt;();
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Jaime&quot;</span>, <span style="color:#006080;">&quot;Cebado Sánchez&quot;</span>));
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Victoria&quot;</span>, <span style="color:#006080;">&quot;Chacón Gómez&quot;</span>));
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Anibal&quot;</span>, <span style="color:#006080;">&quot;Chacón Gómez&quot;</span>));
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Andrés&quot;</span>, <span style="color:#006080;">&quot;Cullera Ramón&quot;</span>));
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Juan Manuel&quot;</span>, <span style="color:#006080;">&quot;Damián Rodriguez&quot;</span>));

            gente.Sort();

            <span style="color:#0000ff;">foreach</span> (Persona p <span style="color:#0000ff;">in</span> gente)
            {
                Console.WriteLine(p.Apellidos + <span style="color:#006080;">&quot;, &quot;</span> + p.Nombre);
            }
            Console.ReadKey();
        }
    }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> Persona : IComparable
    {
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Nombre { get; set; }
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Apellidos { get; set; }

        <span style="color:#0000ff;">public</span> Persona(<span style="color:#0000ff;">string</span> nombre, <span style="color:#0000ff;">string</span> apellidos)
        {
            Nombre = nombre;
            Apellidos = apellidos;
        }

        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> CompareTo(<span style="color:#0000ff;">object</span> obj)
        {
            <span style="color:#0000ff;">try</span>
            {
                Persona p = (Persona)obj;
                <span style="color:#0000ff;">return</span> (<span style="color:#0000ff;">this</span>.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + <span style="color:#0000ff;">this</span>.Nombre).CompareTo(p.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + p.Nombre);
            }
            <span style="color:#0000ff;">catch</span> { <span style="color:#0000ff;">return</span> 0; }
        }
    }

}</pre>
</div>
<p>En el momento en que ejecutemos el código, veremos que la ordenación que hace es la actual, es decir, tendremos un resultado en el cual, los “Chacón” estarán antes de “Cullera”, cuando en realidad deberían salir después, puesto que contienen la letra (o dígrafo) che.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">Cebado Sánchez, Jaime
Chacón Gómez, Anibal
Chacón Gómez, Victoria
Cullera Ramón, Andrés
Damián Rodriguez, Juan Manuel</pre>
</div>
<p>Una de las ventajas de la Interfaz IComparable es que podemos implementar el método CompareTo como nos plazca (gracias, OO) y, con una serie de pequeños cambios en la clase Persona, podemos realizar un control de tal manera que, analizando las dos primeras letras de la cadena, podemos indicarle si la <em>ch</em> irá antes o después de la <em>c</em>.</p>
<p>Así, con una implementación distinta de la anterior del métodos CompareTo, el resultado será el deseado desde el principio:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> CompareTo(<span style="color:#0000ff;">object</span> obj)
 {
     <span style="color:#0000ff;">try</span>
     {
         Persona p = (Persona)obj;
         <span style="color:#0000ff;">if</span> (!<span style="color:#0000ff;">this</span>.Apellidos.ToLower().StartsWith(<span style="color:#006080;">&quot;ch&quot;</span>))
         {
             <span style="color:#0000ff;">return</span> (<span style="color:#0000ff;">this</span>.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + <span style="color:#0000ff;">this</span>.Nombre).CompareTo(p.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + p.Nombre);
         }
         <span style="color:#0000ff;">else</span>
         {
             <span style="color:#0000ff;">if</span> (!p.Apellidos.ToLower().StartsWith(<span style="color:#006080;">&quot;ch&quot;</span>))
             {
                 <span style="color:#0000ff;">return</span> (<span style="color:#0000ff;">string</span>.Compare((p.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + p.Nombre).ToLower(), <span style="color:#006080;">&quot;d&quot;</span>) * -1);

                 <span style="color:#008000;">/* la línea anterior intenta simplificar el conjunto de operaciones siguientes.</span>
<span style="color:#008000;">                  * Sólo se trata de realizar una inversión en la comparación de la ch y la d</span>
<span style="color:#008000;">                  */</span> 

                 <span style="color:#008000;">//if (string.Compare((p.Apellidos + &quot; &quot; + p.Nombre).ToLower(), &quot;d&quot;) == 1)</span>
                 <span style="color:#008000;">//    return -1;</span>
                 <span style="color:#008000;">//else if (string.Compare((p.Apellidos + &quot; &quot; + p.Nombre).ToLower(), &quot;d&quot;) == -1)</span>
                 <span style="color:#008000;">//    return 1;</span>
                 <span style="color:#008000;">//else return 0;</span>
             }
             <span style="color:#0000ff;">else</span>
             {
                 <span style="color:#0000ff;">return</span> (<span style="color:#0000ff;">this</span>.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + <span style="color:#0000ff;">this</span>.Nombre).CompareTo(p.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + p.Nombre);
             }
         }
     }
     <span style="color:#0000ff;">catch</span> { <span style="color:#0000ff;">return</span> 0; }
 }
    }</pre>
</div>
<p>Resultado obtenido:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">Cebado Sánchez, Jaime
Cullera Ramón, Andrés
Chacón Gómez, Anibal
Chacón Gómez, Victoria
Damián Rodriguez, Juan Manuel</pre>
</div>
<p>&#160;</p>
<p>Dejo aquí el código de la clase al completo para no tener que ir buscando entre los “cachitos” de código del post.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> System;
<span style="color:#0000ff;">using</span> System.Collections.Generic;

<span style="color:#0000ff;">namespace</span> OrdenacionCorrecta
{
    <span style="color:#0000ff;">class</span> Program
    {
        <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span> Main(<span style="color:#0000ff;">string</span>[] args)
        {
            List&lt;Persona&gt; gente = <span style="color:#0000ff;">new</span> List&lt;Persona&gt;();
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Jaime&quot;</span>, <span style="color:#006080;">&quot;Cebado Sánchez&quot;</span>));
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Victoria&quot;</span>, <span style="color:#006080;">&quot;Chacón Gómez&quot;</span>));
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Anibal&quot;</span>, <span style="color:#006080;">&quot;Chacón Gómez&quot;</span>));
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Andrés&quot;</span>, <span style="color:#006080;">&quot;Cullera Ramón&quot;</span>));
            gente.Add(<span style="color:#0000ff;">new</span> Persona(<span style="color:#006080;">&quot;Juan Manuel&quot;</span>, <span style="color:#006080;">&quot;Damián Rodriguez&quot;</span>));

            gente.Sort();

            <span style="color:#0000ff;">foreach</span> (Persona p <span style="color:#0000ff;">in</span> gente)
            {
                Console.WriteLine(p.Apellidos + <span style="color:#006080;">&quot;, &quot;</span> + p.Nombre);
            }
            Console.ReadKey();
        }
    }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> Persona : IComparable
    {
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Nombre { get; set; }
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Apellidos { get; set; }

        <span style="color:#0000ff;">public</span> Persona(<span style="color:#0000ff;">string</span> nombre, <span style="color:#0000ff;">string</span> apellidos)
        {
            Nombre = nombre;
            Apellidos = apellidos;
        }

        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> CompareTo(<span style="color:#0000ff;">object</span> obj)
        {
            <span style="color:#0000ff;">try</span>
            {
                Persona p = (Persona)obj;
                <span style="color:#0000ff;">if</span> (!<span style="color:#0000ff;">this</span>.Apellidos.ToLower().StartsWith(<span style="color:#006080;">&quot;ch&quot;</span>))
                {
                    <span style="color:#0000ff;">return</span> (<span style="color:#0000ff;">this</span>.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + <span style="color:#0000ff;">this</span>.Nombre).CompareTo(p.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + p.Nombre);
                }
                <span style="color:#0000ff;">else</span>
                {
                    <span style="color:#0000ff;">if</span> (!p.Apellidos.ToLower().StartsWith(<span style="color:#006080;">&quot;ch&quot;</span>))
                    {
                        <span style="color:#0000ff;">return</span> (<span style="color:#0000ff;">string</span>.Compare((p.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + p.Nombre).ToLower(), <span style="color:#006080;">&quot;d&quot;</span>) * -1);
                    }
                    <span style="color:#0000ff;">else</span>
                    {
                        <span style="color:#0000ff;">return</span> (<span style="color:#0000ff;">this</span>.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + <span style="color:#0000ff;">this</span>.Nombre).CompareTo(p.Apellidos + <span style="color:#006080;">&quot; &quot;</span> + p.Nombre);
                    }
                }
            }
            <span style="color:#0000ff;">catch</span> { <span style="color:#0000ff;">return</span> 0; }
        }
    }

}</pre>
</div>
<br />Posted in C#, NetFramework  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/150/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=150&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2009/09/19/c-personalizar-la-ordenador-de-listas-con-icomparable/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>
	</item>
		<item>
		<title>C# Mantener la configuraci&#243;n de tama&#241;o y posici&#243;n de los formularios</title>
		<link>http://alskare.wordpress.com/2009/09/15/c-mantener-la-configuracin-de-tamao-y-posicin-de-los-formularios/</link>
		<comments>http://alskare.wordpress.com/2009/09/15/c-mantener-la-configuracin-de-tamao-y-posicin-de-los-formularios/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 10:37:41 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Controles]]></category>
		<category><![CDATA[WinForms]]></category>

		<guid isPermaLink="false">http://alskare.wordpress.com/2009/09/15/c-mantener-la-configuracin-de-tamao-y-posicin-de-los-formularios/</guid>
		<description><![CDATA[No sería la primera vez que los clientes piden que, en los formularios WinForms, se guarde tanto la posición como el tamaño del formulario, incluso después de cerrar la aplicación. Bajo esta premisa, me inicio en un nuevo post que tiene como finalidad, precisamente esto, almacenar la información de tamaño del formulario y recuperarla cada [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=149&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>No sería la primera vez que los clientes piden que, en los formularios WinForms, se guarde tanto la posición como el tamaño del formulario, incluso después de cerrar la aplicación. Bajo esta premisa, me inicio en un nuevo post que tiene como finalidad, precisamente esto, almacenar la información de tamaño del formulario y recuperarla cada vez que se abra de nuevo el mismo formulario.</p>
<p>Framework.Net nos ofrece una serie de posibilidades amplias para poder guardar información en el área de trabajo del usuario. Una de estas opciones es el namespace System.XML, el cual nos permite poder trabajar con ficheros XML, tanto a nivel de lectura como de escritura. Aprovechando estas características, se me ocurre la creación de un fichero en el que poder almacenar los datos de tamaño y posición del formulario. Ahora bien, el problema de una aplicación es la cantidad de formularios existentes, así que empiezo a pensar en un fichero con una estructura similar a la siguiente:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">&lt;?</span><span style="color:#800000;">xml</span> <span style="color:#ff0000;">version</span><span style="color:#0000ff;">=&quot;1.0&quot;</span> <span style="color:#ff0000;">encoding</span><span style="color:#0000ff;">=&quot;utf-8&quot;</span>?<span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">Configuracion</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">NombreForm1</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">WindowState</span><span style="color:#0000ff;">&gt;</span>ValorWindowStateForm1<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">WindowState</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">Top</span><span style="color:#0000ff;">&gt;</span>ValorTopForm1<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">Top</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">Left</span><span style="color:#0000ff;">&gt;</span>ValorTopForm1<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">Left</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">Width</span><span style="color:#0000ff;">&gt;</span>ValorTopForm1<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">Width</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">Height</span><span style="color:#0000ff;">&gt;</span>ValorTopForm1<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">Height</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">NombreForm1</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">NombreForm2</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">WindowState</span><span style="color:#0000ff;">&gt;</span>ValorWindowStateForm2<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">WindowState</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">Top</span><span style="color:#0000ff;">&gt;</span>ValorTopForm2<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">Top</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">Left</span><span style="color:#0000ff;">&gt;</span>ValorTopForm2<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">Left</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">Width</span><span style="color:#0000ff;">&gt;</span>ValorTopForm2<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">Width</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">Height</span><span style="color:#0000ff;">&gt;</span>ValorTopForm2<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">Height</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">NombreForm2</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">Configuracion</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
<p>De esta manera, si los datos de cada formulario representa un nodo dentro del archivo XML, puede resultar más o menos sencilla la adaptación de la librería a cualquier otro valor.</p>
<p>Una vez está decidido cuál será el medio de almacenamiento, cabe comenzar a pensar en cómo se realizarán las operaciones de lectura y escritura sobre el fichero XML, así que, recordando las clases de Programación Orientada a Objeto, se me ocurre la idea de crear un formulario base del que heredarán todos aquellos formularios que necesiten almacenar dicha información. </p>
<p>Manos a la obra. Comenzamos creando un nuevo proyecto que será una <strong>Biblioteca de controles de WindowsForms</strong>, que contendrá un formulario denominado <strong>FormularioBase</strong>. Éste será un formulario estándar en el que primarán dos cosas:</p>
<ol>
<li>En el evento <strong>FormClosing</strong> se almacenarán los datos que interesen en el fichero de configuración </li>
<li>En el evento <strong>Load</strong> se recuperarán, <em>en caso de existir previamente</em>, los datos de configuración y se aplicarán al formulario </li>
</ol>
<h2></h2>
<p>Así, una vez creado el campo que contendrá el fichero de configuración,</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> ficheroXML = Path.Combine(Application.StartupPath, <span style="color:#006080;">&quot;ConfForm.xml&quot;</span>);</pre>
</div>
<p>nos ponemos a implementar el proceso de almacenamiento de los datos:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#008000;">/// &lt;summary&gt;</span>
 <span style="color:#008000;">/// Almacena la información del formulario actual en fichero XML</span>
 <span style="color:#008000;">/// &lt;/summary&gt;</span>
 <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">void</span> GuardaConfiguracionForm()
 {
     <span style="color:#0000ff;">string</span> nombreForm = <span style="color:#0000ff;">this</span>.Name;
     XmlNode nodoPrincipal;

     <span style="color:#0000ff;">try</span>
     {
         <span style="color:#008000;">// Intancia del documento XML que permitirá guardar la configuración</span>
         XmlDocument doc = <span style="color:#0000ff;">new</span> XmlDocument();

         <span style="color:#008000;">// Se comprueba que exista el fichero</span>
         <span style="color:#0000ff;">if</span> (!File.Exists(ficheroXML))
         {
             <span style="color:#008000;">// No existe el fichero. Se añaden los nodos iniciales</span>
             doc.AppendChild(doc.CreateComment(<span style="color:#006080;">&quot;Configuración de formularios - älskare, Sep/09&quot;</span>));

             <span style="color:#008000;">// Creación del nodo principal</span>
             nodoPrincipal = doc.CreateNode(XmlNodeType.Element, <span style="color:#006080;">&quot;Configuracion&quot;</span>, <span style="color:#0000ff;">null</span>);

             <span style="color:#008000;">// Se añade el nodo principal al documento</span>
             doc.AppendChild(nodoPrincipal);
         }
         <span style="color:#0000ff;">else</span>
         {
             <span style="color:#008000;">// El fichero existe previamente. Se recupera la información</span>
             doc.Load(ficheroXML);

             <span style="color:#008000;">// Lectura del nodo principal</span>
             nodoPrincipal = doc.SelectSingleNode(<span style="color:#006080;">&quot;Configuracion&quot;</span>);
         }

         <span style="color:#008000;">// Se comprueba si existe un nodo con el nombre del form actual</span>
         XmlNode nodoFormActual = nodoPrincipal.SelectSingleNode(nombreForm);
         <span style="color:#0000ff;">if</span> (nodoFormActual == <span style="color:#0000ff;">null</span>)
             nodoFormActual =
                   nodoPrincipal.AppendChild(
                     doc.CreateNode(XmlNodeType.Element, nombreForm, <span style="color:#0000ff;">null</span>));

         <span style="color:#008000;">// Almacenamiento de los valores</span>
         NodoValor(doc, nodoFormActual, <span style="color:#006080;">&quot;WindowState&quot;</span>, <span style="color:#0000ff;">this</span>.WindowState);
         NodoValor(doc, nodoFormActual, <span style="color:#006080;">&quot;Top&quot;</span>, <span style="color:#0000ff;">this</span>.Top);
         NodoValor(doc, nodoFormActual, <span style="color:#006080;">&quot;Left&quot;</span>, <span style="color:#0000ff;">this</span>.Left);
         NodoValor(doc, nodoFormActual, <span style="color:#006080;">&quot;Width&quot;</span>, <span style="color:#0000ff;">this</span>.Width);
         NodoValor(doc, nodoFormActual, <span style="color:#006080;">&quot;Height&quot;</span>, <span style="color:#0000ff;">this</span>.Height);

         <span style="color:#008000;">// Se guarda el fichero de configuración en disco</span>
         XmlTextWriter tw = <span style="color:#0000ff;">new</span> XmlTextWriter(ficheroXML, Encoding.UTF8);
         tw.Indentation = 4;
         tw.IndentChar = <span style="color:#006080;">&quot; &quot;</span>[0];
         tw.Formatting = Formatting.Indented;

         doc.Save(tw);
         doc = <span style="color:#0000ff;">null</span>;

         tw.Flush();
         tw.Close();
     }
     <span style="color:#0000ff;">catch</span> { }
 }

 <span style="color:#008000;">/// &lt;summary&gt;</span>
 <span style="color:#008000;">/// Crea un nuevo par clave-valor en el nodo actual en caso de que no exista</span>
 <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
 XmlNode NodoValor(XmlDocument doc, XmlNode nodoPadre, <span style="color:#0000ff;">string</span> Clave, Object Valor)
 {
     XmlNode nodoActual = nodoPadre.SelectSingleNode(Clave);
     <span style="color:#0000ff;">if</span> (nodoActual == <span style="color:#0000ff;">null</span>)
         nodoActual = nodoPadre.AppendChild(doc.CreateNode(XmlNodeType.Element, Clave, <span style="color:#0000ff;">null</span>));
     nodoActual.InnerText = Valor.ToString();
     <span style="color:#0000ff;">return</span> nodoActual;
 }</pre>
</div>
<p>&#160;</p>
<p>Una vez realizado el proceso de escritura del fichero, falta poder recuperarlo para aplicar los cambios en el formulario cuando se abra.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#008000;">/// &lt;summary&gt;</span>
<span style="color:#008000;">/// Realiza una lectura del fichero de configuración y aplica los cambios al form</span>
<span style="color:#008000;">/// &lt;/summary&gt;</span>
<span style="color:#0000ff;">private</span> <span style="color:#0000ff;">void</span> LecturaConfiguracionForm()
{
    <span style="color:#008000;">// No se controlan errores. En caso de existir cualquier error</span>
    <span style="color:#008000;">// no se modifica nada en el formulario actual</span>
    <span style="color:#0000ff;">try</span>
    {
        <span style="color:#0000ff;">string</span> nombreForm = <span style="color:#0000ff;">this</span>.Name;
        XmlDocument doc = <span style="color:#0000ff;">new</span> XmlDocument();
        doc.Load(ficheroXML);

        <span style="color:#008000;">// Lectura del nodo principal</span>
        XmlNode nodoPrincipal = doc.SelectSingleNode(<span style="color:#006080;">&quot;Configuracion&quot;</span>);

        <span style="color:#008000;">// Lectura del nodo del formulario actual</span>
        XmlNode nodoActual = nodoPrincipal.SelectSingleNode(nombreForm);

        <span style="color:#008000;">// Lectura del modo de presentación de la ventana</span>
        <span style="color:#0000ff;">this</span>.WindowState = (FormWindowState)Enum.Parse(<span style="color:#0000ff;">typeof</span>(FormWindowState), GetValor(nodoActual, <span style="color:#006080;">&quot;WindowState&quot;</span>).ToString(), <span style="color:#0000ff;">false</span>);

        <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">this</span>.WindowState == FormWindowState.Normal)
        {
            <span style="color:#0000ff;">this</span>.Top = Convert.ToInt32(GetValor(nodoActual, <span style="color:#006080;">&quot;Top&quot;</span>));
            <span style="color:#0000ff;">this</span>.Left = Convert.ToInt32(GetValor(nodoActual, <span style="color:#006080;">&quot;Left&quot;</span>));
            <span style="color:#0000ff;">this</span>.Width = Convert.ToInt32(GetValor(nodoActual, <span style="color:#006080;">&quot;Width&quot;</span>));
            <span style="color:#0000ff;">this</span>.Height = Convert.ToInt32(GetValor(nodoActual, <span style="color:#006080;">&quot;Height&quot;</span>));
        }
    }
    <span style="color:#0000ff;">catch</span> { }
}

<span style="color:#008000;">/// &lt;summary&gt;</span>
<span style="color:#008000;">/// Obtiene el valor de la clave</span>
<span style="color:#008000;">/// &lt;/summary&gt;</span>
<span style="color:#0000ff;">private</span> <span style="color:#0000ff;">object</span> GetValor(XmlNode nodoPadre, <span style="color:#0000ff;">string</span> clave)
{
    XmlNode valor = nodoPadre.SelectSingleNode(clave);
    <span style="color:#0000ff;">return</span> valor.LastChild.Value;
}</pre>
</div>
<p>Implementadas tanto la escritura como la lectura de los valores, quedará aplicar dichos cambios al formulario actual. En esta parte, debo reconocer que no he conseguido eliminar un efecto un tanto raro que se da al abrir el formulario, sobre todo, si el formulario a mostrar está contenido en otro en modo MDI. Seguiremos trabajando sobre el tema para ver si consigo eliminar dicho efecto antiestético.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> FormularioBase()
{
    <span style="color:#0000ff;">this</span>.SuspendLayout();
    InitializeComponent();
    <span style="color:#0000ff;">this</span>.ResumeLayout();

    <span style="color:#0000ff;">this</span>.Load += <span style="color:#0000ff;">new</span> EventHandler(FormularioBase_Load);
    <span style="color:#0000ff;">this</span>.FormClosing += <span style="color:#0000ff;">new</span> FormClosingEventHandler(FormularioBase_FormClosing);
}

<span style="color:#0000ff;">void</span> FormularioBase_Load(<span style="color:#0000ff;">object</span> sender, EventArgs e)
{
    LecturaConfiguracionForm();
}
<span style="color:#0000ff;">void</span> FormularioBase_FormClosing(<span style="color:#0000ff;">object</span> sender, FormClosingEventArgs e)
{
    GuardaConfiguracionForm();
}</pre>
</div>
<p>Bueno, pues ya está. A partir de ahora, cada vez que cree un nuevo WinForms, tan sólo añadiré una referencia a la librería en la que tengo este formulario base y, por supuesto, haré que cada formulario herede de FormularioBase.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">partial</span> <span style="color:#0000ff;">class</span> Form2 : jnSoftware.Utiles.FormularioBase
    {
        <span style="color:#0000ff;">public</span> Form2()
        {
            InitializeComponent();
        }
    }</pre>
</div>
<p>&#160;</p>
<p>Si le interesa a alguien, dejo enlace en el que se puede descargar un ejemplo de uso: <a href="http://www.velasco.biz/html/descargas/ConfiguracionFormularios.zip" target="_blank">descargar</a>.</p>
<br />Posted in C#, Controles, WinForms  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/149/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/149/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/149/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=149&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2009/09/15/c-mantener-la-configuracin-de-tamao-y-posicin-de-los-formularios/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>
	</item>
		<item>
		<title>Personalizar el HTMLEditor de AjaxControlToolkit</title>
		<link>http://alskare.wordpress.com/2009/09/10/personalizar-el-htmleditor-de-ajaxcontroltoolkit/</link>
		<comments>http://alskare.wordpress.com/2009/09/10/personalizar-el-htmleditor-de-ajaxcontroltoolkit/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 17:33:38 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Controles]]></category>

		<guid isPermaLink="false">http://alskare.wordpress.com/2009/09/10/personalizar-el-htmleditor-de-ajaxcontroltoolkit/</guid>
		<description><![CDATA[Primeros pasos Una de las novedades que nos ha traído el Ajax Control Toolkit (May 2009 Release) ha sido un editor HTML para nuestras páginas la mar de práctico. Hasta el momento, cada vez que he tenido que hacer uso de algún control similar con la finalidad de que el usuario pueda escribir negritas o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=148&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Primeros pasos</h2>
<p>Una de las novedades que nos ha traído el <a href="http://www.asp.net/ajax/AjaxControlToolkit/Samples/" target="_blank">Ajax Control Toolkit (May 2009 Release)</a> ha sido un editor HTML para nuestras páginas la mar de práctico. Hasta el momento, cada vez que he tenido que hacer uso de algún control similar con la finalidad de que el usuario pueda escribir negritas o subrayados, siempre he tenido que echar mano de algún componente externo. Debo reconocer que alguno de estos controles han sido realmente buenos y han cumplido a la perfección el objetivo. No obstante, al hacer uso de componentes de varios desarrolladores, llega un momento que el tamaño de la aplicación crece y, sobre todo, cualquier actualización se eterniza. Todo esto, sin contar con que cada control suele incluir sistemas propios de configuración (no será la primera vez que pierdo horas buscando dónde se indica un path para, por ejemplo, añadir una colección de botones propia).</p>
<p>Al ver por vez primera el HTMLEditor debo reconocer que me entusiasmé, puesto que veía la gran utilidad que tenía tener englobado el control con el resto de extensores que suelo usar a menudo. Propiedades y métodos más o menos conocidos, personalización de opciones…todo con una misma “filosofía”!!!!</p>
<p>Este entusiasmo inicial comenzó a decaer nada más empezar a utilizarlo (igual es que nos contagiamos de los clientes y cada día nos volvemos más exigentes). Y, por supuesto, nada más empezar a utilizarlo significa hacer uso de una estructura mínima para poder hacer uso del mismo</p>
<h3>Estructura básica para hacer uso del HTMLEditor</h3>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="background-color:#ffff00;">&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeFile=&quot;Default.aspx.cs&quot; Inherits=&quot;_Default&quot; %&gt;</span>
<span style="background-color:#ffff00;">&lt;%@ Register Assembly=&quot;AjaxControlToolkit&quot; Namespace=&quot;AjaxControlToolkit.HTMLEditor&quot;
    TagPrefix=&quot;AjaxCT&quot; %&gt;</span>

<span style="color:#0000ff;">&lt;!</span><span style="color:#800000;">DOCTYPE</span> <span style="color:#ff0000;">html</span> <span style="color:#ff0000;">PUBLIC</span> <span style="color:#0000ff;">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span style="color:#0000ff;">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">html</span> <span style="color:#ff0000;">xmlns</span><span style="color:#0000ff;">=&quot;http://www.w3.org/1999/xhtml&quot;</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">head</span> <span style="color:#ff0000;">runat</span><span style="color:#0000ff;">=&quot;server&quot;</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">title</span><span style="color:#0000ff;">&gt;</span>HTML Editor - Pruebas iniciales<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">title</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">style</span> <span style="color:#ff0000;">type</span><span style="color:#0000ff;">=&quot;text/css&quot;</span> <span style="color:#ff0000;">media</span><span style="color:#0000ff;">=&quot;all&quot;</span><span style="color:#0000ff;">&gt;</span>
        * {
            font-family: Arial, Helvetica, sans-serif;
        }
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">head</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">body</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">form</span> <span style="color:#ff0000;">id</span><span style="color:#0000ff;">=&quot;form1&quot;</span> <span style="color:#ff0000;">runat</span><span style="color:#0000ff;">=&quot;server&quot;</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">asp:ScriptManager</span> <span style="color:#ff0000;">ID</span><span style="color:#0000ff;">=&quot;sm&quot;</span> <span style="color:#ff0000;">runat</span><span style="color:#0000ff;">=&quot;server&quot;</span> <span style="color:#0000ff;">/&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">div</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">h1</span><span style="color:#0000ff;">&gt;</span>HTML Editor<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">h1</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">AjaxCT:Editor</span> <span style="color:#ff0000;">ID</span><span style="color:#0000ff;">=&quot;MiEditor&quot;</span> <span style="color:#ff0000;">runat</span><span style="color:#0000ff;">=&quot;server&quot;</span>  <span style="color:#0000ff;">/&gt;</span>
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">div</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">form</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">body</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">html</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
<p>Con este código conseguimos añadir un control HTMLEditor en una de nuestras páginas. Apreciamos que no se ha cambiado un ápice de la “estructura original”, es decir, que el resultado que obtendremos también será el de una estructura básica:</p>
<p><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://alskare.files.wordpress.com/2009/09/image1.png?w=644&#038;h=451" width="644" height="451" /> </p>
<h2></h2>
<h2>Primeros pasos y… Primeros problemas</h2>
<p>Una vez pasada la euforia inicial, cuando empezamos a aplicar el control en algún tipo de aplicación, comenzamos a apreciar que, en ocasiones, un control tan “extenso” puede llegar a ser demasiado para situaciones concretas. Por ejemplo, en ocasiones he contado con un espacio ínfimo para crear un control de este estilo y, en estos casos, hay que empezar a apurar botones (otra situación podría ser la de eliminar el tamaño de letra para evitar que los usuarios creen mensajes en los foros al estilo HOIGAN).</p>
<p>Así, de buenas a primeras, me marco dos objetivos iniciales:</p>
<ol>
<li>Aprender a personalizar el número de botones que aparecerán en las barras de herramientas del control </li>
<li>Aprender a mostrar/ocultar estas barras de herramientas en tiempo de diseño/ejecución. </li>
</ol>
<h2>Primeras soluciones</h2>
<p>Mirando un poco el explorador de objetos, veo que la clase AjaxControlToolkit.HTMLEditor.Editor contiene un par de métodos que me llaman la atención:</p>
<ul>
<li>FillTopToolbar </li>
<li>FillBottonToolbar. </li>
</ul>
<p>Así, en el ejemplo siguiente vamos a crear un editor que incluya, exclusivamente, los botones de formato estándar Negrita, Cursiva y Subrayado. Por tanto, empezaremos creando una nueva clase en la carpeta App_Code, la cual, heredará directamente del editor original.</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> AjaxControlToolkit.HTMLEditor;

<span style="color:#0000ff;">namespace</span> jnSoftware.WebControls
{
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> jnHTMLEditor : Editor
    {

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Método en el que se colocarán los elementos de la barra superior del control</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">protected</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">void</span> FillTopToolbar()
        {
            <span style="color:#008000;">// Botón de negrita</span>
            <span style="color:#0000ff;">this</span>.TopToolbar.Buttons.Add(
                <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.Bold());
            <span style="color:#008000;">// Botón de cursiva</span>
            <span style="color:#0000ff;">this</span>.TopToolbar.Buttons.Add(
                <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.Italic());
            <span style="color:#008000;">// Botón de subrayado</span>
            <span style="color:#0000ff;">this</span>.TopToolbar.Buttons.Add(
                <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.Underline());
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Método en el que se colocarán los elementos de la barra inferior del control</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">protected</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">void</span> FillBottomToolbar()
        {
            <span style="color:#008000;">// Vista Diseño</span>
            <span style="color:#0000ff;">this</span>.BottomToolbar.Buttons.Add(
                <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.DesignMode());
            <span style="color:#008000;">// Vista Previa</span>
            <span style="color:#0000ff;">this</span>.BottomToolbar.Buttons.Add(
                <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.PreviewMode());

            <span style="color:#008000;">// base.FillBottomToolbar();</span>
        }
    }
}</pre>
</div>
<p>A partir de aquí, ya vemos que podemos empezar a personalizar la barra de herramientas, tanto superior, como inferior. De hecho, gracias al IDE de VisualStudio es realmente sencillo y cómodo añadir el resto de botones deseados.</p>
<p><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://alskare.files.wordpress.com/2009/09/image2.png?w=644&#038;h=451" width="644" height="451" /> </p>
<p>&#160;</p>
<h3>Agregando propiedades</h3>
<p>En alguna que otra ocasión, he hecho uso de los editores de texto mostrando u ocultando las barras de herramientas, dependiendo del contexto. Así, como lo necesito para el editor, lo que hago es crear una propiedad que permita mostrar u ocultar las barras de herramientas:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> AjaxControlToolkit.HTMLEditor;

<span style="color:#0000ff;">namespace</span> jnSoftware.WebControls
{
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> jnHTMLEditor : Editor
    {

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Muestra u oculta la barra de herramientas superior</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">bool</span> ShowTopToolBar
        {
            get { <span style="color:#0000ff;">return</span> showTopToolBar; }
            set { showTopToolBar = <span style="color:#0000ff;">value</span>; }
        }
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">bool</span> showTopToolBar = <span style="color:#0000ff;">true</span> ;

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Muestra u oculta la barra de botones inferior</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">bool</span> ShowBottonToolbar
        {
            get { <span style="color:#0000ff;">return</span> showBottomToolbar; }
            set { showBottomToolbar = <span style="color:#0000ff;">value</span>; }
        }
        <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">bool</span> showBottomToolbar = <span style="color:#0000ff;">true</span>;

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Método en el que se colocarán los elementos de la barra superior del control</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">protected</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">void</span> FillTopToolbar()
        {
            <span style="color:#0000ff;">if</span> (showTopToolBar)
            {
                <span style="color:#008000;">// Botón de negrita</span>
                <span style="color:#0000ff;">this</span>.TopToolbar.Buttons.Add(
                    <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.Bold());
                <span style="color:#008000;">// Botón de cursiva</span>
                <span style="color:#0000ff;">this</span>.TopToolbar.Buttons.Add(
                    <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.Italic());
                <span style="color:#008000;">// Botón de subrayado</span>
                <span style="color:#0000ff;">this</span>.TopToolbar.Buttons.Add(
                    <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.Underline());
            }
        }

        <span style="color:#008000;">/// &lt;summary&gt;</span>
        <span style="color:#008000;">/// Método en el que se colocarán los elementos de la barra inferior del control</span>
        <span style="color:#008000;">/// &lt;/summary&gt;</span>
        <span style="color:#0000ff;">protected</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">void</span> FillBottomToolbar()
        {
            <span style="color:#0000ff;">if</span> (ShowBottonToolbar)
            {
                <span style="color:#008000;">// Vista Diseño</span>
                <span style="color:#0000ff;">this</span>.BottomToolbar.Buttons.Add(
                    <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.DesignMode());
                <span style="color:#008000;">// Vista Previa</span>
                <span style="color:#0000ff;">this</span>.BottomToolbar.Buttons.Add(
                    <span style="color:#0000ff;">new</span> AjaxControlToolkit.HTMLEditor.ToolbarButton.PreviewMode());
            }
        }
    }
}</pre>
</div>
<p>Una vez creada la clase, bastará con hacer alguna pequeña modificación en el fichero .ASPX para que se muestre el control creado:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="background-color:#ffff00;">&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeFile=&quot;Default.aspx.cs&quot; Inherits=&quot;_Default&quot; %&gt;</span>
<span style="background-color:#ffff00;">&lt;%@ Register Namespace=&quot;jnSoftware.WebControls&quot; TagPrefix=&quot;jnControles&quot; %&gt;</span>

<span style="color:#0000ff;">&lt;!</span><span style="color:#800000;">DOCTYPE</span> <span style="color:#ff0000;">html</span> <span style="color:#ff0000;">PUBLIC</span> <span style="color:#0000ff;">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span style="color:#0000ff;">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">html</span> <span style="color:#ff0000;">xmlns</span><span style="color:#0000ff;">=&quot;http://www.w3.org/1999/xhtml&quot;</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">head</span> <span style="color:#ff0000;">runat</span><span style="color:#0000ff;">=&quot;server&quot;</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">title</span><span style="color:#0000ff;">&gt;</span>HTML Editor - Pruebas iniciales<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">title</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">style</span> <span style="color:#ff0000;">type</span><span style="color:#0000ff;">=&quot;text/css&quot;</span> <span style="color:#ff0000;">media</span><span style="color:#0000ff;">=&quot;all&quot;</span><span style="color:#0000ff;">&gt;</span>
        * {
            font-family: Arial, Helvetica, sans-serif;
        }
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">head</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">body</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">form</span> <span style="color:#ff0000;">id</span><span style="color:#0000ff;">=&quot;form1&quot;</span> <span style="color:#ff0000;">runat</span><span style="color:#0000ff;">=&quot;server&quot;</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">asp:ScriptManager</span> <span style="color:#ff0000;">ID</span><span style="color:#0000ff;">=&quot;sm&quot;</span> <span style="color:#ff0000;">runat</span><span style="color:#0000ff;">=&quot;server&quot;</span> <span style="color:#0000ff;">/&gt;</span>
    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">div</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">h1</span><span style="color:#0000ff;">&gt;</span>HTML Editor<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">h1</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">jnControles:jnHTMLEditor</span> <span style="color:#ff0000;">ID</span><span style="color:#0000ff;">=&quot;MiEditor&quot;</span> <span style="color:#ff0000;">runat</span><span style="color:#0000ff;">=&quot;server&quot;</span>  <span style="color:#0000ff;">/&gt;</span>
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">div</span><span style="color:#0000ff;">&gt;</span>
    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">form</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">body</span><span style="color:#0000ff;">&gt;</span>
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">html</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
<p>&#160;</p>
<p><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://alskare.files.wordpress.com/2009/09/image3.png?w=644&#038;h=379" width="644" height="379" /></p>
<br />Posted in ASP.Net, C#, Controles  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/148/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=148&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2009/09/10/personalizar-el-htmleditor-de-ajaxcontroltoolkit/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>

		<media:content url="http://alskare.files.wordpress.com/2009/09/image1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://alskare.files.wordpress.com/2009/09/image2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://alskare.files.wordpress.com/2009/09/image3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Validar N&#250;mero de IVA VIES</title>
		<link>http://alskare.wordpress.com/2009/09/07/validar-nmero-de-iva-vies/</link>
		<comments>http://alskare.wordpress.com/2009/09/07/validar-nmero-de-iva-vies/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 22:52:10 +0000</pubDate>
		<dc:creator>alskare</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Helpers]]></category>
		<category><![CDATA[WebServices]]></category>
		<category><![CDATA[WinForms]]></category>

		<guid isPermaLink="false">http://alskare.wordpress.com/2009/09/07/validar-nmero-de-iva-vies/</guid>
		<description><![CDATA[El otro día, hablando con la contable de la empresa, me comentó la posibilidad de añadir en las aplicaciones la validación de unos “NIF” un poco especiales. Digo un poco especiales porque en principio no se trata de un número de identificación sino más bien es un registro de aquellas empresas “legalizadas” para poder trabajar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=143&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>El otro día, hablando con la contable de la empresa, me comentó la posibilidad de añadir en las aplicaciones la validación de unos “NIF” un poco especiales. Digo un poco especiales porque en principio no se trata de un número de identificación sino más bien es un registro de aquellas empresas “legalizadas” para poder trabajar con IVAs a nivel intracomunitario. Digo <em>legalizada</em> entre comillas puesto que desconozco totalmente si el medio para entrar en esa base de datos se realiza automáticamente al trabajar con empresas intracomunitarias o hace falta algún tipo de registro especial.</p>
<p>Bueno, el caso es que mala validación podemos crear si el origen es una base de datos, así que no me queda más remedio que empezar a buscar y encuentro lo que andaba buscando en lo que creo que es la AEAT Europea: <a title="http://ec.europa.eu/taxation_customs/vies/lang.do?fromWhichPage=vieshome&amp;selectedLanguage=ES" href="http://ec.europa.eu/taxation_customs/vies/lang.do?fromWhichPage=vieshome&amp;selectedLanguage=ES">http://ec.europa.eu/taxation_customs/vies/lang.do?fromWhichPage=vieshome&amp;selectedLanguage=ES</a>.</p>
<p>Dentro de los servicios informáticos con los que he trabajado, quizás éste sea uno de los más originales. De hecho, no existe una base de datos centralizada. Se trata de bases de datos con un ámbito del país local que va “replicando” con el resto de países (igual me he pasado al escribir “replicando”). Por otro lado, resulta que no todos los países atienden las 24 horas del día (igual los ordenadores se van a tomar un café): <a title="http://ec.europa.eu/taxation_customs/vies/viesspec.do" href="http://ec.europa.eu/taxation_customs/vies/viesspec.do">http://ec.europa.eu/taxation_customs/vies/viesspec.do</a></p>
<p>Al fin y al cabo, somos programadores y nuestros <em>profes</em> siempre nos han enseñado que debemos desglosar un problema gordo en problemas más pequeños para poder afrontarlos con mayor destreza, así que eso voy a hacer en estos momentos. Imagino que al final pasará como ha ocurrido con otra entrada en el blog (<a href="http://alskare.wordpress.com/2009/07/21/validar-nif-nie-cif/">Validar NIF, NIE, CIF</a> ), que empezó con una pequeña validación y se ha ido ampliando y mejorando con el tiempo. Así, el objetivo inicial será el de comprobar si el NIF introducido es correcto o no, siempre según el servicio de <strong>Fiscalidad y Unión Aduanera</strong>.</p>
<p>La primera me la doy en la frente. Resulta que para solicitar la validez de un Número de IVA, necesitamos el código del país y… ¿cómo no?, no encuentro ningún servicio que devuelva los países aceptados, así que hay que hacer una lectura del código HTML de la página para poder tenerlos todos. Para poder trabajar con los países y poder ponerlos como origen de datos de los controles se me ocurre hacer lo más sencillo, una clase List&lt;T&gt;.</p>
<h2>Paises</h2>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> System;
<span style="color:#0000ff;">using</span> System.Collections.Generic;

<span style="color:#0000ff;">namespace</span> ValidacionVies
{
    <span style="color:#0000ff;">class</span> Pais : IComparable
    {
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> CodigoPais { get; set; }
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> NombrePais { get; set; }

        <span style="color:#0000ff;">public</span> Pais(<span style="color:#0000ff;">string</span> codigoPais, <span style="color:#0000ff;">string</span> pais)
        {
            <span style="color:#0000ff;">this</span>.CodigoPais = codigoPais;
            <span style="color:#0000ff;">this</span>.NombrePais  = pais;
        }

        <span style="color:#008000;">// Se implementa la interfaz IComparable para poder ordenar por el país </span>
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> CompareTo(<span style="color:#0000ff;">object</span> obj)
        {
            <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">this</span>.NombrePais.CompareTo(((Pais)obj).NombrePais);
        }
    }

    <span style="color:#0000ff;">class</span> Paises : List&lt;Pais&gt;
    {
        <span style="color:#0000ff;">public</span> Paises()
        {
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;AT&quot;</span>, <span style="color:#006080;">&quot;Austria&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;BE&quot;</span>, <span style="color:#006080;">&quot;Bélgica&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;BG&quot;</span>, <span style="color:#006080;">&quot;Bulgaria&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;CY&quot;</span>, <span style="color:#006080;">&quot;Chipre&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;CZ&quot;</span>, <span style="color:#006080;">&quot;Chequia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;DE&quot;</span>, <span style="color:#006080;">&quot;Alemania&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;DK&quot;</span>, <span style="color:#006080;">&quot;Dinamarca&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;EE&quot;</span>, <span style="color:#006080;">&quot;Estonia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;EL&quot;</span>, <span style="color:#006080;">&quot;Grecia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;ES&quot;</span>, <span style="color:#006080;">&quot;España&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;FI&quot;</span>, <span style="color:#006080;">&quot;Finlandia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;FR&quot;</span>, <span style="color:#006080;">&quot;Francia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;GB&quot;</span>, <span style="color:#006080;">&quot;Reino Unido&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;HU&quot;</span>, <span style="color:#006080;">&quot;Hungría&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;IE&quot;</span>, <span style="color:#006080;">&quot;Irlanda&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;IT&quot;</span>, <span style="color:#006080;">&quot;Italia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;LT&quot;</span>, <span style="color:#006080;">&quot;Lituania&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;LU&quot;</span>, <span style="color:#006080;">&quot;Luxemburgo&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;LV&quot;</span>, <span style="color:#006080;">&quot;Letonia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;MT&quot;</span>, <span style="color:#006080;">&quot;Malta&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;NL&quot;</span>, <span style="color:#006080;">&quot;Países Bajos&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;PL&quot;</span>, <span style="color:#006080;">&quot;Polonia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;PT&quot;</span>, <span style="color:#006080;">&quot;Portugal&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;RO&quot;</span>, <span style="color:#006080;">&quot;Rumania&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;SE&quot;</span>, <span style="color:#006080;">&quot;Suecia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;SI&quot;</span>, <span style="color:#006080;">&quot;Eslovenia&quot;</span>));
            <span style="color:#0000ff;">this</span>.Add(<span style="color:#0000ff;">new</span> Pais(<span style="color:#006080;">&quot;SK&quot;</span>, <span style="color:#006080;">&quot;Eslovaquia&quot;</span>));

            <span style="color:#0000ff;">this</span>.Sort();
        }
    }

}</pre>
</div>
<p>&#160;</p>
<p>El problema lo encontraré el día que haya que hacer alguna modificación, así que tomo nota de la mejora que podría hacerse creando un XML o un simple TXT para poder almacenar los países.</p>
<p>Una vez tenemos los países, conociendo los resultados que nos devuelve el WebService, es cuestión de empezar a preparar un entorno de interacción con el usuario:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">- <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">element</span> <span style="color:#ff0000;">name</span><span style="color:#0000ff;">=&quot;checkVatResponse&quot;</span><span style="color:#0000ff;">&gt;</span>
- <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">complexType</span><span style="color:#0000ff;">&gt;</span>
- <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">sequence</span><span style="color:#0000ff;">&gt;</span>
  <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">element</span> <span style="color:#ff0000;">name</span><span style="color:#0000ff;">=&quot;countryCode&quot;</span> <span style="color:#ff0000;">type</span><span style="color:#0000ff;">=&quot;xsd:string&quot;</span> <span style="color:#0000ff;">/&gt;</span>
  <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">element</span> <span style="color:#ff0000;">name</span><span style="color:#0000ff;">=&quot;vatNumber&quot;</span> <span style="color:#ff0000;">type</span><span style="color:#0000ff;">=&quot;xsd:string&quot;</span> <span style="color:#0000ff;">/&gt;</span>
  <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">element</span> <span style="color:#ff0000;">name</span><span style="color:#0000ff;">=&quot;requestDate&quot;</span> <span style="color:#ff0000;">type</span><span style="color:#0000ff;">=&quot;xsd:date&quot;</span> <span style="color:#0000ff;">/&gt;</span>
  <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">element</span> <span style="color:#ff0000;">name</span><span style="color:#0000ff;">=&quot;valid&quot;</span> <span style="color:#ff0000;">type</span><span style="color:#0000ff;">=&quot;xsd:boolean&quot;</span> <span style="color:#0000ff;">/&gt;</span>
  <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">element</span> <span style="color:#ff0000;">name</span><span style="color:#0000ff;">=&quot;name&quot;</span> <span style="color:#ff0000;">type</span><span style="color:#0000ff;">=&quot;xsd:string&quot;</span> <span style="color:#0000ff;">/&gt;</span>
  <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">element</span> <span style="color:#ff0000;">name</span><span style="color:#0000ff;">=&quot;address&quot;</span> <span style="color:#ff0000;">type</span><span style="color:#0000ff;">=&quot;xsd:string&quot;</span> <span style="color:#0000ff;">/&gt;</span>
  <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">sequence</span><span style="color:#0000ff;">&gt;</span>
  <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">complexType</span><span style="color:#0000ff;">&gt;</span>
  <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">element</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
<p>Como que me hace gracia jugar un poco con las llamadas asíncronas al Web Service, opto por crear una aplicación WinForms que me permita realizar las primeras pruebas, así, me sale algo así como lo siguiente (ya dice mi jefe que lo mío no es el diseño):</p>
<p><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" border="0" alt="image" src="http://alskare.files.wordpress.com/2009/09/image.png?w=333&#038;h=326" width="333" height="326" /> </p>
<p>&#160;</p>
<p>De hecho, en el formulario no hay nada raro, un combo en el que se cargan los países (<strong>cboPaises</strong>), un textBox en el que deberá teclearse el número a validar (<strong>txtVatNumber</strong>) y los textBox de resultado (<strong>rstXXXX</strong>).</p>
<p>Al lío:</p>
<h2>Código del formulario</h2>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;font-size:8pt;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">using</span> System;
<span style="color:#0000ff;">using</span> System.Windows.Forms;
<span style="color:#0000ff;">using</span> ValidacionVies.eu.europa.ec;

<span style="color:#0000ff;">namespace</span> ValidacionVies
{
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">partial</span> <span style="color:#0000ff;">class</span> Form1 : Form
    {
        checkVatService cvs;

        <span style="color:#0000ff;">public</span> Form1()
        {
            InitializeComponent();

            <span style="color:#008000;">// Asignación de eventos</span>
            <span style="color:#0000ff;">this</span>.Load += <span style="color:#0000ff;">new</span> EventHandler(Form1_Load);
            <span style="color:#0000ff;">this</span>.cmdValida.Click += <span style="color:#0000ff;">new</span> EventHandler(cmdValida_Click);
        }

        <span style="color:#0000ff;">void</span> Form1_Load(<span style="color:#0000ff;">object</span> sender, EventArgs e)
        {
            lblProgreso.Text = <span style="color:#0000ff;">string</span>.Empty;

            <span style="color:#008000;">// Carga de paises y asignación al combo</span>
            Paises paises = <span style="color:#0000ff;">new</span> Paises();
            cboPaises.DataSource = paises;
            cboPaises.DisplayMember = <span style="color:#006080;">&quot;NombrePais&quot;</span>;
            cboPaises.ValueMember = <span style="color:#006080;">&quot;CodigoPais&quot;</span>;
            cboPaises.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            cboPaises.AutoCompleteSource = AutoCompleteSource.ListItems;

            <span style="color:#008000;">// Asignación del evento IndexChanged para el combo.</span>
            cboPaises.SelectedIndexChanged += <span style="color:#0000ff;">new</span> EventHandler(cboPaises_SelectedIndexChanged);
            txtCountryCode.Text = cboPaises.SelectedValue.ToString();
        }

        <span style="color:#0000ff;">void</span> cboPaises_SelectedIndexChanged(<span style="color:#0000ff;">object</span> sender, EventArgs e)
        {
            ComboBox cbo = (ComboBox)sender;
            txtCountryCode.Text = cbo.SelectedValue.ToString();
        }

        <span style="color:#0000ff;">void</span> cmdValida_Click(<span style="color:#0000ff;">object</span> sender, EventArgs e)
        {
            lblProgreso.Text = <span style="color:#006080;">&quot;Consultando&quot;</span>;

            <span style="color:#008000;">// Llamada asíncrona al WebService</span>
            cvs = <span style="color:#0000ff;">new</span> checkVatService();
            cvs.checkVatCompleted += <span style="color:#0000ff;">new</span> checkVatCompletedEventHandler(cvs_checkVatCompleted);
            cvs.checkVatAsync(txtCountryCode.Text, txtVatNumber.Text);
        }

        <span style="color:#0000ff;">void</span> cvs_checkVatCompleted(<span style="color:#0000ff;">object</span> sender, checkVatCompletedEventArgs e)
        {
            <span style="color:#008000;">// Respuesta de la llamada asíncrona al WebService</span>
            <span style="color:#0000ff;">try</span>
            {
                <span style="color:#0000ff;">if</span> (!e.Cancelled)
                {
                    lblProgreso.Text = <span style="color:#0000ff;">string</span>.Empty;
                    rstAddress.Text = e.address;
                    rstCountryCode.Text = e.countryCode;
                    rstName.Text = e.name;
                    rstResult.Text = e.Result.ToShortDateString();
                    rstCorrecto.Text = e.valid ? <span style="color:#006080;">&quot;Sí&quot;</span> : <span style="color:#006080;">&quot;No&quot;</span>;
                }
                <span style="color:#0000ff;">else</span>
                {
                    lblProgreso.Text = <span style="color:#0000ff;">string</span>.Empty;
                    rstAddress.Text = <span style="color:#0000ff;">string</span>.Empty;
                    rstCountryCode.Text = <span style="color:#0000ff;">string</span>.Empty;
                    rstName.Text = <span style="color:#0000ff;">string</span>.Empty;
                    rstResult.Text = <span style="color:#0000ff;">string</span>.Empty;
                    rstCorrecto.Text = <span style="color:#0000ff;">string</span>.Empty;
                }
            }
            <span style="color:#0000ff;">catch</span> (System.Reflection.TargetInvocationException ex)
            {
                lblProgreso.Text = ex.Message;
            }
            <span style="color:#0000ff;">catch</span> (Exception ex)
            {
                lblProgreso.Text = <span style="color:#006080;">&quot;Se ha producido un error &quot;</span> + ex.GetType().ToString();

            }
        }
    }
}</pre>
</div>
<p>Ya está. ¡Qué bonitas se ven las cosas cuando están acabadas!</p>
<p>Por cierto, se si alguien tiene interés, puede descargar el proyecto en VisualStudio2008: <a href="http://www.velasco.biz/html/descargas/ValidacionVies.zip" target="_blank">Descargar</a></p>
<br />Posted in C#, Helpers, WebServices, WinForms  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alskare.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alskare.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alskare.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alskare.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/alskare.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/alskare.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/alskare.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/alskare.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alskare.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alskare.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alskare.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alskare.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alskare.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alskare.wordpress.com/143/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alskare.wordpress.com&amp;blog=5998682&amp;post=143&amp;subd=alskare&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://alskare.wordpress.com/2009/09/07/validar-nmero-de-iva-vies/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/142e13e5c117080448d003536dd8a6cb?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">alskare</media:title>
		</media:content>

		<media:content url="http://alskare.files.wordpress.com/2009/09/image.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
	</channel>
</rss>
