<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>El Blog de Albert Mata</title>
	
	<link>http://www.albertmata.net</link>
	<description>// apuntes de análisis y programación en mi día a día como desarrollador de software</description>
	<pubDate>Mon, 05 Jan 2009 09:58:28 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ElBlogDeAlbertMata" type="application/rss+xml" /><item>
		<title>Estadística de visitas (200812).</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/503242949/</link>
		<comments>http://www.albertmata.net/2009/01/estadistica-de-visitas-200812/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 09:58:28 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[Off-topic]]></category>

		<category><![CDATA[905]]></category>

		<category><![CDATA[blog]]></category>

		<category><![CDATA[estadísticas]]></category>

		<category><![CDATA[estafa]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[google analytics]]></category>

		<category><![CDATA[menéame]]></category>

		<category><![CDATA[telecinco]]></category>

		<category><![CDATA[visitas]]></category>

		<guid isPermaLink="false">http://www.albertmata.net/?p=185</guid>
		<description><![CDATA[Aquí están como cada mes las estadísticas de visitas del mes cerrado. Este diciembre el ritmo de publicación ha sido más alto -aunque con varios artículos no técnicos, el blog se está convirtiendo en algo mixto reflejando, supongo, lo que son mis propios intereses-. De todos modos las estadísticas este mes son poco representativas porque [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-52" title="googleanalytics" src="http://www.albertmata.net/public/uploads/2008/07/googleanalytics.jpg" alt="" width="328" height="120" />Aquí están como cada mes las estadísticas de visitas del mes cerrado. Este diciembre el ritmo de publicación ha sido más alto -aunque con varios artículos no técnicos, el blog se está convirtiendo en algo mixto reflejando, supongo, lo que son mis propios intereses-. De todos modos las estadísticas este mes son poco representativas porque incluyen un efecto <a href="http://meneame.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/meneame.net');" target="_blank">menéame</a> gracias a que <a href="http://cambrico.net" onclick="javascript:pageTracker._trackPageview('/outbound/article/cambrico.net');" target="_blank">Pedro</a> tuvo  la bondad de enviar ahí el post <a href="http://www.albertmata.net/2008/12/telecinco-estafa-por-navidad-y-el-resto-de-cadenas-hacen-lo-mismo/"  target="_blank">Telecinco estafa por navidad (y el resto de cadenas hacen lo mismo)</a> y a que los usuarios lo encontraron interesante subiéndolo a portada&#8230;</p>
<p><img src="http://www.albertmata.net/public/uploads/2009/01/meneame1.png" alt="" title="meneame1" width="490" height="185" class="alignnone size-full wp-image-186" /></p>
<p>&#8230;poniéndolo entre las noticias más populares de las últimas 24 horas (también 48 horas y semana)&#8230;</p>
<p><img src="http://www.albertmata.net/public/uploads/2009/01/meneame2.png" alt="" title="meneame2" width="490" height="196" class="alignnone size-full wp-image-187" /></p>
<p>&#8230;y situando este blog como uno de los sitios más votados en cierto momento&#8230;</p>
<p><img src="http://www.albertmata.net/public/uploads/2009/01/meneame3.png" alt="" title="meneame3" width="258" height="284" class="aligncenter size-full wp-image-188" /></p>
<p>&#8230;cosa que me sorprendió gratamente. De todos modos tengo claro que el éxito del artículo no se debe a mis méritos, sino a lo indignada que está la gente con la temática del post en cuestión. A este respecto debo decir que estoy preparando una segunda parte con más evidencias de hasta qué punto llega a ser una estafa lo de los concursos 905 y que voy a mover el tema en organismos varios a ver si se consigue terminar con esta lacra (o al menos comenzar a terminar).</p>
<p>Pero bueno, estas han sido las estadísticas del mes.</p>
<div class="subtitle">Diciembre 2008.</div>
<p><img class="alignnone size-full wp-image-83" title="200812" src="http://www.albertmata.net/public/uploads/2009/01/200812.jpg" alt="" width="490" height="120" /></p>
<div class="code">N&#250;mero&#160;de&#160;visitas&#160;totales&#58;&#160;&#160;&#160;&#160;&#160;&#160;&#160;9899&#160;&#160;&#160;&#160;&#160;&#40;&#43;&#160;281&#44;14&#37;&#41;<br />
P&#225;ginas&#160;individuales&#160;vistas&#58;&#160;&#160;&#160;&#160;&#160;11873&#160;&#160;&#160;&#160;&#40;&#43;&#160;273&#44;07&#37;&#41;<br />
Promedio&#160;de&#160;tiempo&#160;en&#160;el&#160;sitio&#58;&#160;&#160;00&#58;01&#58;18&#160;&#40;&#43;&#160;&#160;30&#44;00&#37;&#41;<br />
Porcentaje&#160;de&#160;rebote&#58;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;88&#44;43&#37;&#160;&#160;&#160;&#40;&#43;&#160;&#160;&#160;2&#44;55&#37;&#41;<br />
Porcentaje&#160;de&#160;visitas&#160;nuevas&#58;&#160;&#160;&#160;&#160;92&#44;26&#37;&#160;&#160;&#160;&#40;&#43;&#160;&#160;&#160;5&#44;52&#37;&#41;</div>
<p>El día con más visitas del mes ha sido el 28 de diciembre con un total de 3.445. Evidentemente los porcentajes de crecimiento son brutales, como lo serán los de decrecimiento el mes que viene&#8230; <img src='http://www.albertmata.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Y los tres posts que durante el mes han sido más visitados son estos (el primero es evidente):</p>
<p>1. <a href="http://www.albertmata.net/2008/12/telecinco-estafa-por-navidad-y-el-resto-de-cadenas-hacen-lo-mismo/"  target="_blank">Telecinco estafa por navidad (y el resto de cadenas hacen lo mismo)</a> (59,33%)<br />
2. <a href="http://www.albertmata.net/2008/07/informe-en-net-con-crystal-reports-y-base-de-datos-mysql/"  target="_blank">Informe en .NET con Crystal Reports y base de datos MySQL.</a> (2,99%)<br />
3. <a href="http://www.albertmata.net/2008/10/pasando-parametros-al-informe-en-net-con-crystal-reports/"  target="_blank">Pasando parámetros al informe en .NET con Crystal Reports.</a> (2,52%)</p>
<p>Insisto que el efecto menéame ha sido bastante acusado y tergiversa tanto las cifras como el gráfico. Y eso que ha sido en plenas vacaciones navideñas y además en fin de semana. Pero si sirve de algo, genial. Por lo pronto, ya ha habido un conocido político catalán con el que he contactado que se ha tomado la molestia de leerse el artículo y contestarme de manera positiva. Espero poder seguir informando sobre este tema.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~4/503242949" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.albertmata.net/2009/01/estadistica-de-visitas-200812/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.albertmata.net/2009/01/estadistica-de-visitas-200812/</feedburner:origLink></item>
		<item>
		<title>Nuevo proyecto fotográfico ‘365 photos a year’.</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/499277187/</link>
		<comments>http://www.albertmata.net/2008/12/nuevo-proyecto-fotografico-365-photos-a-year/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 08:00:57 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[Off-topic]]></category>

		<category><![CDATA[Páginas web]]></category>

		<category><![CDATA[2009]]></category>

		<category><![CDATA[365 photos a year]]></category>

		<category><![CDATA[blog]]></category>

		<category><![CDATA[photoblog]]></category>

		<guid isPermaLink="false">http://www.albertmata.net/?p=183</guid>
		<description><![CDATA[Lo admito. Soy de esos que cuando se va terminando el año suelen pensar en algunos buenos propósitos para el que empieza. Podría ser algo más precavido y pensar en ello unos días o semanas antes y con toda seguridad saldrían ideas más sensatas. Pero procastino hasta en esto y al final, claro, me salen [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.albertmata.net/public/uploads/2008/12/365.png" alt="" title="365" width="297" height="266" class="alignleft size-full wp-image-184" />Lo admito. Soy de esos que cuando se va terminando el año suelen pensar en algunos buenos propósitos para el que empieza. Podría ser algo más precavido y pensar en ello unos días o semanas antes y con toda seguridad saldrían ideas más sensatas. Pero procastino hasta en esto y al final, claro, me salen unos propósitos que no van más allá de mediados de enero -cuando llegan-. Pero este año no va a ser así. Este año no voy a incumplir mi lista de buenos propósitos porque no va a haber tal lista.</p>
<p>Solo un pequeño proyecto personal que verá la luz con la llegada del 2009 y que me ilusiona especialmente: &#8216;365 photos a year&#8217;. Se trata de un blog eminentemente fotográfico que inauguro mañana. La idea es bien simple: cada día una fotografía. Algunas pretenderán ser más artísticas. Otras serán de lo más cotidianas y no tendrán otra misión que la de mostrar en una imagen algo que me haya resultado interesante, o gracioso, o conmovedor, o lo que sea cada día. Por lo general la imagen que publique estará tomada ese mismo día, aunque me reservo la posibilidad de crear alguna categoría retrospectica para poder añadir imágenes provenientes de algún proyecto photoblog anterior que quedó en el olvido y que pronto pasará a mejor vida (léase <a href="http://www.pijus.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.pijus.com');" target="_blank">www.pijus.com</a>) o de mi propio archivo fotográfico. Eso sí, las imágenes estarán siempre tomadas por un servidor con mi propia cámara.</p>
<p>La frecuencia de posteo será diaria de media, pero no necesariamente habrá un post todos los días. Cabe la posibilidad de que en algunas ocasiones se acumulen algunas fotografías para cuando tenga unos minutos en que pasarlas de la cámara al portátil y subirlas al blog.</p>
<p>Ni que decir tiene que todo el contenido del proyecto &#8216;365 photos a year&#8217; está sujeto a una licencia <a href="http://es.creativecommons.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/es.creativecommons.org');" target="_blank">Creative Commons</a>, por lo que si en algún momento alguien encuentra alguna foto que le pueda servir para ilustrar algún post o lo que sea, podrá utilizarla sin problemas.</p>
<p>Y poco más queda por añadir. Simplemente que se trata de un proyecto que me ilusiona porque la fotografía me ha resultado apasionante desde que tuve mi primera (y actual) cámara digital y confío que con esta pequeña obligación autoimpuesta consiga dar más rienda suelta a una de mis principales aficiones. </p>
<p>La dirección web es la fácilmente deducible <a href="http://www.365photosayear.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.365photosayear.com');" target="_blank">www.365photosayear.com</a> (o <a href="http://www.365photosayear.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.365photosayear.net');" target="_blank">www.365photosayear.net</a>). Básicamente porque barajé varias alternativas para el nombre del proyecto y finalmente escogí la que más me gustaba de entre las que tenían los dominios .com y .net libres. Por supuesto tiene posibilidad de suscribirse vía RSS y en tanto que los posts serán una fotografía y un texto muy breve, no resultará demasiado intrusivo estar suscrito, así que os animo a ello.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~4/499277187" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.albertmata.net/2008/12/nuevo-proyecto-fotografico-365-photos-a-year/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.albertmata.net/2008/12/nuevo-proyecto-fotografico-365-photos-a-year/</feedburner:origLink></item>
		<item>
		<title>Telecinco estafa por navidad (y el resto de cadenas hacen lo mismo).</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/496442679/</link>
		<comments>http://www.albertmata.net/2008/12/telecinco-estafa-por-navidad-y-el-resto-de-cadenas-hacen-lo-mismo/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 17:35:57 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[Off-topic]]></category>

		<category><![CDATA[Quejas]]></category>

		<category><![CDATA[905]]></category>

		<category><![CDATA[905333222]]></category>

		<category><![CDATA[aquí se gana]]></category>

		<category><![CDATA[estafa]]></category>

		<category><![CDATA[hurto]]></category>

		<category><![CDATA[robo]]></category>

		<category><![CDATA[telecinco]]></category>

		<category><![CDATA[timo]]></category>

		<guid isPermaLink="false">http://www.albertmata.net/?p=170</guid>
		<description><![CDATA[Aviso a navegantes y lectores habituales varios: este post es largo y no tiene nada que ver ni con VisualBasic.NET ni con MySQL ni con nada técnico, así que tú decides si quedarte a leerlo. De hecho, si tuviera cuenta en Menéame este es el post que creo que me automenearía (aunque creo que uno [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-171" title="pirata" src="http://www.albertmata.net/public/uploads/2008/12/pirata.png" alt="" width="261" height="175" />Aviso a navegantes y lectores habituales varios: este post es largo y no tiene nada que ver ni con VisualBasic.NET ni con MySQL ni con nada técnico, así que tú decides si quedarte a leerlo. De hecho, si tuviera cuenta en <a href="http://meneame.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/meneame.net');" target="_blank">Menéame</a> este es el post que creo que me automenearía (aunque creo que uno mismo no puede menearse, pero es una manera de decirlo). Este es uno de los posts de queja que escribo con más indignación, es el post que me gustaría que mucha gente leyera a ver si con un gran eco se pudiera conseguir algo en contra de esta estafa. Pero en fin&#8230; entremos de lleno en el tema.</p>
<p>La noche del día de navidad me quedé, como de costumbre, dormido en el sofá y desperté a eso de las cuatro menos cuarto de la madrugada. Telecinco estaba emitiendo uno de esos programas basura de concursos con líneas 905. No suelo hacerles ni caso, pero en esta ocasión me hizo gracia lo farsante que llegaba a ser la presentadora. En la imagen siguiente podemos ver de qué trataba el concurso cuyo enunciado literal era &#8220;¡Suma todos los números que hay en la imagen!&#8221;:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-172 aligncenter" title="telecinco01" src="http://www.albertmata.net/public/uploads/2008/12/telecinco01.jpg" alt="" width="240" height="178" /></p>
<p>O sea, que hay que sumar todos los números de la imagen. Bueno, están todos los números del 1 al 11 por duplicado, así que suman 132. Tal vez tengamos que sumar el 11 amarillo del título &#8220;11 Amiguitas&#8221; y entonces tenemos 143. Incluso puede que tengamos que sumar el 8 de &#8220;11 Ami8uitas&#8221; que sibilinamente ponen supongo que para crear confusión y poder jugar después con el resultado que les interese. Bueno, pues 151. A partir de aquí podemos considerar que quizá un 10 no es un 10 sino un 1 y un 0 (tendríamos que restar 9). Ídem con los 11. No sé, se pueden buscar trampas mil, pero a priori parecen resultados factibles el 132, el 143 y el 151.</p>
<p>Bueno, vamos a ver un plano general de lo que aparecía en pantalla para ir familiarizándonos con la presentadora:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-173 aligncenter" title="telecinco02" src="http://www.albertmata.net/public/uploads/2008/12/telecinco02.jpg" alt="" width="240" height="185" /></p>
<p>De paso podemos ver que en la parte inferior nos comentan que hay una vía de participación gratuita a partir de la página web de la productora www.accesogratuito.tv/aquisegana. Vamos a ver qué encontramos en dicha página (las capturas siguientes se pueden ver ampliadas clickando en ellas):</p>
<p style="text-align: center;"><a href="http://www.albertmata.net/public/uploads/2008/12/telecinco03.png"  target="_blank"><img class="alignnone size-medium wp-image-174 aligncenter" title="telecinco03" src="http://www.albertmata.net/public/uploads/2008/12/telecinco03-300x185.png" alt="" width="300" height="185" /></a></p>
<p>Este es el contenido íntegro de la página. Fascinante. Pero podemos entrar en una subpágina en la que el contenido es este otro:</p>
<p style="text-align: center;"><a href="http://www.albertmata.net/public/uploads/2008/12/telecinco04.png"  target="_blank"><img class="alignnone size-medium wp-image-175 aligncenter" title="telecinco04" src="http://www.albertmata.net/public/uploads/2008/12/telecinco04-299x167.png" alt="" width="299" height="167" /></a></p>
<p>Es decir, que nos dicen que podemos utilizar el acceso gratuito todos los días pero solo una vez por día. Y después nos preguntan tonterías varias y nos muestran un botón que, atención, no es tal botón. Es un cuadro de texto tal como se aprecia en la imagen siguiente:</p>
<p style="text-align: center;"><a href="http://www.albertmata.net/public/uploads/2008/12/telecinco05.png"  target="_blank"><img class="alignnone size-medium wp-image-176 aligncenter" title="telecinco05" src="http://www.albertmata.net/public/uploads/2008/12/telecinco05-300x100.png" alt="" width="300" height="100" /></a></p>
<p>No obstante se puede hacer click en dicho cuadro de texto. Imagino que con esta torpe artimaña persiguen que algunos ya no accedan al teléfono gratuito, pero el caso es que sí, se puede obtener un número 900:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-177 aligncenter" title="telecinco06" src="http://www.albertmata.net/public/uploads/2008/12/telecinco06.png" alt="" width="452" height="527" /></p>
<p>Pero solo podemos utilizarlo una vez por día. Este apartado está también recogido de una manera muy curiosa en las bases legales del concurso:</p>
<p><em>&#8220;OPCIÓN 2.- Accediendo gratuitamente a través de Internet en la página web www.accesogratuito.tv/aquisegana , donde se ofrece un número 900, al que el concursante podrá llamar accediendo gratuitamente al mismo sistema de selección de llamadas al que accedería si hubiera optado por llamar al 905. En este caso para evitar abusos y picaresca, los números 900 se irán cambiando de un programa a otro así como sólo se permitirá el uso por una sola persona o número de teléfono al día.&#8221;</em></p>
<p>Menuda desvergüenza. Para evitar abusos y picaresca solo permites participar una vez por día con el número 900. Sin embargo no hay abuso ni picaresca alguna en que estimules a los participantes a llamar infinitas veces a un número 905 cobrándoles en cada ocasión más de un euro. Es increíble. Imagino que lo de la participación gratuíta será por cumplir con algún requisito legal, no lo sé.</p>
<p>Pero ya que estamos con las bases legales, vamos a ver los mejores trozos del documento en formato .pdf disponible en la propia web antes mencionada:</p>
<p><em>&#8220;El espectador-concursante podrá ser elegido para participar en directo en el Concurso a través de las siguientes formas, a entera discreción del productor o del presentador:<br />
a) El simple hecho de llamar a través del número 905 o a través del 900 y escuchar la locución grabada de bienvenida o disuasión supone la participación del concursante en el Concurso. El concursante es consciente de que no necesariamente tiene que llegar a haber hablado en directo con el presentador para considerarse participante en el Concurso. No todos los concursantes logran ser seleccionados para acceder al plató y plantear la respuesta del juego al presentador.&#8221;</em></p>
<p>No todos lo logran. Qué eufemismo tan elegante. ¿Cuántos lo logran? ¿Un diez por ciento? ¿Un uno por ciento? ¿Un uno por mil? ¿Directamente un cero por mil?</p>
<p><em>&#8220;b) La selección de la llamada, y por tanto, futuro concursante en plató, se podrá realizar en cualquier momento que lo estime oportuno el productor en función de la reacción de la audiencia con el juego en cada momento.&#8221;</em></p>
<p>Manera elegante de decir&#8230; es mi cortijo y aquí se hace lo que a mí me da la gana sin ningún tipo de transparencia ni darle explicaciones a nadie.</p>
<p><em>&#8220;c) Durante el Concurso el &#8220;hot button&#8221; del sistema conectará en directo al plató a los llamantes que se encuentren en el sistema en el momento adecuado. El Concurso se representa como juego rápido, con el objetivo de que los llamantes tengan más oportunidad para entrar en directo y concursar. El llamante que encuentre la línea del plató abierta en el momento adecuado tendrá una oportunidad inmediata para concursar. En el caso de que no entre en directo en el momento adecuado, una locución automática le indicará que no ha logrado entrar en directo en el Concurso.&#8221;</em></p>
<p>Claro. Porque por supuesto no debe haber nada del estilo de que solo entren en antena llamadas que no sean del todo reales. Imagino, vamos, ya que eso no sería muy ético. No obstante se hace extraño que entren en antena llamadas que dicen que los números antes mostrados (que, recuerdo, podían sumar 132, 143 o 151) suman 444, 22, 3 (sí, tres) y cosas similares.</p>
<p><em>&#8220;Cualquier decisión tomada por la productora del Concurso respecto a las respuestas a las pruebas de habilidad o destreza, será inapelable.&#8221;</em></p>
<p>Naturalmente. Yo digo que esto es así y es así y punto. No se discute. No se demuestra. Mando yo. Se acabó. Ojo que este punto veremos más adelante que es importante&#8230;</p>
<p><em>&#8220;La organización podría decidir el no aceptar llamadas desde números que aparezcan ocultos o similares.&#8221;</em></p>
<p>No termino de ver la razón de esto. Quiero suponer que no tendrá nada que ver con evitar posibles inspecciones de cuerpos de seguridad. Ni idea. Este punto me despista, lo admito.</p>
<p>Bueno, después de haber repasado escuetamente las bases legales del concurso y de haber visto que puedo concursar mediante un número 900 pero solo una vez por día, volvemos a la dinámica del concurso. La presentadora asegura sobre las 4.00am que el concurso se va a terminar en diez minutos exactos y con tal fin muestran un reloj en pantalla. No serán diez minutos exactos como cacarea la chica, puesto que cada vez que entra una llamada detienen o resetean el contador según les place, pero el caso es que finalmente la cuenta atrás llega a su fin.</p>
<p>Pero no importa. Todavía no se ha estafado suficiente dinero a la audiencia, así que la presentadora finge saltarse las normas que le impone producción y decide volver a poner otro contador de otros diez minutos para que la gente tenga más oportunidades de ganar. ¡Que sigan las llamadas al 905333222!</p>
<p>Pasan los siguientes diez minutos y a partir de aquí comienzan con una retahíla de contadores de un minuto y medio. Primero uno, después otro, y otro, y otro&#8230; incontables. Sin ningún respeto por la audiencia. Reiniciándolos cuando les apetece. Llego a perder el control de lo que hacen con el tiempo.</p>
<p>Mientras tanto (son ya las 5.00am) la presentadora va soltando perlas del estilo de <em>&#8220;porque es navidad y esta navidad es mágica&#8221;</em> cuando suben el premio hasta los 8000 euros. La verdad es que a esta chica debería darle vergüenza dedicarse a esto. ¿Habrá estudiado periodismo o es solo una cara bonita (bueno, supuestamente)? ¿Le compensa hacer esto? ¿No le da vergüenza colaborar en estafar a la gente? ¿No se siente una ladrona? ¿No tiene remordimientos? ¿Cómo se puede tener tan poca integridad personal y profesional? La verdad es que a mí me merece infinitamente más respeto una chica que se dedique incluso a la prostitución que quien se presta a engañar y quitar el dinero a la gente incauta de esta manera&#8230; Pero cada cual decide, está claro.</p>
<p>Durante el programa ocurren cosas ante las que uno no sabe si reir o llorar. Algunos concursantes entran en antena más de una y de dos veces. Por ejemplo un tal Salvador o un tal Sito. A Salvador la presentadora ya le saluda con un <em>&#8220;buenas noches de nuevo Salvador, a ver si tienes más suerte esta vez&#8221;</em>. Si Salvador es realmente un concursante real es sin duda para llorar que el pobre esté siendo víctima de esta estafa. Si es un cebo, si no es un concursante real, es para reir (por no llorar).</p>
<p>Otra cosa curiosa es que a algunos concursantes ni se les entiende el número que dicen (yo al menos no). Pero la chica le dice directamente que no es correcto sin siquiera pedirle que repitan el número. Imagino que tendrá una capacidad auditiva fuera de lo común&#8230; Pero eso sí, después de decir su números, cuelgan ipsofacto las llamadas a todos los concursantes sin siquiera despedirse ni dar ocasión al concursante (perdón, al estafado) a decir nada. No fuera caso que alguno dijera algo fuera de tono.</p>
<p>La presentadora se decide a dar algunas pistas: la solución es un número impar, menor que 900 y mayor que 18. Gracias. Llama Rosario y dice que la solución es 340&#8230; a continuación otro concursante pronostica 131 y la presentadora le dice <em>&#8220;¡No! Pero mejor que el anterior porque me has dicho un número impar y esto me gusta&#8221;</em>. ¿En serio no le da vergüenza a la chica dedicarse a esto?</p>
<p>Vamos con el desenlace final. Recuerdo que se traba de sumar todos los números de la imagen inicial &#8220;11 Ami8uitas&#8221; y que los resultados plausibles eran 132, 143 o 151. Podían hacernos alguna jugarreta por ahí para colarnos algún otro resultado, y de hecho era evidente que iban a hacérnosla porque esos tres resultados ya los habían dicho algunos concursantes a los que les habían dicho que no era esa la cifra correcta.</p>
<p>Son las 05:12am. Recuerdo que llevan con esto desde antes de las 04:00am. Creí que sería lento pero no tanto, pardiez. Pero decido quedarme hasta las seis que es cuando en la programación de Telecinco dice que se termina este espacio. Y me quedo porque empiezo a tener dudas de si alguien se llevará el premio (no lo creo) y de si abrirán realmente el sobre. Espero que no tengan la poca vergüenza de terminar el programa sin abrir el sobre.</p>
<p>El caso es que anuncian que van a entrar en antena los últimos 5 concursantes. Y es curioso porque estaban entrando llamadas sin parar a un ritmo de una cada 5-10 segundos y es decir &#8220;cinco últimos concursantes&#8221; y ahora pasan minutos y minutos entre un concursante y otro.</p>
<p>A las 05:38am faltan dos concursantes&#8230;</p>
<p>A las 05:42am falta un último concursante&#8230;</p>
<p>A las 05:49am entra la última llamada&#8230;</p>
<p>Pero habrá otra reúltima llamada, decide la presentadora&#8230;</p>
<p>Y ahí me teníais a mí cámara en mano a las 6:00am. Dos horas y media después de que comenzara este concurso (bueno, fraude). Después de haber contado así a bote pronto más de 200 llamadas en antena (no quiero ni pensar cuántas no habrán entrado en antena y a cuánto habrá ascendido el importe que los televidentes se pueden haber dejado en este atraco a mano armada) sin que ninguna diera el resultado correcto (cosa que estadísticamente ya resulta cuanto menos complicado). Pero ahí estoy yo, decía, preparado con la cámara para no perderme el gran momento en que la presentadora abre el sobre y nos ilustra sobre cuál es la cifra correcta y de dónde sale dicha suma. Como prueba de que realmente estaba atento, algunas imágenes:</p>
<p><center><img class="alignnone size-full wp-image-178" title="telecinco20" src="http://www.albertmata.net/public/uploads/2008/12/telecinco20.jpg" alt="" width="240" height="179" />&nbsp;&nbsp;&nbsp;<img class="alignnone size-full wp-image-179" title="telecinco21" src="http://www.albertmata.net/public/uploads/2008/12/telecinco21.jpg" alt="" width="240" height="180" /><br />
<img class="alignnone size-full wp-image-181" title="telecinco23" src="http://www.albertmata.net/public/uploads/2008/12/telecinco23.jpg" alt="" width="240" height="180" />&nbsp;&nbsp;&nbsp;<img class="alignnone size-full wp-image-182" title="telecinco24" src="http://www.albertmata.net/public/uploads/2008/12/telecinco24.jpg" alt="" width="240" height="181" /></center></p>
<p>Pues bien. No tengo la imagen del resultado final&#8230; ¿Por qué? Porque después de haber estado todo el programa cacareando que la respuesta estaba en ese sobre azul con la palabra &#8220;SOLUCIÓN&#8221; escrita delante, la presentadora ha tenido la poca vergüenza de abrir el sobre, sacar una hoja de papel con el resultado escrito, mostrarlo un brevísimo (creedme, brevísimo) espacio de tiempo en pantalla, ni siquiera decirlo en voz alta e inmediatamente apartarlo de la cámara. Insisto: no ha dicho el resultado. Solo lo ha mostrado durante unas décimas de segundo. Tan breve que ni siquiera he tenido tiempo de sacarle la foto. La última de las fotos anteriores es la que pretendía capturar ese momento, pero en ella ya no aparece el papel con el resultado. Se ve solo a la presentadora en una actitud que parece reflejar lo que todo el concurso es en realidad: una gran mofa. Fijaos en la actitud de la chica, en serio, solo le falta un &#8220;jojojo que tontos sois&#8221;.</p>
<p>¿Y el resultado era&#8230;? Sí, lo tengo. Afortunadamente soy más rápido que mi cámara. Sujetaos bien&#8230; el resultado era 517. Me niego a intentar hacer combinaciones extrañísimas con los números de la imagen&#8230;</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-172 aligncenter" title="telecinco01" src="http://www.albertmata.net/public/uploads/2008/12/telecinco01.jpg" alt="" width="240" height="178" /></p>
<p>&#8230;para que terminen sumando 517. Probablemente no exista dicha combinación, no lo sé. En cualquier caso es un timo descarado. He buscado el video en Youtube pero no lo he encontrado (lástima, <a href="http://www.enriquedans.com/2008/08/mis-impresiones-del-caso-telecinco-contra-youtube.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.enriquedans.com');" target="_blank">¿quizá por esto Vasile no quiere nada de Telecinco subido a YouTube?</a> <a href="http://www.enriquedans.com/2008/11/perdiste-vasile.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.enriquedans.com');" target="_blank">¿para que no resulten evidentes las estafas a las que se somete a la audiencia?</a>). Pero no creo que para un juez fuera complicado conseguir una cinta con la copia del programa solicitándosela a Telecinco o a la empresa productora del programa. ¿Por qué ningún juez lo hará? ¿Por qué no se persigue esta estafa?</p>
<p>En este punto es bueno recordar algún punto de las bases que rezaba:</p>
<p><em>&#8220;Cualquier decisión tomada por la productora del Concurso respecto a las respuestas a las pruebas de habilidad o destreza, será inapelable.&#8221;</em></p>
<p>Pues nada, la productora decide que la respuesta a la pregunta es 517 y se acabó. Es inapelable. Y falso. Pero inapelable.</p>
<p>Insisto una vez más: abrió el sobre, mostró el papel durante solo un instante, no lo leyó y despidió el programa en cosa de dos o tres segundos cortando inmediatamente la emisión y pasando Telecinco a emitir el siguiente programa.</p>
<p>¿Por qué permite el gobierno esta estafa a los ciudadanos más incautos? ¿Por qué esta tolerancia? ¿Tanto pesan las operadoras telefónicas y sus ingresos? ¿Tanto pesan los medios de comunicación y sus ingresos? ¿Mucha crisis pero se permite que un hatajo de piratas roben a los ciudadanos más crédulos cada noche en un montón de cadenas? ¿Es más importante seguir por ejemplo con la guerra del canon y tratar de piratas a todos los ciudadanos en lugar de perseguir y directamente no permitir actuar a los auténticos piratas de la televisión nocturna? En serio, que soliciten el video de este programa. Que comprueben el resultado que se da por solución oficial (517) y persigan a los que estafan de esta manera. ¿Por qué no lo hacen?</p>
<p>PD. Ignoro si el resto de televisiones autonómicas también estafan a sus espectadores o no, pero al menos me siento orgulloso de que TV3 nunca haya entrado en el juego de burlarse de sus televidentes de esta manera.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~4/496442679" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.albertmata.net/2008/12/telecinco-estafa-por-navidad-y-el-resto-de-cadenas-hacen-lo-mismo/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.albertmata.net/2008/12/telecinco-estafa-por-navidad-y-el-resto-de-cadenas-hacen-lo-mismo/</feedburner:origLink></item>
		<item>
		<title>Mobuzz versus Wikipedia.</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/495499113/</link>
		<comments>http://www.albertmata.net/2008/12/mobuzz-versus-wikipedia/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 10:59:17 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[Off-topic]]></category>

		<category><![CDATA[enrique dans]]></category>

		<category><![CDATA[mobuzz]]></category>

		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://www.albertmata.net/?p=168</guid>
		<description><![CDATA[Es curioso. Hace apenas mes y medio asistimos en España al triste espectáculo del cierre de Mobuzz. Y no digo triste porque me apenara que Mobuzz cerrara. No. En realidad no me apenó. Pero tampoco me alegró. Hasta entonces no conocía qué era Mobuzz y por tanto poco vínculo afectivo podía tener con ellos. Tampoco [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.albertmata.net/public/uploads/2008/12/mobuzz.png" alt="" title="mobuzz" width="240" height="213" class="alignleft size-full wp-image-169" />Es curioso. Hace apenas mes y medio asistimos en España al triste espectáculo del cierre de Mobuzz. Y no digo triste porque me apenara que Mobuzz cerrara. No. En realidad no me apenó. Pero tampoco me alegró. Hasta entonces no conocía qué era Mobuzz y por tanto poco vínculo afectivo podía tener con ellos. Tampoco me parecieron argumentos suficientes eso de que es una pena que una start-up española tenga que cerrar. Soy de los que pensó que su modelo de negocio no debía ser válido. En realidad tiendo a pensar que en el mundo de los negocios hay cosas que son dos más dos. Puedes tener un sistema analítico formado por mil ratios, pero en el fondo para saber si tu empresa va a mejor o a peor te basta con ver si estás facturando más o menos. Después hay muchos otros factores, sí, pero vamos&#8230; facturas más, bien, facturas menos, mal. Y en el caso de Mobuzz y por mucho que <a href="http://www.enriquedans.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.enriquedans.com');" target="_blank">Enrique Dans</a> opinara y asegurara lo contrario y pese a admitir que él podía conocer los números de Mobuzz y yo no, está claro que si tuvieron que cerrar es que su modelo de negocio no era el apropiado, bien sea por dimensionamiento, por coyuntura económica o por lo que sea.</p>
<p>No obstante, dije triste porque en el caso de Mobuzz pudimos ver en acción la más pura carroña ibérica. Y todo porque Mobuzz, antes de echar el cierre, pasó la gorra entre sus usuarios y les solicitó donaciones voluntarias para intentar subsistir. Repito, era voluntario. Yo mismo no doné un céntimo porque no me sentí nada involucrado con la causa. Pero tampoco me pareció mal que los que quisieran colaboraran. ¿Por qué iba a parecerme mal?</p>
<p>Pues a muchos les pareció la ocasión ideal para entrar a verter toda su bilis. Como ejemplo, los comentarios en el post del propio Enrique Dans <a href="http://www.enriquedans.com/2008/11/el-ultimo-show-de-mobuzz.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.enriquedans.com');" target="_blank">donde se hacía eco de la solicitud de Mobuzz</a>. Enrique tuvo que filtrar y eliminar cientos de comentarios terriblemente ofensivos, lo que dio lugar <a href="http://www.enriquedans.com/2008/11/sobre-el-cierre-de-mobuzz.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.enriquedans.com');" target="_blank">al siguiente post</a> y a que, de hecho, desde entonces los comentarios en su blog estén moderados a priori en lugar de a posteriori como ocurría hasta entonces. </p>
<p>Insisto. Yo mismo no simpaticé nada con esa iniciativa y no me causó la más mínima conmoción que Mobuzz cerrara. ¿No consiguieron hacer su negocio suficientemente rentable? Pues a otra cosa. Pero&#8230; ¿atacar tan salvajemente su iniciativa?</p>
<p>¿Qué ocurre entonces ahora con <a href="http://wikimediafoundation.org/wiki/Donate/Letter/es?utm_source=2008_jimmy_letter_r&#038;utm_medium=sitenotice&#038;utm_campaign=fundraiser2008#appeal" onclick="javascript:pageTracker._trackPageview('/outbound/article/wikimediafoundation.org');" target="_blank">Wikipedia y su solicitud de aportaciones por parte de su fundador Jimmy Wales</a>? ¿Puede Wikipedia solicitar aportaciones a sus usuarios y es una actitud comprensible -cuando no loable- pero no puede hacerlo Mobuzz -o tú, o yo-? ¿Por algún motivo concreto?</p>
<p>Me he ahorrado el añadir links a diestro y siniestro hacia muchos de los que criticaron abiertamente tanto la iniciativa de Mobuzz como el posicionamiento de los Enrique Dans, <a href="http://gallir.wordpress.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/gallir.wordpress.com');" target="_blank">Ricardo Galli</a>, <a href="http://martinvarsavsky.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/martinvarsavsky.org');" target="_blank">Martin Varsavsky</a> y compañía. Pero el que quiera es muy fácil encontrar dichos links tirando de Google. Y conste que algunos de estos nombres que enlazo y de los que se considera su entorno común no son para nada santos de mi devoción. En absoluto. Pero esta actitud tan de aquí de criticar por criticar, con maldad, por envidia, con un clarísimo doble rasero&#8230; nunca la entenderé.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~4/495499113" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.albertmata.net/2008/12/mobuzz-versus-wikipedia/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.albertmata.net/2008/12/mobuzz-versus-wikipedia/</feedburner:origLink></item>
		<item>
		<title>TextBox mejorado en .NET.</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/492855589/</link>
		<comments>http://www.albertmata.net/2008/12/textbox-mejorado-en-net/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 05:00:55 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Herramientas]]></category>

		<category><![CDATA[control personalizado]]></category>

		<category><![CDATA[dll]]></category>

		<category><![CDATA[double]]></category>

		<category><![CDATA[integer]]></category>

		<category><![CDATA[librería]]></category>

		<category><![CDATA[textbox]]></category>

		<guid isPermaLink="false">http://www.albertmata.net/?p=149</guid>
		<description><![CDATA[Cuando desarrollamos en .NET es habitual utilizar controles personalizados que mejoran los preexistentes. Habitualmente podremos hacer uso de librerías públicas que podemos obtener en internet (liberadas o de pago). Otras veces podremos crearnos nosotros mismos nuestras propias librerías de controles. Yo suelo hacer esto último cuando no se trata de algo demasiado complejo, ya que [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.albertmata.net/public/uploads/2008/12/textboxfocused.jpg" alt="" title="textboxfocused" width="245" height="244" class="alignleft size-full wp-image-150" />Cuando desarrollamos en .NET es habitual utilizar controles personalizados que mejoran los preexistentes. Habitualmente podremos hacer uso de librerías públicas que podemos obtener en internet (liberadas o de pago). Otras veces podremos crearnos nosotros mismos nuestras propias librerías de controles. Yo suelo hacer esto último cuando no se trata de algo demasiado complejo, ya que termino antes que buscando componentes de terceros y peleándome después con sus correspondientes licencias. Entre otras cosas porque cualquier tipo de licencia &#8220;share alike&#8221; no me sirve.</p>
<p>Uno de los controles que me ahorran mucho trabajo en la creación de formularios es este que presento hoy y que en su día llamé TextBoxFocused (en adelante TBF). Se trata de un TextBox que cambia de color al recibir y perder el foco (de ahí su nombre -por cierto, sé que debería ser FocusedTextBox, pero quería mantener lo de TextBox al inicio-) y permite controlar a priori y a posteriori qué se puede introducir en él.</p>
<p>Un formulario con algunos TBF se vería así:</p>
<p><img src="http://www.albertmata.net/public/uploads/2008/12/textboxfocused1.jpg" alt="" title="textboxfocused1" width="341" height="337" class="aligncenter size-full wp-image-151" /></p>
<p>Como se puede apreciar, sin tener que añadir código alguno al formulario, el TBF aparecerá sombreado cuando tenga el foco. Además cuando se esté introduciendo un texto se mostrará en rojo, y cuando ya esté validado quedará en verde, tal como se aprecia en las siguientes imágenes:</p>
<p><img src="http://www.albertmata.net/public/uploads/2008/12/textboxfocused2.jpg" alt="" title="textboxfocused2" class="aligncenter size-full wp-image-152" /></p>
<p><img src="http://www.albertmata.net/public/uploads/2008/12/textboxfocused3.jpg" alt="" title="textboxfocused3" width="344" height="339" class="aligncenter size-full wp-image-153" /></p>
<p>Nada realmente espectacular, pero queda bonito. Sin embargo en donde el TBF se muestra útil es en el control del contenido introducido. Este control se realiza de una doble manera: a priori y mediante una propiedad del control se establece qué tipo de introducciones se admitirán, a posteriori -si se ha seleccionado- se controla que lo que se ha introducido realmente fuera lo que se debía introducir, impidiendo abandonar el TBF en caso contrario.</p>
<p>Para ello, en la ventana de propiedades del control nos aparecen dos nuevas creadas para la ocasión, tal como se muestra a continuación:</p>
<p><img src="http://www.albertmata.net/public/uploads/2008/12/textboxfocused4.jpg" alt="" title="textboxfocused4" width="402" height="43" class="aligncenter size-full wp-image-154" /></p>
<p><img src="http://www.albertmata.net/public/uploads/2008/12/textboxfocused5.jpg" alt="" title="textboxfocused5" width="405" height="216" class="aligncenter size-full wp-image-155" /></p>
<p><img src="http://www.albertmata.net/public/uploads/2008/12/textboxfocused6.jpg" alt="" title="textboxfocused6" width="403" height="69" class="aligncenter size-full wp-image-156" /></p>
<p>En las propiedades de cosecha propia siempre añado el prefijo &#8220;am&#8221; para localizarlas todas juntas. En este caso amAllow permite fijar qué introducciones se permitirán (cualquier cosa, nada de nada, sólo enteros positivos, dobles negativos, etc.) y amPostVerification decide si se aplicará verificación posterior o no.</p>
<p>Esto de amPostVerification tiene un sentido claro. Y es que podemos decirle al control que admita números dobles negativos y así sólo permitirá introducir números, el signo negativo y el signo decimal. Pero es evidente que con esos caracteres se pueden crear expresiones que no se correspondan con un número doble negativo (p.ej. -30-3.8..-25). Con este control a posteriori verificamos que efectivamente lo sea.</p>
<p>A nivel de código el control a posteriori se podría haber implementado a base de cástings y control de errores, pero no ha sido la opción que he escogido. Queda al antojo de cada cual modificar el código como le plazca. </p>
<p>Para su implementación en una aplicación, basta con añadir una clase TextBoxFocused.vb, copiar todo el código que se adjunta a continuación, compilar la aplicación y a partir de entonces tendremos el control disponible para añadirlo en cualquier formulario. O también se puede <a href="http://www.albertmata.net/2008/06/crear-libreria-dll-en-net-%C2%A1y-utilizarla/"  target="_blank"> añadir a una librería de controles personalizados</a> (que es lo que hago yo) y mantenerlo un poquito más organizado.</p>
<p>Código completo (de libre uso como todo lo que aparece publicado en este blog):</p>
<div class="code">&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#39;&#160;Author&#58;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Albert&#160;Mata&#160;&#40;www&#46;albertmata&#46;net&#41;<br />
&#39;&#160;Last&#160;time&#160;modified&#58;&#160;2008&#45;11&#45;13<br />
&#39;&#160;Description&#58;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Acts&#160;like&#160;a&#160;standard&#160;TextBox&#160;but&#160;with&#160;some&#160;<br />
&#39;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;better&#160;features&#160;like&#160;changing&#160;color&#160;when&#160;gets&#160;<br />
&#39;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;or&#160;losts&#160;focus&#160;and&#160;controlling&#160;allowed&#160;<br />
&#39;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;introductions&#46;<br />
&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
Imports&#160;System&#46;Drawing</p>
<p>Public&#160;Class&#160;TextBoxFocused<br />
&#160;&#160;&#160;&#160;Inherits&#160;System&#46;Windows&#46;Forms&#46;TextBox</p>
<p>&#35;Region&#160;&#34;Constants&#34;</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Constants&#160;for&#160;colors&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;COLOR&#95;FOCUSED&#160;As&#160;Color&#160;&#61;&#160;Color&#46;FromArgb&#40;255&#44;&#160;240&#44;&#160;157&#41;<br />
&#160;&#160;&#160;&#160;Private&#160;COLOR&#95;NON&#95;FOCUSED&#160;As&#160;Color&#160;&#61;&#160;Color&#46;White<br />
&#160;&#160;&#160;&#160;Private&#160;COLOR&#95;VALIDATED&#160;As&#160;Color&#160;&#61;&#160;Color&#46;Green<br />
&#160;&#160;&#160;&#160;Private&#160;COLOR&#95;NON&#95;VALIDATED&#160;As&#160;Color&#160;&#61;&#160;Color&#46;Red</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Constants&#160;for&#160;special&#160;keys&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;ASC&#95;BACKSPACE&#160;As&#160;Integer&#160;&#61;&#160;8<br />
&#160;&#160;&#160;&#160;Private&#160;ASC&#95;SUPPRESS&#160;As&#160;Integer&#160;&#61;&#160;127<br />
&#160;&#160;&#160;&#160;Private&#160;ASC&#95;DASH&#160;As&#160;Integer&#160;&#61;&#160;45<br />
&#160;&#160;&#160;&#160;Private&#160;ASC&#95;COMMA&#160;As&#160;Integer&#160;&#61;&#160;44</p>
<p>&#35;End&#160;Region</p>
<p>&#35;Region&#160;&#34;Enumerations&#34;</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Enumerations&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Public&#160;Enum&#160;Introduction<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;NothingAtAll<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PositiveInteger<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;NegativeInteger<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PositiveDouble<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;NegativeDouble<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OnlyLetter<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OnlyLetterOrDigit<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Password<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Everything<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EverythingNonCasing<br />
&#160;&#160;&#160;&#160;End&#160;Enum</p>
<p>&#35;End&#160;Region</p>
<p>&#35;Region&#160;&#34;Attributes&#38;Properties&#34;</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Attributes&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;aAllow&#160;As&#160;Introduction&#160;&#61;&#160;Introduction&#46;Everything<br />
&#160;&#160;&#160;&#160;Private&#160;aPostVerification&#160;As&#160;Boolean&#160;&#61;&#160;True</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Public&#160;properties&#160;to&#160;be&#160;shown&#160;in&#160;design&#160;time&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Public&#160;Property&#160;amAllow&#40;&#41;&#160;As&#160;Introduction<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Get<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;Me&#46;aAllow<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;Get<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Set&#40;ByVal&#160;value&#160;As&#160;Introduction&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Me&#46;aAllow&#160;&#61;&#160;value<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;Set<br />
&#160;&#160;&#160;&#160;End&#160;Property<br />
&#160;&#160;&#160;&#160;Public&#160;Property&#160;amPostVerification&#40;&#41;&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Get<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;Me&#46;aPostVerification<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;Get<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Set&#40;ByVal&#160;value&#160;As&#160;Boolean&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Me&#46;aPostVerification&#160;&#61;&#160;value<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;Set<br />
&#160;&#160;&#160;&#160;End&#160;Property</p>
<p>&#35;End&#160;Region</p>
<p>&#35;Region&#160;&#34;GraphicalControls&#34;</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Event&#160;Me&#46;GotFocus&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Sub&#160;TextBoxFocused&#95;GotFocus&#40;ByVal&#160;sender&#160;As&#160;Object&#44;&#160;&#95;<br />
&#160;&#160;&#160;&#160;ByVal&#160;e&#160;As&#160;System&#46;EventArgs&#41;&#160;Handles&#160;Me&#46;GotFocus<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MyBase&#46;BackColor&#160;&#61;&#160;COLOR&#95;FOCUSED<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MyBase&#46;ForeColor&#160;&#61;&#160;COLOR&#95;NON&#95;VALIDATED<br />
&#160;&#160;&#160;&#160;End&#160;Sub</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Event&#160;Me&#46;LostFocus&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Sub&#160;TextBoxFocused&#95;LostFocus&#40;ByVal&#160;sender&#160;As&#160;Object&#44;&#160;&#95;<br />
&#160;&#160;&#160;&#160;ByVal&#160;e&#160;As&#160;System&#46;EventArgs&#41;&#160;Handles&#160;Me&#46;LostFocus<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Me&#46;CheckText&#40;&#41;&#160;Or&#160;Not&#160;Me&#46;aPostVerification&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MyBase&#46;BackColor&#160;&#61;&#160;COLOR&#95;NON&#95;FOCUSED<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MyBase&#46;ForeColor&#160;&#61;&#160;COLOR&#95;VALIDATED<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Me&#46;Focus&#40;&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;End&#160;Sub</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Event&#160;Me&#46;KeyPress&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Sub&#160;TextBoxFocused&#95;KeyPress&#40;ByVal&#160;sender&#160;As&#160;Object&#44;&#160;&#95;<br />
&#160;&#160;&#160;&#160;ByVal&#160;e&#160;As&#160;System&#46;Windows&#46;Forms&#46;KeyPressEventArgs&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;Handles&#160;Me&#46;KeyPress<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Select&#160;Case&#160;Me&#46;aAllow<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;NothingAtAll<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;no&#160;character&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;Handled&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#61;&#160;ASC&#95;BACKSPACE&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MyBase&#46;Text&#160;&#61;&#160;&#34;&#34;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;PositiveInteger<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;just&#160;digits&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;Char&#46;IsDigit&#40;e&#46;KeyChar&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;BACKSPACE&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;SUPPRESS&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;Handled&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;NegativeInteger<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;just&#160;digits&#160;and&#160;&#39;&#45;&#39;&#160;character&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;Char&#46;IsDigit&#40;e&#46;KeyChar&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;BACKSPACE&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;SUPPRESS&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;DASH&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;Handled&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;PositiveDouble<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;just&#160;digits&#160;and&#160;&#39;&#44;&#39;&#160;character&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;Char&#46;IsDigit&#40;e&#46;KeyChar&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;BACKSPACE&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;SUPPRESS&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;COMMA&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;Handled&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;NegativeDouble<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;just&#160;digits&#160;and&#160;&#39;&#45;&#39;&#160;and&#160;&#39;&#44;&#39;&#160;characters&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;Char&#46;IsDigit&#40;e&#46;KeyChar&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;BACKSPACE&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;SUPPRESS&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;DASH&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;COMMA&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;Handled&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;OnlyLetter<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;only&#160;letters&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;Char&#46;IsLetter&#40;e&#46;KeyChar&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;BACKSPACE&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;SUPPRESS&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;Handled&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;KeyChar&#160;&#61;&#160;Char&#46;ToUpper&#40;e&#46;KeyChar&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;OnlyLetterOrDigit<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;only&#160;letters&#160;and&#160;digits&#160;and&#160;upper&#160;casing&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;letters&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;Char&#46;IsLetterOrDigit&#40;e&#46;KeyChar&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;BACKSPACE&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;SUPPRESS&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;Handled&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;KeyChar&#160;&#61;&#160;Char&#46;ToUpper&#40;e&#46;KeyChar&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;Password<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;only&#160;letters&#160;and&#160;digits&#160;but&#160;not&#160;upper&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;casing&#160;letters&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;Char&#46;IsLetterOrDigit&#40;e&#46;KeyChar&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;BACKSPACE&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;AscW&#40;e&#46;KeyChar&#41;&#160;&#60;&#62;&#160;ASC&#95;SUPPRESS&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;Handled&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;Everything<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;everything&#160;upper&#160;casing&#160;letters&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e&#46;KeyChar&#160;&#61;&#160;Char&#46;ToUpper&#40;e&#46;KeyChar&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;EverythingNonCasing<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;everything&#160;not&#160;upper&#160;casing&#160;letters&#160;&#40;so&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;doing&#160;nothing&#41;&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;Select<br />
&#160;&#160;&#160;&#160;End&#160;Sub</p>
<p>&#35;End&#160;Region</p>
<p>&#35;Region&#160;&#34;PrivateMethods&#34;</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Checks&#160;introduced&#160;text&#160;according&#160;to&#160;Me&#46;amAllow&#160;property&#160;and&#160;<br />
&#160;&#160;&#160;&#160;&#39;&#160;returns&#160;True&#160;only&#160;when&#160;introduced&#160;text&#160;respects&#160;desired&#160;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Me&#46;amAllow&#160;property&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Function&#160;CheckText&#40;&#41;&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Select&#160;Case&#160;Me&#46;aAllow<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;NothingAtAll<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Checking&#160;no&#160;character&#160;has&#160;been&#160;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;Me&#46;Text&#160;&#61;&#160;&#34;&#34;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;PositiveInteger<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Checking&#160;a&#160;right&#160;positive&#160;integer&#160;has&#160;been&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;Me&#46;IsPositiveInteger&#40;Me&#46;Text&#41;&#160;Or&#160;Me&#46;Text&#160;&#61;&#160;&#34;&#34;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;NegativeInteger<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Checking&#160;a&#160;right&#160;negative&#160;integer&#160;has&#160;been&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;Me&#46;IsNegativeInteger&#40;Me&#46;Text&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Or&#160;Me&#46;IsPositiveInteger&#40;Me&#46;Text&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Or&#160;Me&#46;Text&#160;&#61;&#160;&#34;&#34;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;PositiveDouble<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Checking&#160;a&#160;right&#160;positive&#160;double&#160;has&#160;been&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;Me&#46;IsPositiveDouble&#40;Me&#46;Text&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Or&#160;Me&#46;IsPositiveInteger&#40;Me&#46;Text&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Or&#160;Me&#46;Text&#160;&#61;&#160;&#34;&#34;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;NegativeDouble<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Checking&#160;a&#160;right&#160;negative&#160;double&#160;has&#160;been&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;Me&#46;IsNegativeDouble&#40;Me&#46;Text&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Or&#160;Me&#46;IsPositiveDouble&#40;Me&#46;Text&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Or&#160;Me&#46;IsNegativeInteger&#40;Me&#46;Text&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Or&#160;Me&#46;IsPositiveInteger&#40;Me&#46;Text&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Or&#160;Me&#46;Text&#160;&#61;&#160;&#34;&#34;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;OnlyLetter<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Checking&#160;only&#160;letters&#160;have&#160;been&#160;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;Me&#46;HasOnlyLetters&#40;Me&#46;Text&#41;&#160;Or&#160;Me&#46;Text&#160;&#61;&#160;&#34;&#34;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;OnlyLetterOrDigit&#44;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Introduction&#46;Password<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;only&#160;letters&#160;and&#160;digits&#160;have&#160;been&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;Me&#46;HasOnlyLettersOrDigits&#40;Me&#46;Text&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Or&#160;Me&#46;Text&#160;&#61;&#160;&#34;&#34;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Case&#160;Introduction&#46;Everything&#44;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Introduction&#46;EverythingNonCasing<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Allowing&#160;everything&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;Select<br />
&#160;&#160;&#160;&#160;End&#160;Function</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Checks&#160;a&#160;right&#160;positive&#160;integer&#160;has&#160;been&#160;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Function&#160;IsPositiveInteger&#40;ByVal&#160;S&#160;As&#160;String&#41;&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;R&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;String&#46;IsNullOrEmpty&#40;S&#41;&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;IT&#160;As&#160;IEnumerator&#160;&#61;&#160;S&#46;GetEnumerator&#40;&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;C&#160;As&#160;Char<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;While&#160;IT&#46;MoveNext&#160;And&#160;R<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;C&#160;&#61;&#160;DirectCast&#40;IT&#46;Current&#44;&#160;Char&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;Char&#46;IsDigit&#40;C&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;While<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;False<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;R<br />
&#160;&#160;&#160;&#160;End&#160;Function</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Checks&#160;a&#160;right&#160;negative&#160;integer&#160;has&#160;been&#160;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Function&#160;IsNegativeInteger&#40;ByVal&#160;S&#160;As&#160;String&#41;&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;R&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;String&#46;IsNullOrEmpty&#40;S&#41;&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;IT&#160;As&#160;IEnumerator&#160;&#61;&#160;S&#46;GetEnumerator&#40;&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;C&#160;As&#160;Char<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;While&#160;IT&#46;MoveNext&#160;And&#160;R<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;C&#160;&#61;&#160;DirectCast&#40;IT&#46;Current&#44;&#160;Char&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;Char&#46;IsDigit&#40;C&#41;&#160;OrElse&#160;C&#160;&#61;&#160;ChrW&#40;ASC&#95;DASH&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;While<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;False<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Checking&#58;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;first&#160;character&#160;is&#160;a&#160;dash&#160;character&#44;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;length&#160;must&#160;be&#160;at&#160;least&#160;2&#160;characters&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;R&#160;And&#160;S&#46;LastIndexOf&#40;ChrW&#40;ASC&#95;DASH&#41;&#41;&#160;&#61;&#160;0&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;S&#46;Length&#160;&#62;&#61;&#160;2<br />
&#160;&#160;&#160;&#160;End&#160;Function</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Checks&#160;a&#160;right&#160;positive&#160;double&#160;has&#160;been&#160;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Function&#160;IsPositiveDouble&#40;ByVal&#160;S&#160;As&#160;String&#41;&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;R&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;String&#46;IsNullOrEmpty&#40;S&#41;&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;IT&#160;As&#160;IEnumerator&#160;&#61;&#160;S&#46;GetEnumerator&#40;&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;C&#160;As&#160;Char<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;While&#160;IT&#46;MoveNext&#160;And&#160;R<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;C&#160;&#61;&#160;DirectCast&#40;IT&#46;Current&#44;&#160;Char&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;Char&#46;IsDigit&#40;C&#41;&#160;OrElse&#160;C&#160;&#61;&#160;ChrW&#40;ASC&#95;COMMA&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;While<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;False<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Checking&#58;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;there&#39;s&#160;one&#160;comma&#160;character&#160;and&#160;it&#39;s&#160;not&#160;the&#160;first&#160;one&#44;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;there&#39;s&#160;exactly&#160;only&#160;one&#160;comma&#160;character&#44;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;the&#160;comma&#160;character&#160;it&#39;s&#160;not&#160;the&#160;last&#160;one&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;R&#160;And&#160;S&#46;IndexOf&#40;ChrW&#40;ASC&#95;COMMA&#41;&#41;&#160;&#62;&#160;0&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;S&#46;IndexOf&#40;ChrW&#40;ASC&#95;COMMA&#41;&#41;&#160;&#61;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;S&#46;LastIndexOf&#40;ChrW&#40;ASC&#95;COMMA&#41;&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;S&#46;LastIndexOf&#40;ChrW&#40;ASC&#95;COMMA&#41;&#41;&#160;&#60;&#160;S&#46;Length&#160;&#45;&#160;1<br />
&#160;&#160;&#160;&#160;End&#160;Function</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Checks&#160;a&#160;right&#160;negative&#160;double&#160;has&#160;been&#160;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Function&#160;IsNegativeDouble&#40;ByVal&#160;S&#160;As&#160;String&#41;&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;R&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;String&#46;IsNullOrEmpty&#40;S&#41;&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;IT&#160;As&#160;IEnumerator&#160;&#61;&#160;S&#46;GetEnumerator&#40;&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;C&#160;As&#160;Char<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;While&#160;IT&#46;MoveNext&#160;And&#160;R<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;C&#160;&#61;&#160;DirectCast&#40;IT&#46;Current&#44;&#160;Char&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;Char&#46;IsDigit&#40;C&#41;&#160;OrElse&#160;C&#160;&#61;&#160;ChrW&#40;ASC&#95;DASH&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OrElse&#160;C&#160;&#61;&#160;ChrW&#40;ASC&#95;COMMA&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;While<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;False<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Checking&#58;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;first&#160;character&#160;is&#160;a&#160;dash&#160;character&#44;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;length&#160;must&#160;be&#160;at&#160;least&#160;4&#160;characters&#44;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;there&#39;s&#160;one&#160;comma&#160;character&#160;and&#160;it&#39;s&#160;not&#160;the&#160;first&#160;or&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#160;&#160;second&#160;one&#160;&#40;&#45;0&#44;0&#41;&#44;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;there&#39;s&#160;exactly&#160;only&#160;one&#160;comma&#160;character&#44;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;&#160;&#160;&#45;&#160;the&#160;comma&#160;character&#160;it&#39;s&#160;not&#160;the&#160;last&#160;one&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;R&#160;And&#160;S&#46;LastIndexOf&#40;ChrW&#40;ASC&#95;DASH&#41;&#41;&#160;&#61;&#160;0&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;S&#46;Length&#160;&#62;&#61;&#160;4&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;S&#46;IndexOf&#40;ChrW&#40;ASC&#95;COMMA&#41;&#41;&#160;&#62;&#160;1&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;S&#46;IndexOf&#40;ChrW&#40;ASC&#95;COMMA&#41;&#41;&#160;&#61;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;S&#46;LastIndexOf&#40;ChrW&#40;ASC&#95;COMMA&#41;&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;And&#160;S&#46;LastIndexOf&#40;ChrW&#40;ASC&#95;COMMA&#41;&#41;&#160;&#60;&#160;S&#46;Length&#160;&#45;&#160;1<br />
&#160;&#160;&#160;&#160;End&#160;Function</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Checks&#160;only&#160;letters&#160;have&#160;been&#160;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Function&#160;HasOnlyLetters&#40;ByVal&#160;S&#160;As&#160;String&#41;&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;R&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;String&#46;IsNullOrEmpty&#40;S&#41;&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;IT&#160;As&#160;IEnumerator&#160;&#61;&#160;S&#46;GetEnumerator&#40;&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;C&#160;As&#160;Char<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;While&#160;IT&#46;MoveNext&#160;And&#160;R<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;C&#160;&#61;&#160;DirectCast&#40;IT&#46;Current&#44;&#160;Char&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;Char&#46;IsLetter&#40;C&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;While<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;False<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;R<br />
&#160;&#160;&#160;&#160;End&#160;Function</p>
<p>&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;&#39;&#160;Checks&#160;only&#160;letters&#160;and&#160;digits&#160;have&#160;been&#160;introduced&#46;<br />
&#160;&#160;&#160;&#160;&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#160;&#160;&#160;&#160;Private&#160;Function&#160;HasOnlyLettersOrDigits&#40;ByVal&#160;S&#160;As&#160;String&#41;&#160;&#95;<br />
&#160;&#160;&#160;&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;R&#160;As&#160;Boolean<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;Not&#160;String&#46;IsNullOrEmpty&#40;S&#41;&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;IT&#160;As&#160;IEnumerator&#160;&#61;&#160;S&#46;GetEnumerator&#40;&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dim&#160;C&#160;As&#160;Char<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;True<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;While&#160;IT&#46;MoveNext&#160;And&#160;R<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;C&#160;&#61;&#160;DirectCast&#40;IT&#46;Current&#44;&#160;Char&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;Char&#46;IsLetterOrDigit&#40;C&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;While<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;R&#160;&#61;&#160;False<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Return&#160;R<br />
&#160;&#160;&#160;&#160;End&#160;Function</p>
<p>&#35;End&#160;Region</p>
<p>End&#160;Class</p></div>
<img src="http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~4/492855589" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.albertmata.net/2008/12/textbox-mejorado-en-net/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.albertmata.net/2008/12/textbox-mejorado-en-net/</feedburner:origLink></item>
		<item>
		<title>Feliz navidad (o algo así).</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/488309240/</link>
		<comments>http://www.albertmata.net/2008/12/feliz-navidad-o-algo-asi/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 04:00:29 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[Off-topic]]></category>

		<category><![CDATA[Quejas]]></category>

		<category><![CDATA[barcelona]]></category>

		<category><![CDATA[crisis]]></category>

		<category><![CDATA[navidad]]></category>

		<category><![CDATA[política]]></category>

		<category><![CDATA[velocidad]]></category>

		<guid isPermaLink="false">http://www.albertmata.net/?p=166</guid>
		<description><![CDATA[Ayer por la mañana tuve ocasión de ver un rato el programa matutino de noticias de Josep Cuní en TV3, ya que tenía cita en Hacienda para un par de temas sin importancia y me quedó un rato libre muerto por ahí. Cielos, es infinitamente mejor trabajar sin parar y no enterarte de lo que [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.albertmata.net/public/uploads/2008/12/politica.png" alt="" title="politica" width="266" height="302" class="alignleft size-full wp-image-167" />Ayer por la mañana tuve ocasión de ver un rato <a href="http://www.tv3.cat/programa/145947628" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.tv3.cat');" target="_blank">el programa matutino de noticias de Josep Cuní en TV3</a>, ya que tenía cita en Hacienda para un par de temas sin importancia y me quedó un rato libre muerto por ahí. Cielos, es infinitamente mejor trabajar sin parar y no enterarte de lo que pasa en el mundo que ver como la estupidez humana se va concentrando cada vez más en la clase política que nos gobierna. Creo que <a href="http://es.wikipedia.org/wiki/Albert_Einstein" onclick="javascript:pageTracker._trackPageview('/outbound/article/es.wikipedia.org');" target="_blank">Albert Einstein</a> ya dijo algo acerca de cosas infinitas y estupidez varia (<a href="http://es.wikiquote.org/wiki/Albert_Einstein#H" onclick="javascript:pageTracker._trackPageview('/outbound/article/es.wikiquote.org');" target="_blank">consúltalo aquí si no lo leíste nunca</a>)&#8230;</p>
<div class="subtitle">Motivo para alucinar/llorar número 1.</div>
<p>En Barcelona tenemos (sufrimos) desde hace ya muchos meses una limitación de la velocidad a 80km/h en todos los tramos de autopistas y autovías cercanas a la capital. Supuestamente con ello se reduce la contaminación y los accidentes. Es una estupidez porque basta ir por la carretera para ver que nadie respeta dichas limitaciones. Lo único que consiguen es que todo el mundo sepa perfectamente donde están los radares y se produzcan las típicas frenadas y posteriores acelerones antes y después de éstos. Pero molesta una barbaridad esa limitación. Además dudo que se contamine menos, porque al menos yo me veo forzado a ir en cuarta marcha en lugar de en quinta, ya que de lo contrario el coche &#8220;se me aceleraría solo&#8221; y multa que me caería. Y a 80km/h en cuarta probablemente se consuma más que a 100km/h en quinta&#8230; Pues bien, a partir de ahora la limitacion será variable en función del momento del día y de otros factores tan importantísimos como la contaminación(*), pudiendo llegar a limitar a 60km/h e incluso 40km/h (pero nunca a 120km/h por mucho que sean las dos de la madrugada y conduzcas solo por la autopista). Y para montar esta sistema de limitaciones variables, la infrastructura necesaria nos costará 2,6 millones de euros. Toma crisis. Total, lo vamos a pagar a base de multas, qué más les da. Menuda panda de sinvergüenzas.</p>
<p>(*) Lamento la ironía, pero si realmente les importara la contaminación tendríamos un sistema de transporte público decente en lugar del patético que tenemos.</p>
<div class="subtitle">Motivo para alucinar/llorar número 2.</div>
<p>En la Unión Europea se votaba ayer (finalmente se rechazó, pero da igual, la sola propuesta ya es indignante) una proposición para aceptar la jornada laboral de 65 horas semanales. Claro que sí. ¿Crisis? Trabajemos más. No seamos más productivos, no, trabajemos más horas. En plan monos estúpidos. Después nos hablarán de conciliar vida profesional con vida familiar. Sí, pues como no sea beneficiándote a la administrativa de tu empresa ya me dirás tú. Patético. Para esto les pagamos, desde luego&#8230; Menuda panda de sinvergüenzas. ¿Y los sindicatos? Ah, ésos&#8230; andarán cacareando tonterías en cualquier manifestación que corte, cómo no, alguna que otra ronda. </p>
<div class="subtitle">Motivo para alucinar/llorar número 3.</div>
<p>En EEUU han tenido la brillante idea de bajar los tipos de interés al 0% - 0,25%. Con un par. No hemos aprendido realmente nada con la que nos ha caído. La crisis, digo. Supuestamente la medida intenta evitar la deflación. Para el que no esté puesto en economía, al igual que el incremento de los precios se denomina inflación, el decremento (o incremento negativo si no te chirrian los dientes al leer eufemismos estúpidos) de los precios se denomina deflación. Y uno podría pensar&#8230; ¡genial, bajan los precios! Pues no, la deflación tiende a ser algo negativo. Cuando el escenario es el habitual de que los precios van subiendo, la gente consume con cierta normalidad porque no tiene ningún aliciente para no consumir hoy y hacerlo mañana. Ante un escenario de precios bajando, el consumo se ve frenado porque el consumidor tiene un claro aliciente para no consumir hoy y sí mañana (el precio será más bajo). Esto lleva a que se consuma menos, por tanto se produzca menos&#8230; y por tanto tengamos recesión (decrecimiento o crecimiento negativo de la economía), mayor desempleo y todo lo que ahora estamos teniendo. Y con el fin de evitarlo en los EEUU han tenido la brillante idea de bajar los tipos de interés, prácticamente anulándolos, para fomentar el consumo. Todavía la crisis no nos ha mordido con ganas (apenas un par de amagos) y ya hemos olvidado que el consumo desmesurado por encima de nuestras posibilidades nos ha metido en esto. Es alucinante que el mundo gire alrededor de cuatro iluminados que deciden en base a no se sabe qué. Menuda panda de sinvergüenzas.</p>
<p>Voy a centrarme de nuevo en mis desarrollos. Pese a todo, cualquier aplicación informática tiene infinidad menos de bugs que la clase política mundial (lástima que a esta clase no se le pueda aplicar un .Dispose, un =Nothing o algún .Destroy o .Kill personalizado&#8230;).</p>
<p>Por cierto, este post es mi versión del &#8216;Feliz navidad&#8217; para los que de vez en cuando pasáis por este blog. Como muestra de ello, la imagen con la que lo encabezo, que viene a ser un arbolito de navidad adaptado para la ocasión (lo encontré por internet y me hizo gracia). Así que lo dicho, felices fiestas para todos, trabajad mucho y ganad unos quilitos&#8230; <img src='http://www.albertmata.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~4/488309240" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.albertmata.net/2008/12/feliz-navidad-o-algo-asi/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.albertmata.net/2008/12/feliz-navidad-o-algo-asi/</feedburner:origLink></item>
		<item>
		<title>Decidir clase en tiempo de ejecución en .NET.</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/487296063/</link>
		<comments>http://www.albertmata.net/2008/12/decidir-clase-en-tiempo-de-ejecucion-en-net/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 05:00:47 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[activator]]></category>

		<category><![CDATA[createinstance]]></category>

		<category><![CDATA[gettype]]></category>

		<category><![CDATA[type]]></category>

		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.albertmata.net/?p=161</guid>
		<description><![CDATA[En ocasiones puede resultarnos imprescindible no determinar la clase de la que un objeto va a ser instancia hasta que estemos en tiempo de ejecución. Para ello podemos valernos de la clase Activator y de su método CreateInstance, que nos permiten pasarle una clase para que nos devuelva un objeto de esa clase.
Podemos por ejemplo [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.albertmata.net/public/uploads/2008/11/visualstudio.jpg" alt="" title="visualstudio" width="299" height="94" class="alignleft size-full wp-image-144" />En ocasiones puede resultarnos imprescindible no determinar la clase de la que un objeto va a ser instancia hasta que estemos en tiempo de ejecución. Para ello podemos valernos de la clase Activator y de su método CreateInstance, que nos permiten pasarle una clase para que nos devuelva un objeto de esa clase.</p>
<p>Podemos por ejemplo crearnos una función sencilla como esta&#8230;</p>
<div class="code">&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#39;&#160;Creates&#160;an&#160;instance&#160;of&#160;specified&#160;class&#160;and&#160;returns&#160;that&#160;object&#46;<br />
&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
Public&#160;Function&#160;CreateInstance&#40;ByVal&#160;T&#160;As&#160;Type&#41;&#160;As&#160;Object<br />
&#160;&#160;&#160;&#160;Return&#160;Activator&#46;CreateInstance&#40;T&#41;<br />
End&#160;Function</div>
<p>&#8230;que podríamos tener encapsulada como método de alguna clase que nos permitiera hacer determinadas acciones con objetos, esto ya a gusto de cada cual.</p>
<p>Una vez tenemos esta función podemos llamarla de varias maneras. La primera, si tenemos otro objeto de la misma clase de la que ahora queremos obtener una instancia:</p>
<div class="code">Dim&#160;OBJ&#160;As&#160;Object</p>
<p>&#39;Option&#160;1&#46;&#160;We&#160;already&#160;have&#160;an&#160;object&#160;of&#160;that&#160;class&#46;<br />
Dim&#160;C1&#160;As&#160;New&#160;Class1&#40;&#41;<br />
OBJ&#160;&#61;&#160;Me&#46;CreateInstance&#40;C1&#46;GetType&#40;&#41;&#41;</p></div>
<p>La segunda, si no tenemos ningún objeto pero conocemos el nombre de la clase en cuestión:</p>
<div class="code">Dim&#160;OBJ&#160;As&#160;Object</p>
<p>&#39;Option&#160;2&#46;&#160;We&#160;haven&#39;t&#160;any&#160;object&#160;of&#160;that&#160;class&#46;<br />
OBJ&#160;&#61;&#160;Me&#46;CreateInstance&#40;Type&#46;GetType&#40;&#34;AlbertMata&#46;Class2&#34;&#41;&#41;</p>
<p>&#39;But&#160;be&#160;careful&#160;because&#160;this&#160;would&#160;fail&#58;<br />
&#39;OBJ&#160;&#61;&#160;Me&#46;CreateInstance&#40;Type&#46;GetType&#40;&#34;Class2&#34;&#41;&#41;</p></div>
<p>Como aparece en el código, conviene remarcar que el nombre de la clase debe incorporar el espacio de nombres, de lo contrario provocará una excepción.</p>
<p>En ambos casos, si una vez creado el objeto -que si nos fijamos lo habíamos declarado como Object y lo habíamos instanciado a través de un método que también devolvía un Object- consultamos su tipo exacto&#8230;</p>
<div class="code">&#39;Checking&#160;exact&#160;type&#160;for&#160;object&#46;<br />
Debug&#46;Print&#40;OBJ&#46;GetType&#46;ToString&#41;</div>
<p>&#8230;obtendremos&#8230;</p>
<div class="code">AlbertMata.Class2</div>
<p>Particularmente este sistema me ha venido bien para alguna travesura que quería hacer con formularios, pero creo que en más ocasiones podrá serme útil.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~4/487296063" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.albertmata.net/2008/12/decidir-clase-en-tiempo-de-ejecucion-en-net/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.albertmata.net/2008/12/decidir-clase-en-tiempo-de-ejecucion-en-net/</feedburner:origLink></item>
		<item>
		<title>Distancia de Levenshtein en VisualBasic.NET.</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/483912806/</link>
		<comments>http://www.albertmata.net/2008/12/distancia-de-levenshtein-en-visualbasicnet/#comments</comments>
		<pubDate>Sat, 13 Dec 2008 19:30:08 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[array]]></category>

		<category><![CDATA[levenshtein]]></category>

		<category><![CDATA[string]]></category>

		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.albertmata.net/?p=164</guid>
		<description><![CDATA[Hace un rato se me ha planteado un problema que quien más quien menos habrá tenido en alguna ocasión. Necesitaba poder comparar dos cadenas y obtener algún indicador de hasta qué punto podría tratarse de la misma cadena escrita de maneras ligeramente diferentes. He estado dándole vueltas sobre cómo podría jugar con los distintos métodos [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.albertmata.net/public/uploads/2008/12/levenshtein.png" alt="" title="levenshtein" width="240" height="226" class="alignleft size-full wp-image-165" />Hace un rato se me ha planteado un problema que quien más quien menos habrá tenido en alguna ocasión. Necesitaba poder comparar dos cadenas y obtener algún indicador de hasta qué punto podría tratarse de la misma cadena escrita de maneras ligeramente diferentes. He estado dándole vueltas sobre cómo podría jugar con los distintos métodos de la clase String para conseguir algún valor. Me he planteado utilizar análisis de frecuencias, generar números ponderados en función de carácter y posición dentro de la cadena&#8230; Pero nada me convencía, así que he insistido un poco más en buscar si ya alguien había desarrollado alguna función parecida y para mi mayúscula sorpresa me he dado de bruces con <a href="http://es.wikipedia.org/wiki/Distancia_de_Levenshtein" onclick="javascript:pageTracker._trackPageview('/outbound/article/es.wikipedia.org');" target="_blank">la Distancia de Levenshtein</a>.</p>
<p>Resulta que esto que andaba buscando es exactamente esta distancia. Y tal como reza la Wikipedia&#8230; &#8220;se llama Distancia de Levenshtein o distancia de edición al número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra. Se entiende por operación, bien una inserción, eliminación o la substitución de un carácter. Esta distancia recibe ese nombre en honor al científico ruso Vladimir Levenshtein, quien se ocupara de esta distancia en 1965. Es útil en programas que determinan cuán similares son dos cadenas de caracteres, como es el caso de los correctores de ortografía.&#8221;</p>
<p>Y para mayor regocijo, en la propia página de la Wikipedia aparece el algoritmo en pseudocódigo de la función:</p>
<div class="code">int&#160;LevenshteinDistance&#40;char&#160;str1&#91;1&#46;&#46;lenStr1&#93;&#44;&#160;char&#160;str2&#91;1&#46;&#46;lenStr2&#93;&#41;<br />
&#160;&#160;&#160;&#47;&#47;&#160;d&#160;is&#160;a&#160;table&#160;with&#160;lenStr1&#43;1&#160;rows&#160;and&#160;lenStr2&#43;1&#160;columns<br />
&#160;&#160;&#160;declare&#160;int&#160;d&#91;0&#46;&#46;lenStr1&#44;&#160;0&#46;&#46;lenStr2&#93;<br />
&#160;&#160;&#160;&#47;&#47;&#160;i&#160;and&#160;j&#160;are&#160;used&#160;to&#160;iterate&#160;over&#160;str1&#160;and&#160;str2<br />
&#160;&#160;&#160;declare&#160;int&#160;i&#44;&#160;j&#44;&#160;cost<br />
&#160;<br />
&#160;&#160;&#160;for&#160;i&#160;from&#160;0&#160;to&#160;lenStr1<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;d&#91;i&#44;&#160;0&#93;&#160;&#58;&#61;&#160;i<br />
&#160;&#160;&#160;for&#160;j&#160;from&#160;0&#160;to&#160;lenStr2<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;d&#91;0&#44;&#160;j&#93;&#160;&#58;&#61;&#160;j<br />
&#160;<br />
&#160;&#160;&#160;for&#160;i&#160;from&#160;1&#160;to&#160;lenStr1<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;j&#160;from&#160;1&#160;to&#160;lenStr2<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;str1&#91;i&#93;&#160;&#61;&#160;str2&#91;j&#93;&#160;then&#160;cost&#160;&#58;&#61;&#160;0<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else&#160;cost&#160;&#58;&#61;&#160;1<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;d&#91;i&#44;&#160;j&#93;&#160;&#58;&#61;&#160;minimum&#40;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;d&#91;i&#45;1&#44;&#160;j&#93;&#160;&#43;&#160;1&#44;&#160;&#160;&#160;&#160;&#160;&#47;&#47;&#160;deletion<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;d&#91;i&#44;&#160;j&#45;1&#93;&#160;&#43;&#160;1&#44;&#160;&#160;&#160;&#160;&#160;&#47;&#47;&#160;insertion<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;d&#91;i&#45;1&#44;&#160;j&#45;1&#93;&#160;&#43;&#160;cost&#160;&#160;&#160;&#47;&#47;&#160;substitution<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#41;<br />
&#160;<br />
&#160;&#160;&#160;return&#160;d&#91;lenStr1&#44;&#160;lenStr2&#93;</div>
<p>Incluso viene la implementación en algunos lenguajes de programación (C++, Java, Perl, Python, Ruby, Delphi y ColdFusion). Lástima que no viniera también en VisualBasic.NET que es el lenguaje en el que yo desarrollo&#8230; pero bueno, como codificar un algoritmo que ya nos viene dado en pseudocódigo tampoco es tarea infernal, a ello me he dedicado:</p>
<div class="code">&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
&#39;&#160;Author&#58;&#160;&#160;&#160;&#160;&#160;&#160;Albert&#160;Mata&#160;&#40;www&#46;albertmata&#46;net&#41;<br />
&#39;&#160;Date&#58;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;20081212<br />
&#39;&#160;Description&#58;&#160;Calculates&#160;Levenshtein&#160;distance&#160;between&#160;two&#160;different&#160;<br />
&#39;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;strings&#46;<br />
&#39;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;<br />
Public&#160;Function&#160;LevenshteinDistance&#40;ByVal&#160;STR1&#160;As&#160;String&#44;&#160;&#95;<br />
ByVal&#160;STR2&#160;As&#160;String&#41;&#160;As&#160;Integer<br />
&#160;&#160;&#160;&#160;&#39;Variables&#160;to&#160;iterate&#160;&#40;i&#44;&#160;j&#41;&#160;and&#160;get&#160;cost&#160;for&#160;any&#160;needed&#160;<br />
&#160;&#160;&#160;&#160;&#39;operation&#46;<br />
&#160;&#160;&#160;&#160;Dim&#160;i&#160;As&#160;Integer<br />
&#160;&#160;&#160;&#160;Dim&#160;j&#160;As&#160;Integer<br />
&#160;&#160;&#160;&#160;Dim&#160;Cost&#160;As&#160;Integer</p>
<p>&#160;&#160;&#160;&#160;&#39;Creating&#160;array&#160;with&#160;string&#39;s&#160;lengths&#160;as&#160;bounds&#46;<br />
&#160;&#160;&#160;&#160;Dim&#160;D&#40;STR1&#46;Length&#44;&#160;STR2&#46;Length&#41;&#160;As&#160;Integer</p>
<p>&#160;&#160;&#160;&#160;&#39;Initializing&#160;array&#39;s&#160;values&#46;<br />
&#160;&#160;&#160;&#160;For&#160;i&#160;&#61;&#160;0&#160;To&#160;STR1&#46;Length<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;D&#40;i&#44;&#160;0&#41;&#160;&#61;&#160;i<br />
&#160;&#160;&#160;&#160;Next<br />
&#160;&#160;&#160;&#160;For&#160;j&#160;&#61;&#160;0&#160;To&#160;STR2&#46;Length<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;D&#40;0&#44;&#160;j&#41;&#160;&#61;&#160;j<br />
&#160;&#160;&#160;&#160;Next</p>
<p>&#160;&#160;&#160;&#160;&#39;Calculating&#160;Levenshtein&#160;distance&#46;<br />
&#160;&#160;&#160;&#160;For&#160;i&#160;&#61;&#160;1&#160;To&#160;STR1&#46;Length<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;For&#160;j&#160;&#61;&#160;1&#160;To&#160;STR2&#46;Length<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;STR1&#40;i&#160;&#45;&#160;1&#41;&#160;&#61;&#160;STR2&#40;j&#160;&#45;&#160;1&#41;&#160;Then<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Cost&#160;&#61;&#160;0<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Cost&#160;&#61;&#160;1<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;End&#160;If<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;First&#160;compared&#160;element&#58;&#160;deletion&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Second&#160;compared&#160;element&#58;&#160;insertion&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#39;Third&#160;compared&#160;element&#58;&#160;substitution&#46;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;D&#40;i&#44;&#160;j&#41;&#160;&#61;&#160;Math&#46;Min&#40;Math&#46;Min&#40;D&#40;i&#160;&#45;&#160;1&#44;&#160;j&#41;&#160;&#43;&#160;1&#44;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;D&#40;i&#44;&#160;j&#160;&#45;&#160;1&#41;&#160;&#43;&#160;1&#41;&#44;&#160;&#95;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;D&#40;i&#160;&#45;&#160;1&#44;&#160;j&#160;&#45;&#160;1&#41;&#160;&#43;&#160;Cost&#41;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Next<br />
&#160;&#160;&#160;&#160;Next</p>
<p>&#160;&#160;&#160;&#160;&#39;Returning&#160;result&#46;<br />
&#160;&#160;&#160;&#160;Return&#160;D&#40;STR1&#46;Length&#44;&#160;STR2&#46;Length&#41;<br />
End&#160;Function</p></div>
<p>Creo que está bien. Y el resultado de algunas pruebas así parece demostrarlo:</p>
<div class="code">Debug&#46;Print&#40;Me&#46;LevenshteinDistance&#40;&#34;Albert&#160;Mata&#34;&#44;&#160;&#34;Albert&#160;Mata&#34;&#41;&#41;<br />
0<br />
Debug&#46;Print&#40;Me&#46;LevenshteinDistance&#40;&#34;Albert&#160;Mata&#34;&#44;&#160;&#34;Alber&#160;Matas&#34;&#41;&#41;<br />
2<br />
Debug&#46;Print&#40;Me&#46;LevenshteinDistance&#40;&#34;Albert&#160;Mata&#34;&#44;&#160;&#34;Mr&#46;&#160;Albert&#160;Mata&#34;&#41;&#41;<br />
4</div>
<p>No es ni mucho menos un sistema infalible, pero nos puede resultar muy útil para estimar si dos cadenas algo distintas pueden ser (o pretender ser) en realidad la misma. No obstante hay que utilizarla con cabeza, ya que por ejemplo si comparamos&#8230;</p>
<p>Albert Mata<br />
Antoni Pons</p>
<p>&#8230;obtendremos una distancia de 9. Y si comparamos&#8230;</p>
<p>Berberechos y enlatados del norte, S.A.<br />
Berberechos y enlatd. norte, SA</p>
<p>&#8230;obtendremos también una distancia de 9. Sin embargo en el primer caso las personas son claramente distintas y en el segundo caso el cliente parece ser el mismo. Para corregir esto se podrían buscar varias alternativas, pero yo propongo algo tan sencillo como ponderar la distancia entre la longitud de alguna de las cadenas:</p>
<div class="code">Dim&#160;S1&#160;As&#160;String&#160;&#61;&#160;&#34;Albert&#160;Mata&#34;<br />
Dim&#160;S2&#160;As&#160;String&#160;&#61;&#160;&#34;Antoni&#160;Pons&#34;<br />
Dim&#160;LD&#160;As&#160;Integer&#160;&#61;&#160;Me&#46;LevenshteinDistance&#40;S1&#44;&#160;S2&#41;<br />
Dim&#160;Similar&#160;As&#160;Double&#160;&#61;&#160;&#40;S1&#46;Length&#160;&#45;&#160;LD&#41;&#160;&#47;&#160;S1&#46;Length</div>
<p>Esto nos da un coeficiente de similitud del 0,181818181818182 (escaso, escaso). En cambio esto otro&#8230;</p>
<div class="code">Dim&#160;S1&#160;As&#160;String&#160;&#61;&#160;&#34;Berberechos&#160;y&#160;enlatados&#160;del&#160;norte&#44;&#160;S&#46;A&#46;&#34;<br />
Dim&#160;S2&#160;As&#160;String&#160;&#61;&#160;&#34;Berberechos&#160;y&#160;enlatd&#46;&#160;norte&#44;&#160;SA&#34;<br />
Dim&#160;LD&#160;As&#160;Integer&#160;&#61;&#160;Me&#46;LevenshteinDistance&#40;S1&#44;&#160;S2&#41;<br />
Dim&#160;Similar&#160;As&#160;Double&#160;&#61;&#160;&#40;S1&#46;Length&#160;&#45;&#160;LD&#41;&#160;&#47;&#160;S1&#46;Length</div>
<p>&#8230;nos da un coeficiente de similitud del 0,769230769230769 (¡mucho mejor!). Se tratará en cada caso de establecer dónde ponemos el límite.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~4/483912806" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.albertmata.net/2008/12/distancia-de-levenshtein-en-visualbasicnet/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.albertmata.net/2008/12/distancia-de-levenshtein-en-visualbasicnet/</feedburner:origLink></item>
		<item>
		<title>Pepecar o una mala opción para alquilar un coche (segunda parte).</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/482371777/</link>
		<comments>http://www.albertmata.net/2008/12/pepecar-o-una-mala-opcion-para-alquilar-un-coche-segunda-parte/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 21:25:38 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[Off-topic]]></category>

		<category><![CDATA[Quejas]]></category>

		<category><![CDATA[807]]></category>

		<category><![CDATA[agència catalana consum]]></category>

		<category><![CDATA[mossos esquadra]]></category>

		<category><![CDATA[pepecar]]></category>

		<category><![CDATA[pepephone]]></category>

		<category><![CDATA[queja]]></category>

		<category><![CDATA[reclamación]]></category>

		<category><![CDATA[seguro]]></category>

		<category><![CDATA[smart]]></category>

		<guid isPermaLink="false">http://www.albertmata.net/?p=159</guid>
		<description><![CDATA[Hace un tiempo escribí un post sobre una mala experiencia que tuve alquilando un coche con Pepecar. En resumidísimas cuentas, alquilé un Smart, me hurtaron una rueda y Pepecar me la cargó directamente en la tarjeta de crédito (300 euros). Bajo mi punto de vista (y el de los Mossos d&#8217;Esquadra) esto no debería haber [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.albertmata.net/public/uploads/2008/10/pepecar0.jpg' alt='' class='alignleft' />Hace un tiempo escribí un post sobre una mala experiencia que tuve alquilando un coche con <a href="http://www.albertmata.net/2008/10/pepecar-o-una-mala-opcion-para-alquilar-un-coche/"  target="_blank">Pepecar</a>. En resumidísimas cuentas, alquilé un Smart, me hurtaron una rueda y Pepecar me la cargó directamente en la tarjeta de crédito (300 euros). Bajo mi punto de vista (y el de los Mossos d&#8217;Esquadra) esto no debería haber ocurrido porque de mi parte debían correr los daños causados al coche pero no los hurtos. Bajo el punto de vista de Pepecar todo es la misma cosa y se niegan a facilitarme una copia de la póliza del seguro que el coche en cuestión debe tener contratada con la compañía aseguradora de turno.</p>
<p>Todo ello unido a que el número de atención al cliente de Pepecar es un número 807, lo que también bajo mi punto de vista deja muy claro cuál es el nivel de respeto que Pepecar tiene por sus clientes.</p>
<p>Bien, ese artículo, por azares del destino y de Google, aparece como el décimo resultado en Google (por lo tanto primerísima página) cuando se busca simplemente &#8220;pepecar&#8221;:</p>
<p style="text-align: center;"><img src="http://www.albertmata.net/public/uploads/2008/12/pepecargoogle.jpg" alt="" title="pepecargoogle" width="467" height="284" class="alignnone size-full wp-image-160" /></p>
<p>Lo cual está bien, porque yo antes de contratar o comprar cualquier cosa suelo googlear un poco para ver qué encuentro. Y en este caso quien esté interesado en alquilar un coche con esta gente podrá al menos conocer de primera mano una experiencia de lo más negativa con ellos. Después cada cuál hace lo que quiere, está claro. El post en cuestión, además, ha tenido ya en el momento de escribir esto casi 100 visitas directas con un tiempo en la página de casi 7 minutos, lo que indica que la gente se ha leído el post de arriba a abajo. Genial.</p>
<p>Pues bien, envié la correspondiente reclamación a Pepecar vía correo electrónico y al cabo de unos días me contestaron denegándome los motivos de la reclamación y por supuesto la devolución del importe. Según ellos, el supuesto que nos atañe (el hurto de una rueda) entra dentro de las condiciones generales de contratación. </p>
<p>Pero según mi abogada no. Sí, he puesto el tema en manos de mi abogada y ayer mismo les enviamos una carta en la que les solicitamos formalmente que nos faciliten de una vez la copia de la póliza de seguro que el vehículo en cuestión tiene contratada. Sólo así podremos ver si es correcto o no que me hayan cobrado a mí los 300 euros.</p>
<p>Y tal como reza en la carta&#8230; &#8220;en caso de que no atiendan esta solicitud, mi representado [yo mismo] queda libre de iniciar las acciones judiciales que considere pertinentes&#8221;. Cosa que no dudaré en hacer.</p>
<p>Y es que 300 euros son 300 euros. Y si rompo algo y los tengo que pagar, los pago. Pero si soy víctima de un hurto y eso ya está asegurado por otro lado (como sospechamos) y por tanto ellos ya se lo cobran a la compañía de turno, no quiero pagarlos yo. ¡Que mis buenas horitas de desarrollo me cuesta ganarlos!</p>
<p>PD. Seguiré informando.</p>
<div class="subtitle">Actualización.</div>
<p>Escribiendo pepecar en Google fluctúa un poco la posición en la que aparece mi primer post. Lo he llegado a ver incluso en cuarta posición, apenas por detrás de los dos resultados corporativos de turno. Otras veces aparece el sexto, otras el décimo. En cualquier caso está ganando visibilidad y estos últimos días está siendo de los posts más visitados en este blog. Celebro que gente que pudiera estar interesada en contratar sus servicios conozca antes lo que les puede llegar a pasar.</p>
<img src="http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~4/482371777" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.albertmata.net/2008/12/pepecar-o-una-mala-opcion-para-alquilar-un-coche-segunda-parte/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.albertmata.net/2008/12/pepecar-o-una-mala-opcion-para-alquilar-un-coche-segunda-parte/</feedburner:origLink></item>
		<item>
		<title>SAP líder en mercado de ERPs… ¡y en la Bundesliga!</title>
		<link>http://feeds.feedburner.com/~r/ElBlogDeAlbertMata/~3/482371778/</link>
		<comments>http://www.albertmata.net/2008/12/sap-lider-en-mercado-de-erps-%c2%a1y-en-la-bundesliga/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 20:15:15 +0000</pubDate>
		<dc:creator>Albert Mata</dc:creator>
		
		<category><![CDATA[Off-topic]]></category>

		<category><![CDATA[SAP]]></category>

		<category><![CDATA[bundesliga]]></category>

		<category><![CDATA[dietmar hopp]]></category>

		<category><![CDAT