<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Quemando cromo</title>
	<atom:link href="http://cromo.cda-ie.es/feed/" rel="self" type="application/rss+xml" />
	<link>http://cromo.cda-ie.es</link>
	<description>Hacía calor, la noche que quemamos a Cromo</description>
	<lastBuildDate>Tue, 27 Dec 2011 08:07:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>El problema de la barra de progreso</title>
		<link>http://cromo.cda-ie.es/2011/12/27/el-problema-de-la-barra-de-progreso/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=el-problema-de-la-barra-de-progreso</link>
		<comments>http://cromo.cda-ie.es/2011/12/27/el-problema-de-la-barra-de-progreso/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 08:07:53 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2005]]></category>
		<category><![CDATA[Visual Basic 2008]]></category>
		<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=382</guid>
		<description><![CDATA[El año pasado, intentando desembarazarme de una tarea tediosa que dejaba frito mi equipo, usé mi primera función recursiva con utilidad práctica. Como la tarea consumía su tiempo, tiré de un BackGroundWorker. Componente sencillo de usar y con ejemplos bastante claros en la ayuda de Visual Studio. No problem: tenía un valor de entrada pedido [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-size:10pt"><span style="font-family:Verdana">El año pasado, intentando desembarazarme de una tarea tediosa que dejaba frito mi equipo, usé mi primera función recursiva con utilidad práctica. Como la tarea consumía su tiempo, tiré de un </span><span style="font-family:Courier New"><strong>BackGroundWorker</strong></span><span style="font-family:Verdana">. Componente sencillo de usar y con ejemplos bastante claros en la ayuda de Visual Studio. No problem: tenía un valor de entrada pedido por el usuario, se realizaban n operaciones de forma recursiva, se obtenía un valor de salida.<br />
</span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Como el proceso era algo largo (mínimo unos diez segundos, pero podía llegar superar el minuto en la versión 2, que admitía de entrada una serie de valores), se me ocurrió usar una barra de progreso para mantener informado al usuario.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Entonces empezaron los problemas.<br />
</span></p>
<p style="text-align: justify"><span style="font-size:10pt"><span style="font-family:Verdana">Todos los ejemplos que he visto que usan el evento </span><span style="font-family:Courier New"><strong>ProgressChanged</strong></span><span style="font-family:Verdana"> del </span><span style="font-family:Courier New"><strong>BackGroundWorker</strong></span><span style="font-family:Verdana"> para alimentar una barra de progreso presentan una serie de operaciones en secuencia con llamadas a </span><span style="font-family:Courier New"><strong>ProgressChanged</strong></span><span style="font-family:Verdana"> entre ellas, es decir: hago paso 1; progreso cambiado; hago paso 2; progreso cambiado… Sin embargo, mi problema era otro: tengo una instancia de mi clase de trabajo, cojo los valores del usuario (a través de </span><span style="font-family:Courier New"><strong>DoWorkEventArgs.Argument</strong></span><span style="font-family:Verdana">), se los paso, y le digo &#8220;ea, majo. Tú puedes&#8221; llamando al método </span><span style="font-family:Courier New"><strong>MiClase.HacerCurro</strong></span><span style="font-family:Verdana">. Ahí dentro se harán las n operaciones (recursivas), número desconocido hasta que se hagan.<br />
</span></span></p>
<p style="text-align: justify"><span style="font-size:10pt"><span style="font-family:Verdana">Vale, pensé. Puedo provocar un evento </span><span style="font-family:Courier New"><strong>OperaciónCompletada</strong></span><span style="font-family:Verdana"> cada vez que complete una operación. Pero la instancia de </span><span style="font-family:Courier New"><strong>MiClase</strong></span><span style="font-family:Verdana"> está declarada dentro del </span><span style="font-family:Courier New"><strong>DoWork</strong></span><span style="font-family:Verdana"> del </span><span style="font-family:Courier New"><strong>BackGroundWorker</strong></span><span style="font-family:Verdana">. No tengo acceso desde fuera. ¿Cómo lo hago?<br />
</span></span></p>
<p style="text-align: justify"><span style="font-size:10pt"><span style="font-family:Verdana">¿Y si meto alguien que escuche en el </span><span style="font-family:Courier New"><strong>DoWork</strong></span><span style="font-family:Verdana">? De esta forma tendría mi &#8220;escuchador&#8221; de eventos en el mismo hilo. Es decir, una clase, digamos </span><span style="font-family:Courier New"><strong>Escuchante</strong></span><span style="font-family:Verdana">, a la que le paso mi instancia de </span><span style="font-family:Courier New"><strong>MiClase</strong></span><span style="font-family:Verdana"> y la del </span><span style="font-family:Courier New"><strong>BackGroundWorker</strong></span><span style="font-family:Verdana">. Escuchante gestiona el evento </span><span style="font-family:Courier New"><strong>OperacionCompletada</strong></span><span style="font-family:Verdana"> provocando a su vez el </span><span style="font-family:Courier New"><strong>ProgressChanged</strong></span><span style="font-family:Verdana">, que actualiza la barra de progreso.<br />
</span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">No sé si será una solución muy limpia, pero funcionó.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">En resumen, algo así:<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Public Class Escuchante<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Private WithEvents _MiClase as MiClase<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Private _MiBGW as BackGroundWorker<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Public Sub New(mc as MiClase, bw as BackGroundWorker)<br />
</span></p>
<p style="margin-left: 36pt"><span style="font-family:Courier New; font-size:10pt">_MiClase=mc<br />
</span></p>
<p style="margin-left: 36pt"><span style="font-family:Courier New; font-size:10pt">_MiBGW=bw<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">End Sub<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Private Sub OpCompletada(sender as Object, e as OperacionCompletadaEventArgs) _<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">                                    Handles _MiClase.OperacionCompletada<br />
</span></p>
<p style="margin-left: 36pt"><span style="font-family:Courier New; font-size:10pt">_MiBGW.ReportProgress=e.NumOp<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">End Sub<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">End Class</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/12/27/el-problema-de-la-barra-de-progreso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calc es para los pobres</title>
		<link>http://cromo.cda-ie.es/2011/12/24/calc-es-para-los-pobres/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=calc-es-para-los-pobres</link>
		<comments>http://cromo.cda-ie.es/2011/12/24/calc-es-para-los-pobres/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 12:26:35 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Cuentos desde la Cripta]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/2011/12/24/calc-es-para-los-pobres/</guid>
		<description><![CDATA[Este año he sido especialmente parco en entradas en este blog. Lo tengo casi abandonado, con entradas a medio redactar, distintos temas por probar para cambiar el que tiene… Ha sido un año lleno de historias y de material que publicar, no ha faltado el trabajo: una migración a SAP B1, nuevos equipos, programación a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Este año he sido especialmente parco en entradas en este blog. Lo tengo casi abandonado, con entradas a medio redactar, distintos temas por probar para cambiar el que tiene… Ha sido un año lleno de historias y de material que publicar, no ha faltado el trabajo: una migración a SAP B1, nuevos equipos, programación a saco, anécdotas varias… Un año completo y divertido en el curro. También muy cansado, que me dejaba sin ganas de tocar otro ordenador al llegar a casa. Intentaré estos pocos días que tengo de vacaciones contar algunas y que no parezca Quemando Cromo un blog abandonado.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El título de la entrada de hoy es una frase lapidaria de mi jefe de departamento cuyo origen hay que buscarlo en un problema de licencias que nos encontramos a principios de año: los puestos de trabajo crecían y faltaban licencias de Microsoft Office (el 2000 teníamos). Teníamos entonces una gran dependencia de Outlook, Excel y Access, pero el precio de las licencias de Office resultaba prohibitivo para todos los puestos que teníamos, así que estudiamos alternativas.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Outlook fue sustituido sin más problemas por Thunderbird + Lightning. Necesitábamos un cliente de correo con calendario y tareas y el pájaro de trueno cumplió con creces. Con Access el problema desapareció por sí solo: había muchos aplicativos en Access que atacaban la base de datos del ERP. Pero este iba a ser sustituido por SAP B1, así que muerto el perro…<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El tercer problema era Excel. Probamos tanto OpenOffice.org como LibreOffice como Lotus Symphony. Elegimos finalmente LibreOffice confiando en su futuro frente a OpenOffice.org y tras tener graves problemas de estabilidad con Lotus Symphony. Migramos con ilusión intentando contagiar nuestro entusiasmo para cortar las quejas tontas (tal opción se llama distinta, los botones no son iguales, el desplegable de colores es peor porque es distinto…).<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Después de varios desesperantes meses, hubo que claudicar, re-evaluar y adquirir cierto número de licencias para algunos puestos claves. Simplemente, Calc no está a la altura. Tuvimos unos meses de horror, plagados de archivos corruptos al guardar y de pérdida de información (hiperenlaces y vínculos externos). A la hora de buscar cómo migrar ciertos libros de Excel complejos a Calc nos topamos con la falta de documentación, falta de movimiento en los foros oficiales… Cuando llegamos a las tablas dinámicas y las conexiones a SQL Server, tiramos la toalla. Salía más caro intentar usar Calc (tiempo perdido en varios departamentos, falta de información en el momento clave o inconsistencia de la misma) que volver a Excel.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">A fin de cuentas, Excel es Dios.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">PD: como yo no ocupo un puesto clave, uso Calc. Total, para lo que sé y necesito hacer me basta. Voy más lento de lo que podría ir con Excel 2007-2010 (falta de herramientas, están más ocultas), pero para una vez al mes que lo uso me vale.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/12/24/calc-es-para-los-pobres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quiero mi Date Null, gracias</title>
		<link>http://cromo.cda-ie.es/2011/09/27/quiero-mi-date-null-gracias/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=quiero-mi-date-null-gracias</link>
		<comments>http://cromo.cda-ie.es/2011/09/27/quiero-mi-date-null-gracias/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 15:13:48 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=365</guid>
		<description><![CDATA[Quiero mi bo cadillo decía ese gran filósofo moderno que es Homer Simpson. Algo parecido he estado yo pidiendo estos días. El problema se me ha presentado en una aplicación con acceso a datos, con un montaje convencional: dataset tipado + bindingsource + controles en el formulario. Uno de los campos era una fecha y [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt"><em>Quiero mi bo cadillo</em> decía ese gran filósofo moderno que es Homer Simpson. Algo parecido he estado yo pidiendo estos días. El problema se me ha presentado en una aplicación con acceso a datos, con un montaje convencional: dataset tipado + bindingsource + controles en el formulario. Uno de los campos era una fecha y podía tener valores nulos. Hasta ahí bien. El problema es que en ediciones podía recuperar el valor nulo. En esos casos, fallaba la validación de datos y no se guardaba nada, aunque tampoco conseguía saber por qué: tuve que echar mano del evento BindingComplete del BindingSource para enterarme que se producía un error en la conversión de tipos. El tipo Date no acepta nulos.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Tras una larga búsqueda en internet, casi todo en inglés, averigüé dos cosas: que era un problema común y muy molesto y que no tenía solución fácil. También hallé <a href="http://blogs.msdn.com/b/dchandnani/archive/2005/08/15/451979.aspx">unas pistas</a> que me indicaron el camino. Un trabajo no muy limpio, pero que funciona, dividido en dos partes: el enlace al control y la datatable correspondiente.</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">En enlace, usando el diseñador (DataBindings, Avanzado) para asignar un formato de fecha corta, queda así:</span></p>
<p><span id="more-365"></span></p>
<p style="text-align: left"><span style="font-size:10pt"><span style="color:blue; font-family:Courier New">Me</span><span style="font-family:Courier New">.txtFecha.DataBindings.Add(<span style="color:blue">New</span> Binding(<span style="color:#a31515">&#8220;Text&#8221;</span>, <span style="color:blue">Me</span>.bsDatos, <span style="color:#a31515">&#8220;Fecha&#8221;</span>, <span style="color:blue">True</span>, DataSourceUpdateMode.OnValidation, <span style="color:blue">Nothing</span>, <span style="color:#a31515">&#8220;d&#8221;</span>))</span><span style="font-family:Verdana"></span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Donde Nothing representa cómo se van a mostrar los valores nulos de la base de datos, la propiedad NullValue del Binding. Ésa sabemos que funciona bien, nos interesa gestionar el otro sentido de la actualización, hacia el origen de datos. Para ello tenemos la propiedad <strong>DataSourceNullValue</strong>. Sacamos el enlace del designer y lo gestionamos a mano, creándonos el Binding:<br />
</span></p>
<p style="text-align: left"><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">Dim</span> mBinding <span style="color:blue">As</span>	<span style="color:blue">New</span> Binding(<span style="color:#a31515">&#8220;Text&#8221;</span>, <span style="color:blue">Me</span>.bsDatos, <span style="color:#a31515">&#8220;Fecha&#8221;</span>, <span style="color:blue">True</span>, DataSourceUpdateMode.OnValidation, <span style="color:#a31515">&#8220;&#8221;</span>, <span style="color:#a31515">&#8220;d&#8221;</span>)<br />
</span><span style="font-family:Courier New; font-size:10pt">mBinding.DataSourceNullValue = <span style="color:blue">Date</span>.MinValue</span><br />
<span style="font-size:10pt"><span style="color:blue; font-family:Courier New">Me</span><span style="font-family:Courier New">.txtFecha.DataBindings.Add(mBinding)</span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Primer punto: indicamos que el NullValue para el origen de datos no va a ser DBNull (por defecto y causa de los errores), sino un valor de fecha válido, en este caso el menor valor posible (Date.MinValue).</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Segundo punto: cambiamos el Nothing del NullValue por String.Empty o &#8220;&#8221;. La razón es muy sencilla: NullValue nos indica dos cosas. Por una parte, si (en este caso) la fecha en la DataTable es DBNull, lo representa por lo que le indiquemos ahí. Lo segundo, si el valor de la propiedad del control (Text, en este caso) coincide con el NullValue en un cambio de datos (altas, modificaciones), le pasa al origen de datos (la DataTable) lo que le tengamos dicho en DataSourceNullValue. Y el Nothing ahí no nos vale: si no hay nada en Text, obtenemos una cadena vacía, String.Empty o &#8220;&#8221;, no un valor Nothing.</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Con esto, pues, si dejamos el textbox txtFecha vacío, obtendremos en el campo Fecha de la fila correspondiente un valor fecha igual a Date.MinValue. Que no es lo que queremos: buscamos un DBNull.</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Eso lo hacemos en otra parte: gestionando el evento <strong>ColumChanging</strong> del DataTable. Modo rápido: en el diseñador del dataset tipado hacemos doble click sobre la columna en cuestión y nos genera el código automáticamente. En la gestión del evento incluimos el código para que nos filtre la fecha y si es igual a Date.MinValue, cambie el valor propuesto del campo a DBNull.value:</span></p>
<p style="text-align: left"><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">If</span> (e.Column.ColumnName = <span style="color:blue">Me</span>.FechaColumn.ColumnName) <span style="color:blue">Then<br />
</span></span><br />
       <span style="font-family:Courier New; font-size:10pt"><span style="color:blue">If</span> IsDate(e.ProposedValue) <span style="color:blue">AndAlso</span><br />
			<span style="color:blue">CDate</span>(e.ProposedValue) = <span style="color:blue">Date</span>.MinValue <span style="color:blue">Then<br />
</span></span><span style="font-family:Courier New; font-size:10pt">        e.ProposedValue = DBNull.Value<br />
</span><span style="font-family:Courier New; font-size:10pt"><br />
			<span style="color:blue">End If<br />
</span></span><span style="font-size:10pt"><span style="color:blue; font-family:Courier New">End If</span></span><span style="font-family:Verdana"><br />
			</span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Con esto, ya tenemos nuestro campo fecha que acepta valores nulos. No es muy elegante, quizás, pero no se me ha ocurrido ninguna otra forma.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/09/27/quiero-mi-date-null-gracias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El valor no puede ser nulo. Nombre del parámetro: objectType</title>
		<link>http://cromo.cda-ie.es/2011/09/22/el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype</link>
		<comments>http://cromo.cda-ie.es/2011/09/22/el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 08:57:24 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/2011/09/22/el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype/</guid>
		<description><![CDATA[El error en cuestión me salía en el diseñador de Visual Basic Express 2010 de forma insistente. Una molestia a la hora de trabajar con el diseñador, más que nada, porque luego la aplicación funcionaba sin problemas. Ayer me dediqué a buscarle solución, tirando de Google. El problema, apuntaban en varios sitios, se daba en [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El error en cuestión me salía en el diseñador de Visual Basic Express 2010 de forma insistente. Una molestia a la hora de trabajar con el diseñador, más que nada, porque luego la aplicación funcionaba sin problemas. Ayer me dediqué a buscarle solución, tirando de Google.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El problema, apuntaban en varios sitios, se daba en formularios o controles de usuario heredados y estaba causado al gestionar eventos de objetos de alguna de las clases padre con la cláusula Handles en la clase hija. Tras investigar con calma mi usercontrol, encontré que el causante del desaguisado era, efectivamente, una cláusula handles que apuntaba a un evento de un BindingSource del abuelo del usercontrol. Quité el Handles y lo sustituí por un AddHandler en el constructor y todo funciona con suavidad.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/09/22/el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cualquiercosa x 1 = Cualquiercosa</title>
		<link>http://cromo.cda-ie.es/2011/08/12/cualquiercosa-x-1-cualquiercosa/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cualquiercosa-x-1-cualquiercosa</link>
		<comments>http://cromo.cda-ie.es/2011/08/12/cualquiercosa-x-1-cualquiercosa/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 17:10:21 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Cuentos desde la Cripta]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/2011/08/12/cualquiercosa-x-1-cualquiercosa/</guid>
		<description><![CDATA[Necesitamos un campo que siempre valga uno. —¿Uno? ¿Por qué? —Porque cualquier cosa multiplicada por uno es cualquier cosa. Y necesitamos pedir cualquiercosa al usuario y la única forma es ligarlo a un campo de una tabla. Con un campo que siempre valga uno podemos meterlo en un select que nos devuelva cualquiercosa * campo_que_vale_1 [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Necesitamos un campo que siempre valga uno.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">—¿Uno? ¿Por qué?<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">—Porque <em>cualquier cosa</em> multiplicada por uno es <em>cualquier cosa</em>. Y necesitamos pedir <em>cualquiercosa</em> al usuario y la única forma es ligarlo a un campo de una tabla. Con un campo que siempre valga uno podemos meterlo en un select que nos devuelva <em>cualquiercosa * campo_que_vale_1</em> y meterlo en la variable con la que necesitamos trabajar.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Momento de silencio pensativo. Los engranajes mentales zumban.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">—OITM. Uno de los <em>Salesfactor</em>. Por defecto, valen uno y sólo usamos el primero de ellos.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Viernes, 13 horas. Avanzando en una consulta puñetera en SAP B1.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/08/12/cualquiercosa-x-1-cualquiercosa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MKV con subtítulos en TDT Easy Home HD10</title>
		<link>http://cromo.cda-ie.es/2011/07/15/mkv-con-subtitulos-en-tdt-easy-home-hd10/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mkv-con-subtitulos-en-tdt-easy-home-hd10</link>
		<comments>http://cromo.cda-ie.es/2011/07/15/mkv-con-subtitulos-en-tdt-easy-home-hd10/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 20:18:40 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=358</guid>
		<description><![CDATA[El otro día me compré un TDT que reproducía matroskas, de la marca BestBuy. En fin, el caso es que monté el cacharro en casa, le puse un matroska (Macross Frontier, BluRay Rip 720p, versión de Nanikano, la comenté en su día) y se veía, sí, pero no los subtítulos. Mala cosa. Temiendo que el [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El otro día me compré un TDT que reproducía matroskas, de la marca BestBuy. En fin, el caso es que monté el cacharro en casa, le puse un matroska (<em>Macross Frontier</em>, BluRay Rip 720p, versión de Nanikano, la comenté en su día) y se veía, sí, pero no los subtítulos. Mala cosa. Temiendo que el cacharro no entendiera más allá de los SRT, probé con una versión guiri de la 2ª temporada de <em>Shana</em>, que tengo por ahí para traducir y, efectivamente, me mostraba los subtítulos en SRT. Pero resulta que los MKV de <em>Shana</em> tienen dos pistas de subtítulos, SRT y SSA y reproducía ambas. Perplejo me hallaba.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Revisé otros MKV y nada, no conseguía reproducir nada. Incluso probé a extraer los subtítulos, grabarlos como SRT y ponerlos en el pendrive, pero tampoco. Así que pensé que igual con <em>Shana</em> funcionaba no por los formatos, sino por tener dos cadenas de subtítulos. Hice una prueba rápida: extraje los subtítulos de un episodio, los grabé como SRT y los volví a meter en el MKV. ¡Bingo! Toca jugar un poco con el botón de Subtitle del mando hasta que se da por aludido el muy hijo de su madre, pero funciona.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Me gustaría hacer un tutorial en condiciones, con capturas y tal, del proceso, por si a alguien le pasa algo similar, pero con el poco tiempo de que dispongo es imposible, así que es esta entrada en modo telegráfico o nada.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Necesitamos el <a href="http://www.videohelp.com/tools/mkvtoolnix"><strong>MKVtoolnix</strong></a> tanto para sacar los subtítulos como para añadírselo de nuevo. Para sacarlos usaremos el <a href="http://www.videohelp.com/tools/MKVExtractGUI-2"><strong>MKVExtractGUI2</strong></a>, que descargaremos aparte. Para meterlos, el <strong>mmg</strong>.exe que ya viene de serie. Usaremos, si queremos, el <a href="http://www.urusoft.net/downloads.php?lang=1"><strong>Subtitle Workshop</strong></a> si queremos guardar los subtítulos en otro formato.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt"><strong>1) Extraer</strong><br />
		</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Lo primero es instalar el MKVtoolnix. Luego, copiaremos los archivos que vienen en el zip del MKVExtractGUI2 en la carpeta del primero (lo de siempre, archivos de programa tal y tal). Ejecutamos el MKVExtractGUI2 y nos saldrá una ventana muy simple: pinchamos en el botón de Input y le indicamos el archivo que vamos a abrir. En la caja Tracks nos aparecerá el contenido del matroska. Seleccionamos los subtítulos y pulsamos en el botón Extract. Los subtítulos se habrán guardado en la carpeta indicada en <em>Output</em>.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt"><strong>2) Guardar como…</strong><br />
		</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Si queremos guardar los subtítulos con otro formato, usaremos el Subtitle Workshop. Sin complicaciones: Archivo, Cargar subtítulo y Archivo, Guardar como. Lo complicado, para mí, acostumbrado a ver sólo las extensiones de los subtítulos, fue acertar con el formato. SRT es SubRip.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Un problema que podemos tener en Subtitle Workshop es la aparición de símbolos extraños en lugar de signos de puntuación, vocales con tildes y cosas así. Para evitarlo es tan simple como abrir primero el archivo de subtítulos con el venerable Bloc de Notas, Guardar como y en Codificación elegir ANSI.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt"><strong>3) Meter de nuevo</strong><br />
		</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Con el mmg.exe (Mkvmerge GUI). En Archivos de entrada pinchamos en Añadir y elegimos los archivos con los que vamos a trabajar, el MKV y el de subtítulos. Por lo general, él solo ofrece añadir automáticamente el subtítulo. Indicamos el nombre del archivo de salida, pinchamos en Iniciar multiplexado y esperamos a que termine.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Con la última versión del programa puede haber problemas al reproducir el MKV resultante en reproductores de salón, como el TDT de marras para el que lié todo esto. La solución consiste en, antes de iniciar el multiplexado, seleccionar tanto el vídeo como el audio del archivo (en la sección de Pistas, capítulos y etiquetas), pinchar en la pestaña Opciones adicionales y, en Compresión, seleccionar explícitamente Ninguna, o bien ir a Archivo, Opciones, pestaña mmg y marcar o desmarcar (según funcione) &#8220;Deshabilitar eliminador de la compresión del encabezado para audio y vídeo predeterminadamente&#8221; (en inglés es bastante más corto).<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Es un jaleo, pero realmente no lleva más de dos minutos por episodio. Es una pesadez, pero por lo menos puedo disfrutar de mis capítulos en la tele, mientras monto el sobremesa de nuevo.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/07/15/mkv-con-subtitulos-en-tdt-easy-home-hd10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En las garras del mal: Windows Phone</title>
		<link>http://cromo.cda-ie.es/2011/06/28/en-las-garras-del-mal-windows-phone/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=en-las-garras-del-mal-windows-phone</link>
		<comments>http://cromo.cda-ie.es/2011/06/28/en-las-garras-del-mal-windows-phone/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 16:43:43 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Windows Phone]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=353</guid>
		<description><![CDATA[Estos días pasados me he hecho, by my beautiful face™, con un móvil nuevo con Windows Phone 7. Hace un tiempo comenté que pensaba hacerme de uno, pero que su falta de sincronización directa me hizo descartarlo. Con el tiempo, este descarte quedaba aún más obligado al no poder ver en directo un cacharro con [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Estos días pasados me he hecho, <em>by my beautiful face™</em>, con un móvil nuevo con Windows Phone 7. <a href="http://cromo.cda-ie.es/2010/12/30/%C2%BFno-con-outlook/">Hace un tiempo</a> comenté que pensaba hacerme de uno, pero que su falta de sincronización directa me hizo descartarlo. Con el tiempo, este descarte quedaba aún más obligado al no poder ver en directo un cacharro con el nuevo sistema de los de Redmond: está muy maltratado por las operadoras y las tiendas de telefonía. Supongo que cuando lleguen los modelos de Nokia lo veremos más, que los <em>hierros</em> finlandeses gozan de gran predicamento por estos lares.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Tengo móvil nuevo, decía. Un poco triste el sacarlo de la caja: el anterior que tuve, un Touch del mismo fabricante, venía en una caja negra de cartón duro y cierre magnético que aún conservo, con protector de pantalla, manual tocho, una buena funda y puntero de reserva. El nuevo, más grande y más caro, viene constreñido en una caja barata, con guía rápida y poco más. Tristes nuevos tiempos.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El cacharro es un señor cacharro, aunque no le pueda colgar la llave del <em>Lancelot</em> que llevo en el Touch. Mueve con soltura lo que le han metido, el nuevo invento de Spectra para dominar los móviles, después de que la malvada <em>cool</em> Apple cambiara las reglas hace ya su buen tiempo con el <em>ay!fon</em>. El mal aprende del mal y nos hace firmar un pacto con la manzana (iba a decir con el diablo, pero aquél se conformaba con el alma) limitando muy mucho lo que podemos meter en el sistema y cómo. En la semana que llevo con el cacharro ya hay algunas cosas que echo de menos del viejo, venerable y obsoleto Windows Mobile/CE.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Pero los sistemas como Mobile o el mismísimo Symbian se han quedado viejos. Ahora que vivimos (o vamos camino de vivir) <em>en la nube</em> (siempre que no nos preguntemos dónde están nuestros datos, no sea que nos dé un soponcio) y consumimos servicios <em>en la nube</em> y, en general, es moda no tener los pies en el suelo, estos viejos sistemas que nos daban el control sobre lo que sucedía en nuestro móvil se extinguen, apartados a puntapiés de la carrera evolutiva. Pasamos a darle el control de nuestro móvil a la operadora si nos daba un buen cacharro y un servicio medio decente. El siguiente paso ¿lógico? era dar el control total al fabricante. Así, leo en multitud de sitios que a Windows Phone le hace falta una buena tienda de aplicaciones, no el poder instalar esas aplicaciones sin tener que pasar por la dichosa tienda, y cosas así. Horror de los horrores. ¿Adónde hemos llegado?<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">En fin, podía hacer oídos sordos a los cantos de sirena de los tres diablos (el <em>cool</em>, el <em>malomalo</em> y el <em>buenobueno</em>) y seguir con mi viejo cacharro (SCUMMVM al poder), o pasarme a un Symbian. Pero el problema es que, aunque fui fuerte y resisit la tentación <em>cool</em> y la <em>buenrollista</em>, he terminado probando la opción <em>maligna der tó</em>. Y resulta que la maldita es buena de narices. Y las preocupaciones y quejas que tenía de antes (no sincroniza con Outlook, no deja instalar aplicaciones si no es a través de su tienda de aplicaciones, ¿qué pasa con mis datos?&#8230;) han pasado a un discreto segundo plano.  </span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/06/28/en-las-garras-del-mal-windows-phone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El infierno de los códigos de barras</title>
		<link>http://cromo.cda-ie.es/2011/06/23/el-infierno-de-los-codigos-de-barras/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=el-infierno-de-los-codigos-de-barras</link>
		<comments>http://cromo.cda-ie.es/2011/06/23/el-infierno-de-los-codigos-de-barras/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 12:00:59 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Cuentos desde la Cripta]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/2011/06/23/el-infierno-de-los-codigos-de-barras/</guid>
		<description><![CDATA[Con motivo del día de Satán, también conocido como nuestro arranque con SAP B1, hemos tenido un fin de semana horroroso de preparativos que se alargó un día más de lo previsto, como colofón a una semana horrorosa y preludio a otra igual de terrible. Una de las cosas que más guerra nos ha dado [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Con motivo del día de Satán, también conocido como nuestro arranque con SAP B1, hemos tenido un fin de semana horroroso de preparativos que se alargó un día más de lo previsto, como colofón a una semana horrorosa y preludio a otra igual de terrible. Una de las cosas que más guerra nos ha dado la impresión de etiquetas de códigos de barra que antes las hacíamos con un programa y ahora teníamos pensado emplear informes de Crystal Reports. No había manera de conseguir imprimir un EAN14 válido. El problema añadido es que en Internet no encontrábamos mucha ayuda.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Al final, la solución vino de un foro del <a href="http://www.portalfox.com/index.php?name=News&amp;file=article&amp;sid=117&amp;mode=nested&amp;order=0&amp;thold=0"><strong>venerable Visual FoxPro</strong></a>, solución que resumo aquí como aviso para navegantes:<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El EAN/DUN14 es un churro de números. Información sobre cómo componer un número válido es fácil de encontrar: que debe tener un número par de cifras, cómo se calcula el dígito de control, la norma para su composición… Pero averiguar cómo imprimir eso en un código de barras es harina de otro costal.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Para el código de barras se usa una codificación <strong>Interleaved 2 of 5</strong>, que representa dos números como un grupo de cinco líneas y espacios. Aquí viene nuestro problema, porque con una fuente de texto sola no hacemos nada: cada carácter de nuestro código de barras se corresponde con dos números de nuestro DUN14. O sea, nuestro código de barras tendrá la mitad de caracteres que nuestro DUN14. Esto nos obliga a usar un algoritmo que nos convierta nuestro chorro de números en esa cadena. Esta cadena, con un tipo de letra Interleaved 2 of 5, será nuestro código de barras.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Y aquí es donde se nos presenta el problema, porque el algoritmo depende de la fuente empleada (o al revés, vamos). De nada nos vale una fuente I2o5 si no tenemos el algoritmo. ¿Por qué? Porque los casos que he visto funcionan del siguiente modo:<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Vamos recorriendo nuestro DUN14, cogiendo cada par de números. Al número que representan (por ejemplo, 58) se le suma un valor dado (digamos 52). Se obtiene el carácter correspondiente a ese código numérico (110) y ése, en nuestra fuente I2o5, se corresponderá con las cinco barras-espacios que necesitamos. Como se ve, si nuestra fuente no es la correspondiente a nuestro algoritmo, el carácter representado no tiene por qué coincidir (y no lo hará) con el buscado.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Al final, debemos tener una cadena de caracteres formada por un carácter de apertura, la cadena tratada y un carácter de fin, que nuestro lector será capaz de entender.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">En el artículo que menciono antes encontramos código para generar una representación de nuestro DUN14 para una fuente I2o5 y, además, <a href="http://www.portalfox.com/articulos/archivos/fuentes.zip"><strong>nos da la fuente</strong></a>. El código, pese a los nombres de las variables, es muy simple: la mayor parte de la función se dedica en calcular el dígito de control y en asegurarse que la longitud sea correcta. Si ya tenemos nuestro código válido, todo se reduce a lo siguiente:<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">1) Tomamos cada par de números de nuestro código (para 14 cifras tendremos, pues, 7 pares).<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">2) Si el número de dos cifras que componen es menor de 50, le sumamos 48. Si es mayor, 142.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">3) Sacamos el carácter correspondiente a ese código.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">4) Formamos una nueva cadena de caracteres con los que hemos obtenido, en orden.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">5) Como cabecera le añadimos el carácter 40 y como cierre, el 41 (los paréntesis)<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">6) Aplicamos la fuente I2o5 que acompaña al ejemplo y listo.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">La primera aplicación de esto la hice a mano, en Excel, para un código dado y la alegría de ver cómo el lector entendía el puñetero código después de tan horroroso y desesperante fin de semana es difícil de explicar.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/06/23/el-infierno-de-los-codigos-de-barras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restaurar Menú Inicio Todos los programas en Windows 7</title>
		<link>http://cromo.cda-ie.es/2011/06/10/restaurar-menu-inicio-todos-los-programas-en-windows-7/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=restaurar-menu-inicio-todos-los-programas-en-windows-7</link>
		<comments>http://cromo.cda-ie.es/2011/06/10/restaurar-menu-inicio-todos-los-programas-en-windows-7/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 08:04:43 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows Vista]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/2011/06/10/restaurar-menu-inicio-todos-los-programas-en-windows-7/</guid>
		<description><![CDATA[Si a raíz de una infección vírica se han borrado los accesos directos de Menú Inicio\Todos los programas en Windows 7/Vista y/o los iconos de acceso directo del escritorio de todos los usuarios (antiguo All Users, ahora Public), probar lo siguiente: 1) Que la carpeta AppData\Local\Temp\smtmp\1\ dentro de la cuenta de nuestro usuario (C:\Users\Usuario\AppData\Local\Temp\smtmp\1\) existe [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Si a raíz de una infección vírica se han borrado los accesos directos de Menú Inicio\Todos los programas en Windows 7/Vista y/o los iconos de acceso directo del escritorio de todos los usuarios (antiguo All Users, ahora Public), probar lo siguiente:<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">1) Que la carpeta AppData\Local\Temp\smtmp\1\ dentro de la cuenta de nuestro usuario (C:\Users\Usuario\AppData\Local\Temp\smtmp\1\) existe y tiene todas las carpetas y accesos directos del Todos los programas<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">2) Que la carpeta AppData\Local\Temp\smtmp\4\ dentro de la cuenta de nuestro usuario (C:\Users\&lt;Usuario&gt;\AppData\Local\Temp\smtmp\4\) existe y tiene los elementos del escritorio público.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Si es así, sólo queda restaurarlos. La forma más rápida es abrir una ventana de comando con permisos de Administrador (ojo con esto) y tirar de Xcopy:<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Consolas; font-size:10pt">xcopy %Temp%\smtmp\1 &#8220;C:\ProgramData\Microsoft\Windows\Start Menu&#8221;  /H /I /S /Y /C<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Consolas; font-size:10pt">xcopy %Temp%\smtmp\4 &#8220;C:\Users\Public\Desktop&#8221; /H /I /S /Y /C<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El bicho en cuestión también había hecho desaparecer todo lo existente en Users. En casos como ese es importante no dejarse llevar por el pánico. Puede haberlos ocultado o convertido en archivos de sistema. El comando Attrib es de gran ayuda en estos casos. Como antes, siempre ejecutando la consola en modo administrador.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/06/10/restaurar-menu-inicio-todos-los-programas-en-windows-7/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tocamiento de narices de un TextBox</title>
		<link>http://cromo.cda-ie.es/2011/03/31/tocamiento-de-narices-de-un-textbox/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tocamiento-de-narices-de-un-textbox</link>
		<comments>http://cromo.cda-ie.es/2011/03/31/tocamiento-de-narices-de-un-textbox/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 09:44:55 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=346</guid>
		<description><![CDATA[Ando estos días programando una serie de plantillas y controles personalizados. He estado preparando un TextBox personalizado con posibilidad de validación y filtrado de datos de serie o mediante validadores/filtradores a medida que implementen cierta interfaz. Hasta ahí sin problema. Como el tipo de TextBox en cuestión va a ir montado, como regla general, sobre [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Ando estos días programando una serie de plantillas y controles personalizados. He estado preparando un TextBox personalizado con posibilidad de validación y filtrado de datos de serie o mediante validadores/filtradores a medida que implementen cierta interfaz. Hasta ahí sin problema. Como el tipo de TextBox en cuestión va a ir montado, como regla general, sobre un formulario o un control de usuario que incorporan un sistema de gestión del estado (VerDatos, Modificar, Nuevo, etc.) se me ha ocurrido que el TextBox ajuste su estado ReadOnly automáticamente. Vale, sin problema. Ha funcionado a la primera. Salvo por un pequeño detalle visual.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Al indicar ReadOnly=True el color de fondo del TextBox cambia.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Pensé en controlar el evento ReadOnlyChanged, pero no conozco el color de fondo anterior al cambio y, francamente, saberlo complicaría más las cosas (reescribir la propiedad BackColor y el método OnReadOnlyChanged). Reescribir el método OnPaint, que de todas formas ni se me pasaba por la cabeza, no serviría porque, leído <a href="http://www.dotnetmonster.com/Uwe/Forum.aspx/winform-controls/2267/TextBox-readonly-background-colour"><strong>aquí</strong></a>, el cambio de color provocado por el cambio de ReadOnly se hace &#8220;por su cuenta&#8221; (<em>Actually, .Net TextBox is a simple wrapper of Win32 Edit control, and it passes the painting issue to the Win32 Edit control</em>). En el mensaje en cuestión se propone sobreescribir la propiedad ReadOnly del TextBox, algo que parece sencillo, simple y razonablemente elegante.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Salvo por otro pequeño problema: ReadOnly es una palabra reservada. Todo intento de crear una propiedad que se llame ReadOnly es frustrada por el propio IDE. ¿Cómo se hace para llamar a una propiedad como una palabra reservada?<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Este pequeño problema me ha llevado bastante rato solucionarlo, así que lo comparto. Es una tontería y tiene su lógica, pero me ha hecho perder un tiempo precioso.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Usar corchetes:<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Public Overloads Property [ReadOnly] as Boolean<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">En fin, sigamos…</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/03/31/tocamiento-de-narices-de-un-textbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

