<?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>a nil value</title>
	<atom:link href="http://www.gzafra.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gzafra.com</link>
	<description>Blog sobre programación e informática en general (Por Guillermo Zafra)</description>
	<lastBuildDate>Mon, 24 May 2010 08:01:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Cita del día</title>
		<link>http://www.gzafra.com/2010/05/24/cita-del-dia-2/</link>
		<comments>http://www.gzafra.com/2010/05/24/cita-del-dia-2/#comments</comments>
		<pubDate>Mon, 24 May 2010 08:01:18 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[citas]]></category>
		<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=124</guid>
		<description><![CDATA[
			
				
			
		
&#8220;It&#8217;s not human error, it&#8217;s the chair-to-keyboard interface that&#8217;s broken.&#8221;
&#8220;No es error humano, es el interfaz silla-teclado que está estropeado.&#8221;




]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F05%2F24%2Fcita-del-dia-2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F05%2F24%2Fcita-del-dia-2%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>&#8220;It&#8217;s not human error, it&#8217;s the chair-to-keyboard interface that&#8217;s broken.&#8221;</p>
<p>&#8220;No es error humano, es el interfaz silla-teclado que está estropeado.&#8221;</p>
<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/05/24/cita-del-dia-2/&title=Cita del día&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/05/24/cita-del-dia-2/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/05/24/cita-del-dia-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Truco: El maravilloso bug de los DropDownList</title>
		<link>http://www.gzafra.com/2010/05/13/truco-el-maravilloso-bug-de-los-dropdownlist/</link>
		<comments>http://www.gzafra.com/2010/05/13/truco-el-maravilloso-bug-de-los-dropdownlist/#comments</comments>
		<pubDate>Thu, 13 May 2010 15:36:32 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=121</guid>
		<description><![CDATA[
			
				
			
		
Quizás en alguna ocasión hayamos querido mostrar una ventana &#8220;estilo modal&#8221; por encima del resto del formulario. Es algo muy usado en la programación web y que aumenta de forma considerable la usabilidad del interfaz. Sin embargo, en aplicaciones con muchos controles, nos hemos podido encontrar con un desagradable problema, y es que los controles [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F05%2F13%2Ftruco-el-maravilloso-bug-de-los-dropdownlist%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F05%2F13%2Ftruco-el-maravilloso-bug-de-los-dropdownlist%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Quizás en alguna ocasión hayamos querido mostrar una ventana &#8220;estilo modal&#8221; por encima del resto del formulario. Es algo muy usado en la programación web y que aumenta de forma considerable la usabilidad del interfaz. Sin embargo, en aplicaciones con muchos controles, nos hemos podido encontrar con un desagradable problema, y es que los controles asp.net DropDownList (Select en HTML) ignoran totalmente el estilo z-index de las capas, y como consecuencia aparecen por encima de nuestra ventana modal, estropeando todo el buen aspecto de la aplicación.</p>
<p>Existen dos soluciones conocidas al problema:</p>
<p>La primera, aunque funciona, conlleva la creación de un script que carga mucho trabajo a la aplicación, y según la cantidad de controles que tengamos, puede no ser una posible alternativa.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>f <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> f <span style="color: #339933;">&lt;</span> document.<span style="color: #660066;">forms</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> f<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> elements <span style="color: #339933;">=</span> document.<span style="color: #660066;">forms</span><span style="color: #009900;">&#91;</span>f<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">elements</span><span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// looping through all elements on certain form</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>e <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> e <span style="color: #339933;">&lt;</span> elements.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> e<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>elements<span style="color: #009900;">&#91;</span>e<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">type</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;select-one&quot;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            elements<span style="color: #009900;">&#91;</span>e<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'none'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Este script recorre todos los controles de nuestro formulario, ocultando aquellos que sean del tipo Select. Claro que si tenemos un número finito de este tipo de controles podemos obviar el bucle e ir directamente al grano.</p>
<p>Una vez los tengamos ocultos podemos mostrar nuestra ventana modal sin riesgo a que sea destrozada por los Select, que estarán ocultos.</p>
<p>Por supuesto hay que controlar que, una vez hayamos acabado con la ventana modal, hay que volver a mostrar estos controles usando el mismo sistema.</p>
<p>La segunda alternativa es mas interesante todavía, aunque parece más un &#8220;hack&#8221; que otra cosa, y desconozco hasta que punto sería compatible con todos los navegadores. Consiste en hacer uso del elemento &#8220;iframe&#8221;. Este elemento tiene la característica de aparecer siempre por encima de cualquier otro control web, es decir, incluso por encima de los DropDownList. Y diréis, ¿pero eso no sustituye un problema por otro? Nó exactamente, ya que este elemento admite el estilo z-index y ¡lo cumple!. </p>
<p>Vamos, que podemos mostrar una especie de panel separador entre los controles DropDownList y la ventana modal que queramos mostrar tan solo asignandole un z-index inferior al de nuestra ventana.</p>
<p>Primero añadiríamos el iframe dentro de la ventana que vamos a ocultar y mostrar. Tan solo se mostrará cuando mostremos la ventana.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;iframe</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;iframe&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;iframeLayer&quot;</span> <span style="color: #000066;">frameborder</span>=<span style="color: #ff0000;">&quot;0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/iframe<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Y segundo, añadiremos el estilo correspondiente tal que:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">iframe<span style="color: #6666ff;">.iframeLayer</span>
<span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">:</span><span style="color: #933;">600px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">:</span><span style="color: #933;">300px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">absolute</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">200px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">100px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">z-index</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">10</span><span style="color: #00AA00;">;</span>
&nbsp;
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Hay que tener especial cuidado en especificar exactamente la misma posición y tamaño que la ventana modal. El iframe se mostrará como un area blanca y ocultará todo lo que esté debajo suyo, pero mostrará nuestra ventana siempre que tenga un z-index superior a 10.</p>
<p>El problema de este método es que queramos crear algo más complejo, o por ejemplo crear un fondo transparente, ya que en ese caso, en lugar de crear un iframe para el area de la ventana, tendremos que crear un iframe para el area de cada control DropDownList que tengamos, lo cual ya es otra historia.</p>
<p>La elección es vuestra. Un saludo</p>
<p><strong>Fuente:</strong> <a href="http://www.codeproject.com/KB/HTML/dropdown_div.aspx">CodeProject</a></p>
<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/05/13/truco-el-maravilloso-bug-de-los-dropdownlist/&title=Truco: El maravilloso bug de los DropDownList&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/05/13/truco-el-maravilloso-bug-de-los-dropdownlist/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/05/13/truco-el-maravilloso-bug-de-los-dropdownlist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript: Pasar de una lista a otra guardando la posición.</title>
		<link>http://www.gzafra.com/2010/05/12/javascript-pasar-de-una-lista-a-otra-guardando-la-posicion/</link>
		<comments>http://www.gzafra.com/2010/05/12/javascript-pasar-de-una-lista-a-otra-guardando-la-posicion/#comments</comments>
		<pubDate>Wed, 12 May 2010 14:29:43 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=114</guid>
		<description><![CDATA[
			
				
			
		
Supongamos que queremos crear una de esas maravillosas listas dobles de items que nos permita pasar el objeto seleccionado de una lista a otra y viceversa. Esto no tiene ningún secreto, pero si quisieramos que al volver a pasar un item de la segunda lista a la original lo hiciera en la posición en la [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F05%2F12%2Fjavascript-pasar-de-una-lista-a-otra-guardando-la-posicion%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F05%2F12%2Fjavascript-pasar-de-una-lista-a-otra-guardando-la-posicion%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Supongamos que queremos crear una de esas maravillosas listas dobles de items que nos permita pasar el objeto seleccionado de una lista a otra y viceversa. Esto no tiene ningún secreto, pero si quisieramos que al volver a pasar un item de la segunda lista a la original lo hiciera en la posición en la que estaba originalmente, la cosa se complica un poco.</p>
<p>Esta es una solución. Quizás no la mejor, pero sirve:</p>
<p>Para esto lo primero que tendremos que tener es 3 controles ListBox; dos para las listas de origen y destino, y uno oculto para guardar estáticamente la lista original.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;asp:ListBox</span> <span style="color: #000066;">ID</span>=<span style="color: #ff0000;">&quot;lstOrigen&quot;</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000066;">Width</span>=<span style="color: #ff0000;">&quot;600px&quot;</span> Height =<span style="color: #ff0000;">&quot;150px&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/asp:ListBox<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;br</span> <span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;br</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;asp:ListBox</span> <span style="color: #000066;">ID</span>=<span style="color: #ff0000;">&quot;lstOculto&quot;</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000066;">Width</span>=<span style="color: #ff0000;">&quot;1px&quot;</span> Height =<span style="color: #ff0000;">&quot;1px&quot;</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;display:none&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/asp:ListBox<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;br</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;asp:ListBox</span> <span style="color: #000066;">ID</span>=<span style="color: #ff0000;">&quot;lstDestino&quot;</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000066;">Width</span>=<span style="color: #ff0000;">&quot;150px&quot;</span> Height =<span style="color: #ff0000;">&quot;150px&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/asp:ListBox<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Seguidamente, añadiremos nuestro código javascript maravilloso:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">       <span style="color: #003366; font-weight: bold;">function</span> Add<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
           <span style="color: #003366; font-weight: bold;">var</span> lbOrigen <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'lstOrigen'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
           <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>lbOrigen.<span style="color: #660066;">options</span>.<span style="color: #660066;">selectedIndex</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> lbDestino <span style="color: #339933;">=</span>  document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'lstDestino'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//obtenemos el contro listbox</span>
                <span style="color: #003366; font-weight: bold;">var</span> selectedText <span style="color: #339933;">=</span> lbOrigen.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>lbOrigen.<span style="color: #660066;">options</span>.<span style="color: #660066;">selectedIndex</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">text</span><span style="color: #339933;">;</span>
                <span style="color: #003366; font-weight: bold;">var</span> selectedValue <span style="color: #339933;">=</span> lbOrigen.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>lbOrigen.<span style="color: #660066;">options</span>.<span style="color: #660066;">selectedIndex</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> lbDestino.<span style="color: #660066;">options</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">//buscamos coincidencias</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>lbDestino.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>selectedValue.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                    <span style="color: #009900;">&#123;</span>
                                  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
                  <span style="color: #003366; font-weight: bold;">var</span> opt <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;option&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                  opt.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> selectedText<span style="color: #339933;">;</span>
                  opt.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> selectedValue<span style="color: #339933;">;</span>
                  lbDestino.<span style="color: #660066;">options</span>.<span style="color: #660066;">add</span><span style="color: #009900;">&#40;</span>opt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                  lbOrigen.<span style="color: #660066;">options</span>.<span style="color: #660066;">remove</span><span style="color: #009900;">&#40;</span>lbOrigen.<span style="color: #660066;">options</span>.<span style="color: #660066;">selectedIndex</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
           <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #003366; font-weight: bold;">function</span> Remove<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
           <span style="color: #003366; font-weight: bold;">var</span> lbDestino <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'lstDestino'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
           <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>lbDestino.<span style="color: #660066;">options</span>.<span style="color: #660066;">selectedIndex</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> lbOculto <span style="color: #339933;">=</span>  document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'lstOculto'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//obtenemos el contro listbox</span>
                <span style="color: #003366; font-weight: bold;">var</span> lbOrigen <span style="color: #339933;">=</span>  document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'lstDestino'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//obtenemos el contro listbox</span>
                <span style="color: #003366; font-weight: bold;">var</span> selectedText <span style="color: #339933;">=</span> lbDestino.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>lbDestino.<span style="color: #660066;">options</span>.<span style="color: #660066;">selectedIndex</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">text</span><span style="color: #339933;">;</span>
                <span style="color: #003366; font-weight: bold;">var</span> selectedValue <span style="color: #339933;">=</span> lbDestino.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>lbDestino.<span style="color: #660066;">options</span>.<span style="color: #660066;">selectedIndex</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
                <span style="color: #003366; font-weight: bold;">var</span> found <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//flag que nos indica si hemos encontrado el item en el listado de destino</span>
                clearListBox<span style="color: #009900;">&#40;</span>lbOrigen<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//limpiamos la lista de origen</span>
                <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> lbOculto.<span style="color: #660066;">options</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">//buscamos coincidencias del listado original</span>
                <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> j<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> lbDestino.<span style="color: #660066;">options</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">//buscamos en el listado de añadidos</span>
                    <span style="color: #009900;">&#123;</span>
                        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>lbOculto.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>lbDestino.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">//el item fue movido</span>
                        <span style="color: #009900;">&#123;</span>
                              found <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//hemos encontrado el item</span>
                              <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>lbOculto.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>selectedValue.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                                 <span style="color: #006600; font-style: italic;">//si el item esta seleccionado lo añadimos al listado de origen</span>
                                 lbOrigen.<span style="color: #660066;">options</span>.<span style="color: #660066;">add</span><span style="color: #009900;">&#40;</span>crearListItem<span style="color: #009900;">&#40;</span>selectedText<span style="color: #339933;">,</span>selectedValue<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                 <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                              <span style="color: #009900;">&#125;</span>
                        <span style="color: #009900;">&#125;</span>
                    <span style="color: #009900;">&#125;</span>
                       <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>found <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//si no se ha encontrado significa que no está en la lista de destino y debemos añadirlo</span>
                        lbOrigen.<span style="color: #660066;">options</span>.<span style="color: #660066;">add</span><span style="color: #009900;">&#40;</span>crearListItem<span style="color: #009900;">&#40;</span>lbOculto.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">text</span><span style="color: #339933;">,</span>lbOculto.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                       <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
                         found <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//reiniciamos el flag</span>
                       <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
                <span style="color: #009900;">&#125;</span>
                  lbDestino.<span style="color: #660066;">options</span>.<span style="color: #660066;">remove</span><span style="color: #009900;">&#40;</span>lbDestino.<span style="color: #660066;">options</span>.<span style="color: #660066;">selectedIndex</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
           <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #003366; font-weight: bold;">function</span> crearListItem<span style="color: #009900;">&#40;</span>text<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                  <span style="color: #003366; font-weight: bold;">var</span> opt <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;option&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                  opt.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> text<span style="color: #339933;">;</span>
                  opt.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
                  <span style="color: #000066; font-weight: bold;">return</span> opt<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #003366; font-weight: bold;">function</span> clearListBox<span style="color: #009900;">&#40;</span>lb<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span>lb.<span style="color: #660066;">options</span>.<span style="color: #660066;">length</span><span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&gt;=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                lb.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            lb.<span style="color: #660066;">selectedIndex</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Bueno, la función &#8220;Add&#8221; añadirá el item seleccionado de la lista original a la lista de destino. Para ello comprobamos si hay algun item seleccionado y si este no se encuentra ya en la lista destino, lo añadimos y lo eliminamos del origen.</p>
<p>La función remove es más complicada. Inicialmente limpiará la lista de origen (donde queremos devolver el item a su posición original) y la volvera a reconstruir item por item. </p>
<p>Para ello recorrera la lista oculta(donde tenemos el listado completo de items originales) y buscara coincidencias en la lista de destino. Si no existe coincidencias significa que dicho item no se movió, por lo que lo recuperamos en la lista de origen. Si lo encuentra significa que dicho item lo hemos movido anteriormente, por lo que tenemos que comprobar si es el item que queremos devolver a su posición inicial (esta seleccionado).  De ser así, lo añadiremos igualmente a la lista de origen, recuperando asi el item en la posición original (recordad que todo este proceso se realiza en función a la lista oculta), si no está seleccionado, lo obviamos ya que dicho item permanecerá en la lista de destino.</p>
<p>Finalmente eliminamos el item que hemos movido de la lista destino.</p>
<p>Las dos últimas funciones sirven para borrar todos los items de un ListBox y para crear un ListItem con un value y text determinados.</p>
<p>Un saludo</p>
<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/05/12/javascript-pasar-de-una-lista-a-otra-guardando-la-posicion/&title=Javascript: Pasar de una lista a otra guardando la posición.&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/05/12/javascript-pasar-de-una-lista-a-otra-guardando-la-posicion/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/05/12/javascript-pasar-de-una-lista-a-otra-guardando-la-posicion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cita del día</title>
		<link>http://www.gzafra.com/2010/05/12/cita-del-dia/</link>
		<comments>http://www.gzafra.com/2010/05/12/cita-del-dia/#comments</comments>
		<pubDate>Wed, 12 May 2010 08:42:23 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=111</guid>
		<description><![CDATA[
			
				
			
		
&#8220;I don&#8217;t code for fun. I code for money, but I also have fun doing it.&#8221;
&#8220;No programo por diversión. Programo por dinero, pero igualmente me divierto haciéndolo.&#8221;




]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F05%2F12%2Fcita-del-dia%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F05%2F12%2Fcita-del-dia%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>&#8220;I don&#8217;t code for fun. I code for money, but I also have fun doing it.&#8221;</p>
<p>&#8220;No programo por diversión. Programo por dinero, pero igualmente me divierto haciéndolo.&#8221;</p>
<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/05/12/cita-del-dia/&title=Cita del día&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/05/12/cita-del-dia/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/05/12/cita-del-dia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Crear una máquina virtual del Leopard con VMWARE</title>
		<link>http://www.gzafra.com/2010/04/20/tutorial-crear-una-maquina-virtual-del-leopard-con-vmware/</link>
		<comments>http://www.gzafra.com/2010/04/20/tutorial-crear-una-maquina-virtual-del-leopard-con-vmware/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 15:56:38 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[miniguías]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=106</guid>
		<description><![CDATA[
			
				
			
		

Puedes necesitarla por varias razones; si quieres programar para Mac, para el iPhone, o si simplemente quieres echarle un vistazo al sistema. Ahora bien, no recomiendo usarlo como sistema para el &#8220;día a día&#8221; ya que es bastante inestable y tiene muchos problemas, pero para salir del paso sirve.
NOTA: Antes de comenzar hay que matizar [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F20%2Ftutorial-crear-una-maquina-virtual-del-leopard-con-vmware%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F20%2Ftutorial-crear-una-maquina-virtual-del-leopard-con-vmware%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://www.gzafra.com/wp-content/uploads/2010/04/vmplayer-osx01.png"><img src="http://www.gzafra.com/wp-content/uploads/2010/04/vmplayer-osx01.png" alt="" title="vmplayer-osx01" width="480" height="358" class="alignnone size-full wp-image-107" /></a></p>
<p>Puedes necesitarla por varias razones; si quieres programar para Mac, para el iPhone, o si simplemente quieres echarle un vistazo al sistema. Ahora bien, no recomiendo usarlo como sistema para el &#8220;día a día&#8221; ya que es bastante inestable y tiene muchos problemas, pero para salir del paso sirve.</p>
<p><strong>NOTA:</strong> Antes de comenzar hay que matizar que los pasos que aquí explicaré pueden no ser los mismos para todos los sistemas. VMWare virtualiza un equipo en funcion del hardware donde se instale, por lo que tendréis que usar un poco de lógica e intuición si no os funciona.</p>
<p>Lo primero que necesitamos es un VMWare versión 6.5 o posterior y una imagen de Leopard. Recomiendo encarecidamente una que se llama iatkos v7 (podeis buscar por Google que seguro que la encontrais). Esta imagen tiene la virtud de poseer una versión de Leopard 10.5.7, lo cual es muy bueno para instalar SDK relativamente modernos. (Podremos instalar hasta cualquier SDK 3.1.x del iPhone) </p>
<p><strong>PASO 1 &#8220;Creando la máquina virtual&#8221;</strong></p>
<p>1.- Creamos una nueva máquina virtual desde el VMWare.<br />
2.- Seleccionamos Custom.<br />
3.- Elegimos el sistema operativo, en nuestro caso tenemos dos opciones; o Windows NT u Otros > FreeBSD64. Recomiendo comenzar con Windows NT y probar FreeBSD64 cómo segunda opción.<br />
4.- Cuando nos pida el disco de instalación seleccionamos la imágen .iso de iatkos que ya deberíamos tener.<br />
5.- Elegimos 1 PROCESADOR y un mínimo de 512RAM.<br />
6.- En red elegimos host-only ya que le meteremos un parche después para que funcione.<br />
7.- En SCSI Adapter elegimos LSI Logic, creamos un nuevo disco virtual tipo IDE y ponemos mínimo 16GB (Si queremos instalar el SDK para programar recomiendo al menos 20GB)<br />
8.- Finalizamos la creación de la máquina virtual.</p>
<p><strong>PASO 2 &#8220;Instalación&#8221;</strong></p>
<p>1.- Llegamos a la parte de la instalación. Arrancamos la máquina y cuando nos indique que presionemos F8 durante el arranque para entrar en el modo consola.<br />
2.- Escribimos: &#8220;-v busratio=7 cpus=1&#8243; y pulsamos Enter.<br />
3.- La instalación comienza y nos aparece la primera pantalla, que aceptaremos dandole al boton de la flecha.<br />
4.- Antes de continuar vamos a Utilities y de ahí a Disk Utility.<br />
5.- Seleccionamos la partición de 20GB que hemos creado y le damos a Erase. (Ponemos el nombre que queramos y dejamos el formato por defecto)<br />
6.- Le damos a salir pulsando la X roja y continuamos la instalación, eligiendo la nueva partición que hemos creado.<br />
7.- Antes de terminar, le daremos al boton de customize que nos habrá aparecido y añadimos los siguientes add-ons:<br />
     &#8211; x86patches -> kernel -> voodoo 9.7.0<br />
     &#8211; drivers->system-> sata-ide -> intel sata/ide (o amd si tenemos un amd)<br />
     &#8211; [OPCIONAL] drivers -> USB (Si tienes pensado usar algun disco USB o realmente lo necesitas. Aunque suele pegarse con los demás dispositivos USB)<br />
     [Ahora tendrás que echarle imaginación]<br />
     Si usas ratón o teclado USB deberías seleccionar:<br />
     &#8211; x86patches -> ACPI -> x86 ACPI<br />
     &#8211; ps2-> apple ps2 mouse &#038; keyboard<br />
     Si usas ratón y teclado PS2:<br />
    &#8211; ps2 -> voodoo ps2 mouse &#038; keyboard<br />
8.- Aceptamos y comenzamos la instalación. (podemos darle a skip en la comprobación)</p>
<p><strong>PASO 3 &#8220;Primer arranque&#8221;</strong></p>
<p>1.- Una vez termina la instalación se reiniciará el sistema y pueden ocurrir dos cosas. Que te arranque a la primera sin tocar nada (tienes una flor en el culo) o que empiece a entrar en un maravilloso bucle de reinicios infinito. (Si tienes activadas las alertas te dara un petardazo del kernel y al aceptar se reiniciará).</p>
<p>2.- Lo que tenemos que hacer es darle a F8 (aunque creo que cualquier tecla sirve), durante el arranque y escribir nuestro maravilloso: &#8220;-v busratio=7 cpus=1&#8243; y darle a ENTER. (Estoy convencido de que se podría configurar para no tener que escribirlo cada arranque, pero no he conseguido hacerlo, así que en cada reinicio tendremos que hacer  lo mismo para que reinicie)</p>
<p>El parámetro -v activa el modo VERBOSE, que nos dirá paso por paso lo que está haciendo el sistema. Es bastante útil si no conseguimos arrancar para saber qué está causando el problema. Si es un driver problemático, la última linea antes del petardazo nos indicará cual es. En cualquier caso, hay que tener paciencia con el arranque; si no arranca, probad varias veces antes de descartar que la máquina no funcione.</p>
<p>3.- Si dios quiere arrancaremos el sistema y todo funcionará correctamente (más o menos, el sonido es un coñazo configurarlo)<br />
4.- Nos pedirá que configuremos nuestro equipo y fiesta. Tendremos nuestra máquina virtual de Leopard 10.5.7.</p>
<p><strong>PASO 4 &#8220;Configurando la red&#8221;</strong></p>
<p>El último paso que nos queda es configurar la red. Es opcional ya que podemos no necesitarla.</p>
<p>1.- Para ello tendremos que bajarnos el siguiente archivo: <a href="http://rapidshare.com/files/353866969/Maxxuss-AMDPCNET-v1.0.iso">http://rapidshare.com/files/353866969/Maxxuss-AMDPCNET-v1.0.iso</a><br />
2.- Una vez lo tengamos, lo descomprimimos y nos aparecerá una ISO. Con la VM apagada seleccionamos este ISO en la unidad de CD/DVD.<br />
3.- Antes de arrancar la máquina, vamos al directorio donde la tengamos en nuestro equipo y editamos el archivo .vmx con el Notepad.<br />
4.- Agregamos la siguiente linea: ethernet0.virtualDev = “e1000? Guardamos y arrancamos el sistema.<br />
5.- Una vez dentro de Leopard de nuevo, copiamos el contenido del ISO que hemos cargado en cualquier lugar localizable.<br />
6.- Iniciamos el Terminal y escribimos lo siguiente:<br />
$ sudo ./install.sh<br />
$ sudo reboot</p>
<p>(<strong>NOTA:</strong> Debemos estar localizados en la ruta donde hayamos copiado el contenido del ISO, y dentro de la carpeta. Nos pedirá la contraseña del sistema y reiniciará la máquina)</p>
<p>7.- Al reiniciar, iremos a Ajustes -> Network y nos indicará que hay un nuevo dispositivo. Aceptamos y seleccionamos DHCP. Cerramos y voila! Deberíamos tener acceso por red a nuestro equipo y a internet.</p>
<p>Eso es todo amigos! Espero que haya sido de utilidad.</p>
<p>Un saludo</p>
<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/04/20/tutorial-crear-una-maquina-virtual-del-leopard-con-vmware/&title=Tutorial: Crear una máquina virtual del Leopard con VMWARE&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/04/20/tutorial-crear-una-maquina-virtual-del-leopard-con-vmware/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/04/20/tutorial-crear-una-maquina-virtual-del-leopard-con-vmware/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>&#8220;Bootstrapping&#8221;: Cómo añadir prerrequisitos a nuestros instaladores</title>
		<link>http://www.gzafra.com/2010/04/13/bootstrapping-como-anadir-prerrequisitos-a-nuestros-instaladores/</link>
		<comments>http://www.gzafra.com/2010/04/13/bootstrapping-como-anadir-prerrequisitos-a-nuestros-instaladores/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 16:16:44 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[miniguías]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=102</guid>
		<description><![CDATA[
			
				
			
		
Cuando creamos un instalador para alguno de nuestros proyectos de Visual Studio podemos necesitar incluir como requisito tener instalada algun paquete o complemento e incluso podermos querer añadirlo al instalador para que, si no está instalado, lo haga.
A esto se le conoce como Bootstrapping y es bastante sencillo.
Para ello lo primero que tenemos que hacer [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F13%2Fbootstrapping-como-anadir-prerrequisitos-a-nuestros-instaladores%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F13%2Fbootstrapping-como-anadir-prerrequisitos-a-nuestros-instaladores%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Cuando creamos un instalador para alguno de nuestros proyectos de Visual Studio podemos necesitar incluir como requisito tener instalada algun paquete o complemento e incluso podermos querer añadirlo al instalador para que, si no está instalado, lo haga.</p>
<p>A esto se le conoce como Bootstrapping y es bastante sencillo.</p>
<p>Para ello lo primero que tenemos que hacer es crear un paquete personalizado para cada complemente que queramos añadir como prerrequisito a nuestro instalador. Por ejemplo, si queremos hacer un instalador para nuestra aplicacion y nos damos cuenta de que requiere el Adobe Reader, podemos hacer un paquete llamado AdobeReader con el redistribuible del Adobe Reader.</p>
<p>Antes de nada saber que estos paquetes se añaden desde Visual Studio a la hora de crear un instalador. Dentr del proyecto de instalación, si vamos a Propiedades del proyecto y ahí a Requisitos Previos obtendremos una lista de los paquetes por defecto que se incluyen en el SDK de Visual Studio, que será similar a la siguiente imagen:</p>
<p><a href="http://www.gzafra.com/wp-content/uploads/2010/04/requisitospordefecto.jpg"><img src="http://www.gzafra.com/wp-content/uploads/2010/04/requisitospordefecto.jpg" alt="" title="requisitospordefecto" width="503" height="393" class="alignnone size-full wp-image-103" /></a></p>
<p>Cada uno de estos requisitos equivale a una carpeta con un ejecutable, unos manifiestos (XML) y otros archivos opcionales de configuración.<br />
Todos estos paquetes se encuentran en una ruta del disco que dependerá de la versión de Visual Studio que estemos utilizando:</p>
<p>Visual Studio 2005: <em>C:\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages</em><br />
Visual Studio 2008: <em>C:\Archivos de programa\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages</em></p>
<p>Por lo que lo primero que debemos hacer es ir a la ruta que nos corresponda y crearnos una carpeta con el nombre de nuestro paquete, en nuestro caso &#8220;AdobeReader&#8221;.</p>
<p>El siguiente paso será meter en dicha carpeta el ejecutable que nos instala el AdobeReader. (Hay que tener en cuenta que existen dos versiones de este instalable, al igual que en muchos otros. Una completa que se instala completamente offline y otra online que descarga contenido desde Internet. La primera hara más pesado el contenido de la instalación pero no requerirá acceso a Internet, y la segunda pues obviamente lo contrario)</p>
<p>El tercer paso es crear el manifiesto &#8220;Product.xml&#8221;. Vamos, crear un XML con este nombre al que añadiremos lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Product</span> <span style="color: #000066;">ProductCode</span>=<span style="color: #ff0000;">&quot;AdobeReader&quot;</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://schemas.microsoft.com/developer/2004/01/bootstrapper&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;PackageFiles</span> <span style="color: #000066;">CopyAllPackageFiles</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;PackageFile</span> <span style="color: #000066;">Name</span>=<span style="color: #ff0000;">&quot;AdobeReader-setup.exe&quot;</span> <span style="color: #000066;">Hash</span>=<span style="color: #ff0000;">&quot;F774D8891793C46BDDC1F9418D8E427B6CBAE26D&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/PackageFiles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;InstallChecks<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;FileCheck</span> <span style="color: #000066;">Property</span>=<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">SpecialFolder</span>=<span style="color: #ff0000;">&quot;ProgramFilesFolder&quot;</span> <span style="color: #000066;">SearchPath</span>=<span style="color: #ff0000;">&quot;C:\Archivos de programa\Adobe\Reader 8.0\Reader&quot;</span> <span style="color: #000066;">FileName</span>=<span style="color: #ff0000;">&quot;AcroRd32.exe&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/InstallChecks<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Commands</span> <span style="color: #000066;">Reboot</span>=<span style="color: #ff0000;">&quot;Defer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Command</span> <span style="color: #000066;">PackageFile</span>=<span style="color: #ff0000;">&quot;AdobeReader-setup.exe&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ExitCodes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;DefaultExitCode</span> <span style="color: #000066;">Result</span>=<span style="color: #ff0000;">&quot;Success&quot;</span> <span style="color: #000066;">String</span>=<span style="color: #ff0000;">&quot;Anunexpectedexitcodewasr&quot;</span> <span style="color: #000066;">FormatMessageFromSystem</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ExitCodes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Command<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Commands<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Product<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Este es el manifiesto obligatorio para que el paquete sea reconocido por el Visual Studio. Pero también tenemos el manifiesto &#8220;Package.xml&#8221; que añadirá información adicional a nuestro paquete tal como un EULA, o el idioma de la instalación:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Package</span></span>
<span style="color: #009900;">  <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://schemas.microsoft.com/developer/2004/01/bootstrapper&quot;</span></span>
<span style="color: #009900;">  <span style="color: #000066;">Name</span>=<span style="color: #ff0000;">&quot;AdobeReader&quot;</span></span>
<span style="color: #009900;">  <span style="color: #000066;">Culture</span>=<span style="color: #ff0000;">&quot;Culture&quot;</span></span>
<span style="color: #009900;">  <span style="color: #000066;">LicenseAgreement</span>=<span style="color: #ff0000;">&quot;eula.txt&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;PackageFiles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;PackageFile</span> <span style="color: #000066;">Name</span>=<span style="color: #ff0000;">&quot;eula.txt&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/PackageFiles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Strings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;String</span> <span style="color: #000066;">Name</span>=<span style="color: #ff0000;">&quot;DisplayName&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>AdobeReader<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/String<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;String</span> <span style="color: #000066;">Name</span>=<span style="color: #ff0000;">&quot;Culture&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>es<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/String<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;String</span> <span style="color: #000066;">Name</span>=<span style="color: #ff0000;">&quot;NotAnAdmin&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Debes tener permisos de administrador para poder ejecutar este paquete.<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/String<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;String</span> <span style="color: #000066;">Name</span>=<span style="color: #ff0000;">&quot;GeneralFailure&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>A ocurrido un error al intentar instalar el paquete.<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/String<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Strings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Package<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>En este caso, si añadimos una referencia a &#8220;eula.txt&#8221; tendremos que añadir el correspondiente fichero con el texto que se deberá mostrar en el EULA.</p>
<p>El cuarto paso es importante, y es que si tenemos el Visual Studio instalado en la lengua de Shakespeare, tendremos que añadir un manifiesto por defecto para dicho idioma. Bastará con crear una carpeta llamada &#8220;es&#8221; dentro de nuestro paquete y poner una copia del fichero &#8220;Product.xml&#8221; dentro.</p>
<p>Y ya está! Si volvemos a la ventana del Visual Studio donde se mostraban los prerrequisitos por defecto veremos que aparece nuestro paquete &#8220;AdobeReader&#8221;. Molto facile e divertente.</p>
<p>Y ahora viene la parte buena, que la he puesto al final para joder un poco, que hay que saber cómo funcionan las cosas y hacerlas a lo Clint Eastwood antes de recurrir a lo fácil. Y es que existe una maravillosa herramienta de Microsoft que nos hace todo el trabajo en unos cuantos clicks. Se llama Bootstrapper Manifest Generator y se puede obtener gratuitamente desde la siguiente URL:</p>
<p><a href="http://code.msdn.microsoft.com/bmg" target="_self">http://code.msdn.microsoft.com/bmg</a></p>
<p>La aplicación es bastante sencilla y nos da la posibilidad de crear manifiestos mas complejos añadiendo condiciones y otros parámetros de configuración.</p>
<p>Espero que fuera de ayuda para alguien que lo necesite.</p>
<p>Un saludo</p>
<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/04/13/bootstrapping-como-anadir-prerrequisitos-a-nuestros-instaladores/&title=&#8220;Bootstrapping&#8221;: Cómo añadir prerrequisitos a nuestros instaladores&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/04/13/bootstrapping-como-anadir-prerrequisitos-a-nuestros-instaladores/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/04/13/bootstrapping-como-anadir-prerrequisitos-a-nuestros-instaladores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Busqueda en un ListBox desde Javascript</title>
		<link>http://www.gzafra.com/2010/04/08/busqueda-en-un-listbox-desde-javascript/</link>
		<comments>http://www.gzafra.com/2010/04/08/busqueda-en-un-listbox-desde-javascript/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 08:45:12 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[interfaz]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[miniguías]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=97</guid>
		<description><![CDATA[
			
				
			
		
En ocasiones nos encontraremos que tenemos que mostrar un listado de elementos excesivamente largo, y aunque volcarlos en un ListBox sea una solución, no lo es de cara al usuario, que tendrá que desplazarse por todo el control en busqueda del item que quiera seleccionar.
Para solucionarlo podemos hacer uso de un script muy sencillo que [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F08%2Fbusqueda-en-un-listbox-desde-javascript%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F08%2Fbusqueda-en-un-listbox-desde-javascript%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>En ocasiones nos encontraremos que tenemos que mostrar un listado de elementos excesivamente largo, y aunque volcarlos en un ListBox sea una solución, no lo es de cara al usuario, que tendrá que desplazarse por todo el control en busqueda del item que quiera seleccionar.</p>
<p>Para solucionarlo podemos hacer uso de un script muy sencillo que nos permitirá buscar y seleccionar automaticamente el primer item que incluya el texto introducido, y conforme vayamos introduciendo más carácteres refinará la busqueda.</p>
<p>Para empezar necesitaremos un control ListBox donde tendremos los elementos a buscar y un HTML TEXT donde realizaremos las busquedas. Es recomendable usar un INPUT TEXT en lugar de un TextBox dado que los eventos de cliente del HTML TEXT son reconocidos en tiempo de diseño, mientras que en el TextBox no, aunque a efectos prácticos obtendremos el mismo resultado.</p>
<p>En el control TEXT añadiremos el evento &#8220;onkeyup&#8221; para llamar a la función &#8220;busqueda&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;asp:ListBox <span style="color: #000066;">ID</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;lstItems&quot;</span> runat<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000066;">Width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;154px&quot;</span>&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Alda<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Aldana<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Aldair<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Albano<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Brian<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Cinnia<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Elba<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Fiona<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Ginebra<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Iñigo<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Kenneth<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Marvin<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Oscar<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;asp:ListItem&gt;</span>Quinn<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListItem&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>asp:ListBox&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span> <span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;txtBusqueda&quot;</span> runat<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000066;">onkeyup</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;busqueda(this)&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>Y a continuación añadiremos el siguiente script:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script language<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;javascript&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
    <span style="color: #003366; font-weight: bold;">function</span> busqueda<span style="color: #009900;">&#40;</span>txt<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> l <span style="color: #339933;">=</span>  document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'lstItems'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//obtenemos el contro listbox</span>
        <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>txt.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            LimpiarListBox<span style="color: #009900;">&#40;</span>l<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//si el campo de busqueda esta vacio quitamos seleccion</span>
        <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> l.<span style="color: #660066;">options</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">//buscamos coincidencias</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>l.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">value</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>txt.<span style="color: #660066;">value</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    l.<span style="color: #660066;">options</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">selected</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
                    LimpiarListBox<span style="color: #009900;">&#40;</span>l<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//si no se encuentran coincidencias quitamos seleccion</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">function</span> LimpiarListBox<span style="color: #009900;">&#40;</span>lb<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        lb.<span style="color: #660066;">selectedIndex</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Y voilá, ya tenemos nuestro sistema de búsqueda. Hay que decir que este sistema es muy sencillo pero que se puede complicar todo lo que queramos. Por ejemplo para que busque desde el principio o en una parte de la cadena o value del ListItem. También podemos modificar el evento para que solo busque al perder el foco y mil cosas más.</p>
<p>Si se diera el caso de tener que seleccionar varios items convendría añadir un segundo ListBox de elementos seleccionados y añadir uno a uno los elementos que queramos.</p>
<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/04/08/busqueda-en-un-listbox-desde-javascript/&title=Busqueda en un ListBox desde Javascript&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/04/08/busqueda-en-un-listbox-desde-javascript/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/04/08/busqueda-en-un-listbox-desde-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Truco: Implementar un UpdateProgress manualmente</title>
		<link>http://www.gzafra.com/2010/04/06/truco-implementar-un-updateprogress-manualmente/</link>
		<comments>http://www.gzafra.com/2010/04/06/truco-implementar-un-updateprogress-manualmente/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 11:56:32 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[miniguías]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[Consejos]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=91</guid>
		<description><![CDATA[
			
				
			
		
Cuando se trabaja de forma asíncrona con AJAX y UpdatePanels resulta imprescindible implementar procesos para informar al usuario de que se están efectuando actualizaciones en el servidor.
Por defecto, ASP.NET AJAX nos proporcionar el complemento UpdateProgress, que unido a un ScriptManager y un UpdatePanel permiten mostrar cualquier indicador mientras el UpdatePanel esta trabajando asíncronamente.
No obstante el [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F06%2Ftruco-implementar-un-updateprogress-manualmente%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F06%2Ftruco-implementar-un-updateprogress-manualmente%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Cuando se trabaja de forma asíncrona con AJAX y UpdatePanels resulta imprescindible implementar procesos para informar al usuario de que se están efectuando actualizaciones en el servidor.</p>
<p>Por defecto, ASP.NET AJAX nos proporcionar el complemento UpdateProgress, que unido a un ScriptManager y un UpdatePanel permiten mostrar cualquier indicador mientras el UpdatePanel esta trabajando asíncronamente.</p>
<p>No obstante el UpdateProgress es limitado si queremos realizar tareas o efectos mas complicados. Por ejemplo posicionar el loader dinamicamente en la pantalla segun lo que se actualice, realizar alguna accion de Jscript antes de comenzar la actualización, o permitir al usuario cancelar el proceso.</p>
<p>Para ello existe un maravilloso y muy simple javascript que controla dos eventos importantísimos de la página; el comienzo y el fin del httprequest.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script language<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;javascript&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
Sys.<span style="color: #660066;">WebForms</span>.<span style="color: #660066;">PageRequestManager</span>.<span style="color: #660066;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">add_beginRequest</span><span style="color: #009900;">&#40;</span>
  <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>sender<span style="color: #339933;">,</span> e<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
        $get<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'cargador'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;block&quot;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 Sys.<span style="color: #660066;">WebForms</span>.<span style="color: #660066;">PageRequestManager</span>.<span style="color: #660066;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">add_endRequest</span><span style="color: #009900;">&#40;</span>
  <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>sender<span style="color: #339933;">,</span> e<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
        $get<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'cargador'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;none&quot;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Donde &#8220;cargador&#8221; podría ser, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;cargador&quot;</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;Server&quot;</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;display:none&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;table</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;200&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td</span> <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;50&quot;</span> <span style="color: #000066;">valign</span>=<span style="color: #ff0000;">&quot;bottom&quot;</span> <span style="color: #000066;">align</span>=<span style="color: #ff0000;">&quot;center&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Cargando...<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td</span> <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;50&quot;</span> <span style="color: #000066;">valign</span>=<span style="color: #ff0000;">&quot;top&quot;</span> <span style="color: #000066;">align</span>=<span style="color: #ff0000;">&quot;center&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;img</span> <span style="color: #000066;">alt</span>=<span style="color: #ff0000;">&quot;cargando...&quot;</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;../img/ajax-loader.gif&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/table<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>add_beginRequest se lanzaría antes de comenzar el evento de solicitar información al servidor y add_endRequest justo despues de terminar todo el proceso.</p>
<p>Para cancelar el Request bastaría con mostrar un boton en el beginRequest que lanzara el siguiente script:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> CancelarPostback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> man<span style="color: #339933;">=</span> Sys.<span style="color: #660066;">WebForms</span>.<span style="color: #660066;">PageRequestManager</span>.<span style="color: #660066;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>man.<span style="color: #660066;">get_isInAsyncPostBack</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        man.<span style="color: #660066;">abortPostBack</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Aunque ojo! con este &#8220;Cancelar&#8221; ya que, si bien cancelara el request y forzando el endRequest, el proceso en el servidor es muy probable que se haya ejecutado ya. Mi consejo es que se utilice unicamente para procesos de lectura y no de escritura.</p>
<p>Un saludo</p>
<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/04/06/truco-implementar-un-updateprogress-manualmente/&title=Truco: Implementar un UpdateProgress manualmente&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/04/06/truco-implementar-un-updateprogress-manualmente/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/04/06/truco-implementar-un-updateprogress-manualmente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debate: Objetos por valor y por referencia en .NET</title>
		<link>http://www.gzafra.com/2010/04/05/debate-objetos-por-valor-y-por-referencia-en-net/</link>
		<comments>http://www.gzafra.com/2010/04/05/debate-objetos-por-valor-y-por-referencia-en-net/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 09:08:05 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[debate]]></category>
		<category><![CDATA[teoría]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=83</guid>
		<description><![CDATA[
			
				
			
		
Hace unos días tuvimos un debate entre los compañeros. No voy a explicar la diferencia entre los parámetros pasados por valor o por referencia, así que es aconsejable tener claros los conceptos antes de seguir leyendo.
En este debate, uno de mis compañeros argumentaba que todos los parámetros en .NET se pasan por defecto por valor, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F05%2Fdebate-objetos-por-valor-y-por-referencia-en-net%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F04%2F05%2Fdebate-objetos-por-valor-y-por-referencia-en-net%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Hace unos días tuvimos un debate entre los compañeros. No voy a explicar la diferencia entre los parámetros pasados por valor o por referencia, así que es aconsejable tener claros los conceptos antes de seguir leyendo.</p>
<p>En este debate, uno de mis compañeros argumentaba que todos los parámetros en .NET se pasan por defecto por valor, a no ser que se indique lo contrario. Mientras que el otro sostenía que esto no era así para los objetos (tipos) que, dado que cuando declaramos un objeto realmente estamos declarando una referencia de dicho objeto, estos se pasaban por referencia en las funciones y no por valor.</p>
<p>Para demostrar este último argumento creó un código simple tal que:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">            StringBuilder y <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringBuilder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            y.<span style="color: #0000FF;">Append</span> <span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;hello&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            FooByVal <span style="color: #000000;">&#40;</span>y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">WriteLine</span> <span style="color: #000000;">&#40;</span>y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            FooByRef <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">WriteLine</span> <span style="color: #000000;">&#40;</span>y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">void</span> FooByVal <span style="color: #000000;">&#40;</span>StringBuilder x<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            x.<span style="color: #0000FF;">Append</span> <span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot; and goodbye&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">void</span> FooByRef <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> StringBuilder x<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            x.<span style="color: #0000FF;">Append</span> <span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot; world&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span></pre></div></div>

<p>El resultado fué que, en ambos casos, el objeto StringBuilder y tenía añadidas las cadenas incluidas en ambas funciones, fuera este pasado por referencia o por valor.</p>
<p>¿Podemos concluir que, en .NET, da lo mismo pasar un objeto por referencia que por valor?</p>
<p>Exactamente no. Para entender la diferencia vamos a representar gráficamente la referencia o puntero de nuestro objeto Y, y el espacio en memoria donde se guarda dicho objeto.</p>
<p><a href="http://www.gzafra.com/wp-content/uploads/2010/04/inicializacion.jpg"><img src="http://www.gzafra.com/wp-content/uploads/2010/04/inicializacion.jpg" alt="" title="inicializacion" width="524" height="271" class="alignnone size-full wp-image-85" /></a></p>
<p>En esta imagen vemos cómo, al declarar el objeto Y, estamos creando una referencia o puntero para dicho objeto. Y al inicializar usando new, reservamos en memoria el espacio que utilizaremos para dicho objeto.</p>
<p><a href="http://www.gzafra.com/wp-content/uploads/2010/04/casos.jpg"><img src="http://www.gzafra.com/wp-content/uploads/2010/04/casos.jpg" alt="" title="casos" width="529" height="947" class="alignnone size-full wp-image-86" /></a></p>
<p>Tal y como vemos en la imagen, la diferencia entre pasar el objeto por referencia o por valor está en que, en el primer caso le pasamos la referencia original a dicho objeto, mientras que en el segundo le pasamos una copia de dicha referencia al mismo objeto. En ambos casos estamos modificando el objeto original desde ambas funciones.</p>
<p>¿Donde está entonces la diferencia?</p>
<p>La diferencia se ve cuando, desde estas funciones modificamos no el objeto en memoria sino la referencia a dicho objeto. Por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">            StringBuilder y <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringBuilder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            y.<span style="color: #0000FF;">Append</span> <span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;hello&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            FooByVal <span style="color: #000000;">&#40;</span>y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">WriteLine</span> <span style="color: #000000;">&#40;</span>y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            FooByRef <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            Console.<span style="color: #0000FF;">WriteLine</span> <span style="color: #000000;">&#40;</span>y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF;">void</span> FooByVal <span style="color: #000000;">&#40;</span>StringBuilder x<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            x <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringBuilder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            x.<span style="color: #0000FF;">Append</span> <span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot; and goodbye&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">void</span> FooByRef <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> StringBuilder x<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            x <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringBuilder<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            x.<span style="color: #0000FF;">Append</span> <span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot; world&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span></pre></div></div>

<p>En el caso de FooByVal, el objeto Y con valor &#8220;hello&#8221; permanecerá inalterado al pasar por la función, ya que en esta estamos asignando un nuevo espacio en memoria para la copia de la referencia y modificando otro espacio diferente al original.</p>
<p>En el caso de FooByRef, sin embargo, al pasar la referencia original y volverla a inicializar estaremos asignando un nuevo espacio en memoria para la referencia original, perdiendo el contenido que hemos añadido previamente y asignando uno nuevo &#8221; world&#8221;.</p>
<p>Basta con probar ambos casos para entender la diferencia.</p>
<p>En conclusión:</p>
<p>Ambos tenían razón en sus argumentos. Todos los parámetros en .NET son por defecto pasados por valor, pero dado que los objetos son realmente referencias, lo que estamos pasando por valor no es sino la referencia a dicho objeto en memoria.</p>
<p>Un saludo</p>
<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/04/05/debate-objetos-por-valor-y-por-referencia-en-net/&title=Debate: Objetos por valor y por referencia en .NET&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/04/05/debate-objetos-por-valor-y-por-referencia-en-net/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/04/05/debate-objetos-por-valor-y-por-referencia-en-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambiar la propiedad Text de un CheckBox de ASP.NET desde Javascript</title>
		<link>http://www.gzafra.com/2010/03/30/cambiar-la-propiedad-text-de-un-checkbox-de-asp-net-desde-javascript/</link>
		<comments>http://www.gzafra.com/2010/03/30/cambiar-la-propiedad-text-de-un-checkbox-de-asp-net-desde-javascript/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 15:49:51 +0000</pubDate>
		<dc:creator>gzafra</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.gzafra.com/?p=80</guid>
		<description><![CDATA[
			
				
			
		
Bueno, esta es sencilla y fácil de encontrar pero nunca se sabe cuando puede ser útil. Ahora bien, puede confundir al usuario.

&#60;asp:CheckBox runat=&#34;server&#34; ID=&#34;chkPrueba&#34; onclick=&#34;cambiarTextoCheckBox(this);&#34; /&#62;

Y la función Javascript:

function cambiarTextoCheckBox(checkbox)
{
  if (checkbox.checked)
    checkbox.nextSibling.innerHTML = 'Activado';
  else
    checkbox.nextSibling.innerHTML = 'Desactivado';
}





]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F03%2F30%2Fcambiar-la-propiedad-text-de-un-checkbox-de-asp-net-desde-javascript%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.gzafra.com%2F2010%2F03%2F30%2Fcambiar-la-propiedad-text-de-un-checkbox-de-asp-net-desde-javascript%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Bueno, esta es sencilla y fácil de encontrar pero nunca se sabe cuando puede ser útil. Ahora bien, puede confundir al usuario.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;asp:CheckBox runat=&quot;server&quot; ID=&quot;chkPrueba&quot; onclick=&quot;cambiarTextoCheckBox(this);&quot; /&gt;</pre></div></div>

<p>Y la función Javascript:</p>

<div class="wp_syntax"><div class="code"><pre class="jscript" style="font-family:monospace;">function cambiarTextoCheckBox(checkbox)
{
  if (checkbox.checked)
    checkbox.nextSibling.innerHTML = 'Activado';
  else
    checkbox.nextSibling.innerHTML = 'Desactivado';
}</pre></div></div>

<div id="buzz_share_1" style="float: right; margin-right: 10px">
<a rel="nofollow external" target="_blank" href="http://www.google.com/reader/link?url=http://www.gzafra.com/2010/03/30/cambiar-la-propiedad-text-de-un-checkbox-de-asp-net-desde-javascript/&title=Cambiar la propiedad Text de un CheckBox de ASP.NET desde Javascript&srcURL=http://worpdressapi.com/">
<img width="50" height="58" alt="" src="http://www.gzafra.com/wp-content/plugins/google-buzz-button//images/google-buzz.png" original="http://wordpressapi.com/wp-content/plugins/google-buzz/google-buzz.png" style="display: inline;"/>
</a>
</div><div align="right" style="float:right;padding:5px 20px 0px 20px;"><a name="fb_share" type="button" share_url="http://www.gzafra.com/2010/03/30/cambiar-la-propiedad-text-de-un-checkbox-de-asp-net-desde-javascript/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.gzafra.com/2010/03/30/cambiar-la-propiedad-text-de-un-checkbox-de-asp-net-desde-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
