tag:blogger.com,1999:blog-3371898360179313112024-02-01T20:47:38.622-08:00Curso C#Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.comBlogger49125tag:blogger.com,1999:blog-337189836017931311.post-35681323297810921842011-04-04T08:11:00.000-07:002011-04-07T08:45:13.374-07:00Ejercicio. Implementar el juego del tres en raya (también llamado Tic Tac Toe o "de la vieja")<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://uh.edu/engines/545px-Tic-tac-toe-game-tree.svg.png"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 442px; height: 294px;" src="http://uh.edu/engines/545px-Tic-tac-toe-game-tree.svg.png" alt="" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ocompras.com/images/2008/07/tres-en-raya-espejo.jpg"><br /></a>Programa en C# el juego del tres en raya. Inicialmente vamos a hacerlo para dos jugadores que manejan el ratón, la versión más simple. Ten en cuenta las siguientes consideraciones:<br /><br /><ul><li>Crea una aplicación Windows en Sharp Develop y emplea componentes botón (Button) para representar cada celda del juego.<br /></li><li>Las celdas tendrán un tamaño de 75x75 pixels.</li><li>Inicialmente el color de fondo de las celdas será negro.</li><li>No repitas el código para atender el evento de clic en cada celda. Trata simplemente de recoger una referencia al objeto botón que produjo el evento para manipularlos todos de forma genérica. Esto es, en cada manejador del clic aparecerá: <span style="font-weight: bold;font-size:85%;" >celda =(Button)sender; </span><span style="font-size:100%;">siendo </span><span style="font-weight: bold;font-size:85%;" >celda </span><span style="font-size:100%;">un atributo miembro del formulario de la clase</span><span style="font-weight: bold;font-size:85%;" > Button.<br /></span></li><li style="text-align: left;"><span style="font-size:100%;">Para poner X o O se cargará la imagen respectiva en el botón. Para cargar una imagen en un botón modifica su atributo <span style="font-weight: bold;">Image </span>como en este ejemplo: <span style="font-size:85%;"><span style="font-weight: bold;">celda.Image=Image.FromFile("tres_en_raya_O.jpg");</span></span></span><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLnk4H0Mw1-vKM033ggt84uL9nHtT7MHXvwnjr1Xh4bP0MpN5blZu1-dPqMNFLqvcHq1-VEikCPU9lf1oAMewwejC_4Gtn8p5dGtuZqrQyE30JCCAp2wVRp-LPHo7ZC4hfXEOvLpNkCxA/s1600/tres_en_raya_X.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 75px; height: 75px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLnk4H0Mw1-vKM033ggt84uL9nHtT7MHXvwnjr1Xh4bP0MpN5blZu1-dPqMNFLqvcHq1-VEikCPU9lf1oAMewwejC_4Gtn8p5dGtuZqrQyE30JCCAp2wVRp-LPHo7ZC4hfXEOvLpNkCxA/s320/tres_en_raya_X.jpg" alt="" id="BLOGGER_PHOTO_ID_5591749568365613698" border="0" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ2ozMCJei2vnfnUA8CH0Sprb7v9_Npc5-ttElR2mIJDuVXLmX-iD7Mq4FDKRBm1FzVdhJZHFcI4pmt0t1u2Q1bA2Fe20A95jvTNB2iDACdufR8htX8RaP-sdGXfv_YB119sLe91eBY-qQ/s1600/tres_en_raya_O.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 75px; height: 75px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ2ozMCJei2vnfnUA8CH0Sprb7v9_Npc5-ttElR2mIJDuVXLmX-iD7Mq4FDKRBm1FzVdhJZHFcI4pmt0t1u2Q1bA2Fe20A95jvTNB2iDACdufR8htX8RaP-sdGXfv_YB119sLe91eBY-qQ/s320/tres_en_raya_O.jpg" alt="" id="BLOGGER_PHOTO_ID_5591749570193426466" border="0" /></a></li><li><span style="font-size:100%;">Hacer clic sobre una celda en la que ya se ha jugado no debe tener efecto (puedes avisar al jugador mostrando un error en una etiqueta)</span></li><li><span style="font-size:100%;">El juego debe detenerse cuando alguien haya ganado y debe mostrar en una etiqueta quién es el ganador.</span></li><li><span style="font-size:100%;">Debe ser posible reiniciar el juego, una vez acabado o en medio de una partida, mediante un botón de Reset.</span></li><li><span style="font-size:100%;">Debe ser posible elegir el turno inicial.<br /></span></li></ul>Una vez que funcione, trata de añadir manejadores de eventos para las teclas, de tal forma que cada jugador pueda jugar indistintamente con el ratón o con el teclado. Para ello puedes suponer la configuración<br /><br />qwe<br />asd<br />zxc<br /><br />haciendo corresponder a cada celda la letra que ocupa su misma posición. Para recordar cómo manejar eventos de teclado revisa el <a href="http://curso-mcts.blogspot.com/2011/03/ejercicio-disenar-el-juego-pong.html">ejemplo del juego del Pong</a><br /><br /><br /><div style="text-align: justify;">Finalmente, habilita una opción para jugar contra la máquina. Para ello, en el turno de la máquina debes simular cierta "inteligencia" que sea capaz de tomar buenas decisiones. Lo ideal sería utilizar el algoritmo del minimax. Haz clic en <a href="http://www.google.es/url?sa=t&source=web&cd=1&ved=0CBcQFjAA&url=http%3A%2F%2Fwww.inf.utfsm.cl%2F%7Eccastro%2FIIA-401%2F2003-1%2FAPUNTES%2Fbacktracking-iia-401-2003-1.pdf.gz&rct=j&q=backtracking%20tres%20en%20raya&ei=Td6ZTbygLsXRhAet8vDiCA&usg=AFQjCNFXRJlf0BqPrk1caJCZFLo5OpRZmw&cad=rja">este enlace</a> y vete a la página 13 del documento para comprobar en qué consiste. Además de una clara explicación de su mecanismo dispones del pseudocódigo para implementarlo recursivamente. Simplemente, trata de adaptarlo a la sintaxis de C#.<br /><br /><div style="text-align: center; font-weight: bold;"><span style="font-size:130%;"><span style="color: rgb(153, 0, 0);"> Solución con minimax sin heurística: descárgalo</span> <a href="http://db.tt/T0l3ZDA">aquí</a><br /></span></div><br /><br /></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-1574584481809997052011-04-02T04:35:00.001-07:002011-04-02T04:40:47.728-07:00Ejercicio. Extender la aplicación de dibujo<div style="text-align: justify; font-weight: bold;"><span style="color: rgb(153, 0, 0);">Modifica el código de ejemplo del post anterior para que en el cuadro de lectura de datos de "Figura" se nos pregunte por las coordenadas X e Y de un punto origen y las coordenadas X e Y de un punto destino para dibujar una línea recta.</span><br /></div><br /><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://db.tt/xbwUVZW"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 185px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2TM-MNEO1Y9UuewXS4nioaSsEBXdi818wXCoQGbBz_gQfi5wbquSf4BKA7MCcHcVzKAqurIyXjXLTRTZaxtj_xdeN6tX7TJMjKmbMsyw_tbosB71aDCcXz4Ik3Jg6KfOvZDS0gT-_ElGu/s320/lineas.bmp" alt="" id="BLOGGER_PHOTO_ID_5590948753195205762" border="0" /></a><span style="font-weight: bold; font-family: verdana;font-size:130%;" ><span style="color: rgb(0, 102, 0);">Haz clic en la imagen para descargar el proyecto con la solución</span></span><br /><br /><br /></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-65957156045726923962011-04-02T02:58:00.000-07:002011-04-02T03:07:08.686-07:00Ejemplo funcional de aplicación para dibujar gráficos<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://db.tt/gaatsSo"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 185px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh472qY-nmnl8kksLlS8u3TDtj1q5RxswaxsBkwwwhHBHsF8-q5lcKqmAS1_xnGnUX4SFluRpE2ZL3_9919g1HiOUsM0liYd4ExVrb7fwKwoJehVKrh3F-k_KCMZ688Mw2ootozV3vekb-9/s320/geometr%25C3%25ADa.bmp" alt="" id="BLOGGER_PHOTO_ID_5590924189015275170" border="0" /></a><br /><div style="text-align: center; color: rgb(153, 0, 0); font-weight: bold;"><span style="font-size:130%;">Haz clic en la imagen para descargar la aplicación de ejemplo que te servirá de base para tus prácticas<br /><br /></span></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com2tag:blogger.com,1999:blog-337189836017931311.post-52921495005230908302011-04-01T18:00:00.000-07:002011-04-01T18:01:59.795-07:00Ejemplos. GráficosSe puede usar gráficos para mejorar la interface de una aplicación, crear gráficos, reportes y editar imágenes.<br /><code></code><br /><code><b><span style="background-color: yellow; font-family: Arial;"></span></b></code><code style="color: rgb(102, 0, 0);"><b><span style="font-family: Arial;">Lección 1 - Dibujando gráficos</span></b></code><br /><code></code><br /><code><span style="font-family: Arial;">System.Drawing permite crear gráficos o modificar imágenes. Cambiar de tamaño una imagen, crear círculos, líneas u otras formas, hacer zoom a imágenes, adherir copyright a logos o textos, etc.</span></code><br /><code></code><br /><b>Clases:</b><br /><table border="1" cellpadding="0" cellspacing="0"><tbody> <tr> <td valign="top" width="596"><b>Bitmap </b>Encapsula un mapa de bits de GDI+, formado por los datos de píxel de una imagen de gráficos y sus atributos. Un objeto Bitmap es utilizado para trabajar con imágenes definidas por datos de píxel.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>Brush </b>Las clases derivadas de esta clase base abstracta definen objetos utilizados para rellenar el interior de formas gráficas, como rectángulos, elipses, gráficos circulares, polígonos y rutas.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>Brushes </b>Pinceles de todos los colores estándar. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>ColorConverter </b>Convierte colores de un tipo de datos a otro. Se tiene acceso a esta clase mediante TypeDescriptor.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>ColorTranslator </b>Convierte colores a y de estructuras Color GDI+. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>Font </b>Define un formato concreto para el texto, incluidos el nombre de fuente, el tamaño y los atributos de estilo. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>FontConverter </b>Convierte objetos Font de un tipo de datos en otro. Se tiene acceso a la clase FontConverter mediante el objeto TypeDescriptor.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>FontFamily </b>Define un grupo de tipos de letra que tienen un diseño básico parecido y algunas diferencias de estilo. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>Graphics </b>Encapsula una superficie de dibujo GDI+. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>Icon </b>Representa un icono de Windows, que es una pequeña imagen de mapa de bits utilizada para representar un objeto. Los iconos se pueden considerar como mapas de bits transparentes, aunque su tamaño lo determina el sistema.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>IconConverter </b>Convierte objetos Icon de un tipo de datos en otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>Image </b>Clase base abstracta que proporciona funcionalidad para las clases descendentes Bitmap y Metafile.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>ImageAnimator </b>Da animación a una imagen que tiene marcos basados en tiempo.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>ImageConverter </b>ImageConverter es una clase que se puede utilizar para convertir objetos Image de un tipo de datos a otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor. </td></tr> <tr> <td valign="top" width="596"><b>ImageFormatConverter </b>ImageFormatConverter es una clase que se puede utilizar para convertir colores de un tipo de datos a otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor. </td></tr> <tr> <td valign="top" width="596"><b>Pen </b>Define un objeto utilizado para dibujar líneas y curvas. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>Pens </b>Lápices de todos los colores estándar. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>PointConverter </b>Convierte objetos Point de un tipo de datos en otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>RectangleConverter </b>Convierte rectángulos de un tipo en otro tipo. Se tiene acceso a esta clase mediante TypeDescriptor. </td></tr> <tr> <td valign="top" width="596"><b>Region </b>Describe el interior de una forma gráfica formada por rectángulos y rutas. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>SizeConverter </b>SizeConverter es una clase que se utiliza para convertir un tipo de datos en otro. Se tiene acceso a esta clase mediante el objeto TypeDescriptor.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>SolidBrush </b>Define un pincel de un solo color. Los pinceles se utilizan para rellenar formas de gráficos, por ejemplo rectángulos, elipses, gráficos circulares y rutas. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>StringFormat </b>Encapsula información de diseño del texto (como interlineado y alineación), manipulaciones de presentación (como inserción de puntos suspensivos y sustitución de dígitos nacional) y características de OpenType. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>SystemBrushes </b>Cada una de las propiedades de la clase SystemBrushes es un objeto SolidBrush que es el color de un elemento de presentación de Windows.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>SystemColors </b>Cada una de las propiedades de la clase SystemColors es una estructura Color que es el color de un elemento de presentación de Windows.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>SystemIcons </b>Cada una de las propiedades de la clase SystemIcons es un objeto Icon de los iconos de todo del sistema de Windows. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>SystemPens </b>Cada una de las propiedades de la clase SystemPens es un objeto Pen que es el color de un elemento de presentación de Windows y es un ancho de 1. </td></tr> <tr> <td valign="top" width="596"><b>TextureBrush </b>Cada una de las propiedades de la clase TextureBrush es un objeto Brush que utiliza una imagen para rellenar el interior de una forma. No se puede heredar esta clase.<b> </b></td></tr> <tr> <td valign="top" width="596"><b>ToolboxBitmapAttribute </b>Se puede aplicar un objeto. ToolboxBitmapAttribute a un control de manera que los contenedores, como el Diseñador de formularios de Microsoft Visual Studio, puedan recuperar un icono que represente el control. El mapa de bits del icono puede encontrarse en un archivo por sí solo o incrustado en el ensamblado que contiene el control. <br />El tamaño del mapa de bits que se incrusta en el ensamblado del control (o que se almacena en un archivo independiente) debe ser de 16 por 16. El método GetImage de un objeto ToolboxBitmapAttribute puede devolver la imagen pequeña de 16 por 16 o una imagen grande de 32 por 32 creada mediante un ajuste de escala de la imagen pequeña.<b> </b></td></tr> </tbody></table> <br /><b>Como especificar el tamaño y ubicación de un control.</b><br />El uso más común de System.Drawing es especificar la ubicación de algún control, cuando se está creando de manera dinámica (por código).<br />Para realizarlo se crea un punto al que se le pasa dos parámetros (distancia desde arriba, distancia desde el lado izquierdo) para setear la propiedad <b>Location</b> del control.<br />Ejemplo<br /><a href="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBj40He4zI/AAAAAAAAAO8/D1wkJI3W1_Q/s1600-h/clip_image001%5B5%5D.png"><img alt="clip_image001" src="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBj5hAkvAI/AAAAAAAAAPA/K9PZWqonOGE/clip_image001_thumb%5B2%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image001" width="336" border="0" height="24" /></a><br />Una forma alternativa se puede setear directamente las propiedades left y top del control.<br /><a href="http://lh4.ggpht.com/_jvVswA9mZ9o/TNBj6J8nt5I/AAAAAAAAAPE/0YgOVLPn_gg/s1600-h/clip_image002%5B3%5D.png"><img alt="clip_image002" src="http://lh4.ggpht.com/_jvVswA9mZ9o/TNBj6llFJXI/AAAAAAAAAPI/84Umbj7d2xk/clip_image002_thumb.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image002" width="141" border="0" height="45" /></a><br />También es posible especificar el tamaño:<br /><a href="http://lh4.ggpht.com/_jvVswA9mZ9o/TNBj7O5bGYI/AAAAAAAAAPM/UBQrkOW_nVA/s1600-h/clip_image003%5B3%5D.png"><img alt="clip_image003" src="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBj7081fuI/AAAAAAAAAPQ/dtxTJ_1HXCU/clip_image003_thumb.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image003" width="239" border="0" height="31" /></a><br /><b>Como especificar el color de los controles</b><br />Para modificar los colores de un control, se puede utilizar la estructura Color de la siguiente forma:<br /><a href="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBj8QBtD4I/AAAAAAAAAPU/_ItGgHhJl2E/s1600-h/clip_image004%5B3%5D.png"><img alt="clip_image004" src="http://lh4.ggpht.com/_jvVswA9mZ9o/TNBj83co8nI/AAAAAAAAAPY/w3r48BCZkqE/clip_image004_thumb.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image004" width="231" border="0" height="91" /></a><br />Si es que se necesita especificar un color personalizado, se puede utilizar el método Color.FromArgb():<br /><a href="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBj9XOnt4I/AAAAAAAAAPc/QparlSDuy6E/s1600-h/clip_image005%5B6%5D.png"><img alt="clip_image005" src="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBj-CFRtVI/AAAAAAAAAPg/RnSvQIV6Xuc/clip_image005_thumb%5B3%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image005" width="422" border="0" height="39" /></a><br />Como dibujar líneas y formas<br />Para dibujar en un formulario o en un control, se deben de seguir los siguientes pasos:<br />1. Crea un objeto Graphics llamando al método system.Windows.Forms.Control.CreateGraphics<br />2. Crear un objeto Pen<br />3. Llamar al miembro de Graphics para dibujar en el cotrol, usando el Pen.<br />Una vez que se ha creado el objeto graphics, se puede utilizar muchos métodos para mejorarlo como<br /><table border="1" cellpadding="0" cellspacing="0"><tbody> <tr> <td valign="top" width="158"><b>Clear </b></td> <td valign="top" width="441">Borra la superficie de dibujo y la rellena con el color de fondo especificado.</td></tr> <tr> <td valign="top" width="158"><b>DrawEllipse </b></td> <td valign="top" width="441">Dibuja una elipse definida por un rectángulo delimitador especificado por un par de coordenadas, un valor de alto y un valor de ancho.</td></tr> <tr> <td valign="top" width="158"><b>DrawIcon </b><br /></td> <td valign="top" width="441">Dibuja la imagen representada por el <a href="http://msdn.microsoft.com/es-es/library/system.drawing.icon%28v=VS.80%29.aspx">Icon</a> especificado en las coordenadas <br />Señaladas.</td></tr> <tr> <td valign="top" width="156"><b>DrawIconUnstretched</b><br /></td> <td valign="top" width="443">Dibuja la imagen representada por el <b>Icon</b> especificado sin transformar a escala la imagen.</td></tr> <tr> <td valign="top" width="156"><b>DrawImage </b></td> <td valign="top" width="443">Dibuja la <a href="http://msdn.microsoft.com/es-es/library/system.drawing.image%28v=VS.80%29.aspx">Image</a> especificada en la ubicación que se indique y con el tamaño original.</td></tr> <tr> <td valign="top" width="156"><b>DrawLine </b></td> <td valign="top" width="443">Dibuja una línea que conecta los dos puntos especificados por los pares de coordenadas.</td></tr> <tr> <td valign="top" width="156"><b>DrawLines </b></td> <td valign="top" width="443">Dibuja una serie de segmentos de línea que conectan una matriz de estructuras <b>Point</b>.</td></tr> <tr> <td valign="top" width="156"><b>DrawPath </b></td> <td valign="top" width="443">Dibuja un <a href="http://msdn.microsoft.com/es-es/library/system.drawing.drawing2d.graphicspath%28v=VS.80%29.aspx">GraphicsPath</a>.</td></tr> <tr> <td valign="top" width="156"><b>DrawPie </b></td> <td valign="top" width="443">Dibuja una forma circular definida por una elipse determinada por un par de coordenadas, unos valores de ancho y alto y dos líneas radiales.</td></tr> <tr> <td valign="top" width="156"><b>DrawPolygon </b></td> <td valign="top" width="443">Dibuja un polígono definido por una matriz de estructuras <b>Point</b>.</td></tr> <tr> <td valign="top" width="156"><b>DrawRectangle </b></td> <td valign="top" width="443">Dibuja un rectángulo especificado por un par de coordenadas, un valor de ancho y un valor de alto.</td></tr> <tr> <td valign="top" width="156"><b>Drawrectangles </b></td> <td valign="top" width="443">Dibuja una serie de rectángulos especificados por las estructuras <a href="http://msdn.microsoft.com/es-es/library/system.drawing.rectangle%28v=VS.80%29.aspx">Rectangle</a>.</td></tr> <tr> <td valign="top" width="156"><b>DrawString </b></td> <td valign="top" width="443">Dibuja la cadena de texto especificada en la ubicación especificada y con los objetos <a href="http://msdn.microsoft.com/es-es/library/system.drawing.brush%28v=VS.80%29.aspx">Brush</a> y <a href="http://msdn.microsoft.com/es-es/library/system.drawing.font%28v=VS.80%29.aspx">Font</a> especificados.</td></tr> </tbody></table>Para especificar cualquiera de esos métodos se debe proveer una instancia de la clase Pen. En el constructor de Pen (lapiz), se especifican el color y width en pixeles:<br /><a href="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBj-qxj8mI/AAAAAAAAAPk/QlA3Zic_Ikg/s1600-h/clip_image006%5B4%5D.png"><img alt="clip_image006" src="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBj_bDI4DI/AAAAAAAAAPo/VyQKtmIzYXE/clip_image006_thumb%5B1%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image006" width="471" border="0" height="162" /></a><br />Métodos como <i>Graphics.DrawLines, Graphics.DrawPolygon, Graphics.DrawRectangles</i>, aceptan arreglos de puntos como parámetros, para crear figuras más complejas.<br /> <br /><br /><b>Como personalizar Pens?</b><br />Además de controlar el color y el tamaño del pen (lapiz), que se especifican en el contructor, también se puede controlar el patrón y su endcap. Endcap es el final de una línea, pueden ser utilizados para crear flechas.<br />Para crear un lapiz que dibuje líneas punteadas, se debería de setear la propiedad de Pen.DashStyle a uno de los siguientes valores:<br /><ul><li>· DashStyle.Dash (guion)</li><li>· DashStyle.DashDot (guion punto)</li><li>· DashStyle.DashDotDot (guion punto punto)</li><li>· DashStyle.Dot (punto)</li><li>· DashStyle.Solid. (solido)</li></ul>Ejemplo<br /><a href="http://lh4.ggpht.com/_jvVswA9mZ9o/TNBj__gQ1OI/AAAAAAAAAPs/BRBZwBSsoNI/s1600-h/clip_image007%5B5%5D.png"><img alt="clip_image007" src="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBkAs8w9uI/AAAAAAAAAPw/mczUI3_4_cU/clip_image007_thumb%5B2%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image007" width="372" border="0" height="40" /></a><br />Tambien es posible utilizar Pen.DashOffset y Pen.DashPattern para definir patrones dash(guion).<br />Para crear flechas, uno debe de modificar las propiedade Pen.StartCap y Pen.EndCap, utilizando el enumerador LineCap, que tiene valores como: <br /><ul><li>· LineCap.ArrowAnchor</li><li>· LineCap.DiamonAnchor</li><li>· LineCap.SquareAnchor</li><li>· LineCap.Triangle</li><li>· LineCap.Flat</li><li>· LineCap.Round</li><li>· LineCap.RoundAnchor</li><li>· LineCap.Square</li></ul>Ejemplo:<br /><a href="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBkBQMXDRI/AAAAAAAAAP0/19lRB5HL9DY/s1600-h/clip_image008%5B5%5D.png"><img alt="clip_image008" src="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBkCHyxIlI/AAAAAAAAAP4/zsIOr-UKz60/clip_image008_thumb%5B2%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image008" width="419" border="0" height="102" /></a><br /> <br /><b>Como llenar formas?</b><br />La mayoría de los métodos de la clase grafics tiene también un método llamado fill que dibuja una forma (shape) y la rellena. Estos métodos requieren una instancia de la clase Brush, la cual es abstracta, entonces se debe de instanciar una clase hija:<br /><br /><table border="1" cellpadding="0" cellspacing="0"><tbody> <tr> <td valign="top" width="299"><b>System.Drawing.Drawing2D.HatchBrush </b></td> <td valign="top" width="299">define un rectangular brush con un estilo hatch</td></tr> <tr> <td valign="top" width="299"><b>System.Drawig.Drawing2D.LinearGradientBrush </b></td> <td valign="top" width="299">encapsula un brush con un gradiente lineal.</td></tr> <tr> <td valign="top" width="299"><b>System.Drawing.Drawing2D.PathGradientBrush </b></td> <td valign="top" width="299">igual que el anterior, solo que provee un llenado más complejo</td></tr> <tr> <td valign="top" width="299"><b>System.Drawing.SolidBrush </b></td> <td valign="top" width="299">Define un Brush de un color simple.</td></tr> <tr> <td valign="top" width="299"><b>System.Drawing.TextureBrush </b></td> <td valign="top" width="299">define un Brush desde una imagen</td></tr> </tbody></table>Ejemplo:<br /><a href="http://lh4.ggpht.com/_jvVswA9mZ9o/TNBkChO18pI/AAAAAAAAAP8/XBbfGNz3u48/s1600-h/clip_image009%5B3%5D.png"><img alt="clip_image009" src="http://lh4.ggpht.com/_jvVswA9mZ9o/TNBkDTXi7eI/AAAAAAAAAQA/XpCh0G2ybPk/clip_image009_thumb.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image009" width="244" border="0" height="149" /></a><br /> <br /><br /><b style="color: rgb(153, 0, 0);">Lección 2 – trabajando con imágenes</b><br /><br />System.Drawing.Image es una clase abstracta que permite crear, cargar, modificar y grabar imágenes, como BMP, jpg o tif.<br />La clase Image es abstracta, por lo tanto se debe de crear una instancia usando Image.FromFile, el cual recibe como parámetro un path a la imagen, y Image.FromStream, que recibe un System.IO.Stream como parámetro. <br />También se pueden utilizar dos clases que heredan de la clase Image:<br />System.Drawing.Bitmap (para imágenes) y System.Drawing.Imaging.Metafile (para imágenes animadas).<br />Bitmap es la clase mas usada comúnmente para trabajar con imágenes. Los diferentes constructores de Bitmap, permiten crear un Bitmap a partir de una Imagen, archivo o stream, o sino crear un bitmap en blanco con un height (alto) y width(ancho) especificado. Bitmap contiene 2 metodos importantes que la clase Image carece:<br /><ul><li>GetPixel, el cual devuelve un objeto Color, con los colores de ese pixel.</li><li>SetPixel, setea el color de un pixel.</li></ul> <br /><b>Como mostrar imágenes?</b><br />Para mostrar una imagen guardada en el disco, se debe utilizar Image.FromFile, crear un control PictureBox y usar la imagen para definir PictureBox.Background:<br />Por ejemplo, para mostrar una image:<br /><a href="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBkD7vzAJI/AAAAAAAAAQE/5r2RLSoZK-U/s1600-h/clip_image010%5B5%5D.png"><img alt="clip_image010" src="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBkE_ilcFI/AAAAAAAAAQI/a7zUCHgfLQs/clip_image010_thumb%5B2%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image010" width="546" border="0" height="123" /></a><br />Para colocar una imagen como el fondo de un form:<br /><a href="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBkFdVU-hI/AAAAAAAAAQM/fdaeK-Dfgsk/s1600-h/clip_image011%5B5%5D.png"><img alt="clip_image011" src="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBkGdeD7OI/AAAAAAAAAQQ/R6S_plP4IM0/clip_image011_thumb%5B2%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image011" width="544" border="0" height="76" /></a><br /> <br /><b>Como crear y guardas imagines?</b><br />Para crear una imagen nueva, se debe generar una intancia de la clase Bitmap (uno de los constructores que no requiere una imagen existente, con el método Bitmap.SetPixel o editar una existente usando Graphics.FromImage).<br />Para grabar una imagen, el Bitmap usa su método Bitmap.Save, ( que recibe como primer parámetro el nombre del archivo y como segundo el formato en que se desea almacenar la imagen).<br />Ejemplo:<br /><a href="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBkHFe8ZxI/AAAAAAAAAQU/JH7Oi0QkRK4/s1600-h/clip_image013%5B5%5D.jpg"><img alt="clip_image013" src="http://lh4.ggpht.com/_jvVswA9mZ9o/TNBkH5yI3-I/AAAAAAAAAQY/8c-JsiFJ2NI/clip_image013_thumb%5B2%5D.jpg?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image013" width="545" border="0" height="173" /></a><br /> <br /><b>Como usar Iconos?</b><br />Los iconos son bitmaps transparentes, de un tamaño especifico, para expresar el estado en Windows. Una forma simple de agregar iconos a un form es con los métodos Graphics.DrawIcon o Graphics.DrawIconUnstretched:<br /><a href="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBkIPHS--I/AAAAAAAAAQc/2hB68mVlYpQ/s1600-h/clip_image014%5B6%5D.png"><img alt="clip_image014" src="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBkIx0B-dI/AAAAAAAAAQg/AjRBCgXmB34/clip_image014_thumb%5B3%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image014" width="308" border="0" height="48" /></a><br />O <br /><a href="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBkJlD083I/AAAAAAAAAQk/JYP3Ar4v-2o/s1600-h/clip_image015%5B6%5D.png"><img alt="clip_image015" src="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBkKjF_24I/AAAAAAAAAQo/NWX6Gc76g-0/clip_image015_thumb%5B3%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image015" width="504" border="0" height="41" /></a><br />Se puede editar un Icono, llamando al método Icon.ToBitmap para crear un bitmap que puede ser editado.<br /> <br /><b style="color: rgb(153, 0, 0);">Lección 3 – Formateando texto</b><br /><br /> <br /><b>Como adherir texto a gráficos? </b><br />Para agregar texto a una imagen, debemos:<br />1. Crear un objeto graphics <br />2. Crear un objeto Font<br />3. crear un objeto Brush (opcional)<br />4. Utilizar el método Graphics.DrawString y especificar la ubicación del texto.<br /><br /> <br /><b>Como crear un objeto Font?</b><br />La clase fonts tiene 13 sobrecargas de su contructor, el más simple es pasarle la familia de la fuente(string) ej: “arial”, el tamaño (float/int)y el estilo (fontStyle).<br />Ejemplo:<br /><a href="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBkLPYitnI/AAAAAAAAAQs/CVV7aJI1I8A/s1600-h/clip_image016%5B6%5D.png"><img alt="clip_image016" src="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBkLxWqONI/AAAAAAAAAQw/paExLYU7yys/clip_image016_thumb%5B3%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image016" width="343" border="0" height="32" /></a><br />O pasándole un FontFamily<br /><a href="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBkMPj2IFI/AAAAAAAAAQ0/ir9dOSliSDk/s1600-h/clip_image017%5B3%5D.png"><img alt="clip_image017" src="http://lh4.ggpht.com/_jvVswA9mZ9o/TNBkM-t0JpI/AAAAAAAAAQ4/fTlF3D8jdsE/clip_image017_thumb.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image017" width="244" border="0" height="32" /></a><br />Y si necesitamos leer el tipo de fuente desde un string, se puede usar la clase FontConverter (no es muy recomendada porque puede generar errores)<br /><a href="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBkNg7u40I/AAAAAAAAAQ8/q7zk7wmbNS8/s1600-h/clip_image018%5B5%5D.png"><img alt="clip_image018" src="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBkPOM2ZnI/AAAAAAAAARA/s3s27DXuPv4/clip_image018_thumb%5B2%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image018" width="423" border="0" height="44" /></a><br /><br /> <br /><b>Como escribir texto?</b><br />Después de crear un objeto font, se debe crear un brush para definir cómo se va a rellenar el texto. Para agregar el texto a una imagen se llama a Graphics.DrawString:<br /><a href="http://lh3.ggpht.com/_jvVswA9mZ9o/TNBkP6tDwTI/AAAAAAAAARE/9r5EsgibQcs/s1600-h/clip_image019%5B6%5D.png"><img alt="clip_image019" src="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBkQjLnK9I/AAAAAAAAARI/M6bdaULPtc4/clip_image019_thumb%5B3%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image019" width="361" border="0" height="55" /></a><br /><br /> <br /><b>Como controlar el formateo de texto? </b><br />.Net framework brinda control sobre la alineación y dirección del texto usando la clase StringFormat.<br />Los miembros más importantes de StringFormat son:<br /><a href="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBmfCkJzgI/AAAAAAAAARc/3R7crOcOO6o/s1600-h/image%5B12%5D.png"><img alt="image" src="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBmhOukLNI/AAAAAAAAARg/wZxo9-84DTg/image_thumb%5B6%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="562" border="0" height="574" /></a><br />Ejemplo de utilización de StringFormat:<br /><br /><a href="http://lh5.ggpht.com/_jvVswA9mZ9o/TNBkT_GB6JI/AAAAAAAAARU/nv_b9LAra-0/s1600-h/clip_image020%5B9%5D.png"><img alt="clip_image020" src="http://lh6.ggpht.com/_jvVswA9mZ9o/TNBkU3PyaZI/AAAAAAAAARY/wQ0mtCqsh3c/clip_image020_thumb%5B4%5D.png?imgmax=800" style="background-image: none; border: 0px none; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="clip_image020" width="554" border="0" height="312" /></a>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com5tag:blogger.com,1999:blog-337189836017931311.post-64047385872245985882011-03-31T10:25:00.001-07:002011-03-31T10:30:08.391-07:00Ejercicio. Servicio web que calcula la letra del DNI<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_IWzwQo2t9in2pFqEpPRwIlk1n0P9pra6vzsqs99X44rdOSqgDY3GG1C6L9DiqZWlS2c9hi8aCQ1h6lOkGGvG9GhjhOWgaet3TKRVC6EJX9i13eZz7NixMaIWnDlko6CkOhq-226UjBI0/s1600/calcularLetraDNI.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 289px; height: 166px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_IWzwQo2t9in2pFqEpPRwIlk1n0P9pra6vzsqs99X44rdOSqgDY3GG1C6L9DiqZWlS2c9hi8aCQ1h6lOkGGvG9GhjhOWgaet3TKRVC6EJX9i13eZz7NixMaIWnDlko6CkOhq-226UjBI0/s400/calcularLetraDNI.bmp" alt="" id="BLOGGER_PHOTO_ID_5590297487501840402" border="0" /></a><br /><div style="text-align: justify; font-weight: bold;">Crea un servicio web y una interfaz que lo use en la que, introduciendo el DNI de una persona, obtenemos su letra correspondiente.<br /><br /><span style="color: rgb(153, 0, 0);">NOTA: Puedes consultar el algoritmo necesario y servirte del código de </span><a style="color: rgb(0, 0, 153);" href="http://es.wikibooks.org/wiki/Algoritmo_para_obtener_la_letra_del_NIF">este link</a><br /></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-18476286842434066102011-03-31T10:19:00.000-07:002011-03-31T10:23:29.687-07:00Ejercicio. Consultar información de códigos IANA<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuOZ8nbeOBne6_OxHVVbeIYNRetAT-JTaG4sZ8vjQbMrQxBRJW-I57m1haFdW8gJpTDpTRpZWDurosB8_TNfdgCFbIuahj9_o-bO69cSy6PJP6-AmTm7E5Sig9OzfaOUKOH0wZu4CC8XIN/s1600/servicio+web+IANA.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 62px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuOZ8nbeOBne6_OxHVVbeIYNRetAT-JTaG4sZ8vjQbMrQxBRJW-I57m1haFdW8gJpTDpTRpZWDurosB8_TNfdgCFbIuahj9_o-bO69cSy6PJP6-AmTm7E5Sig9OzfaOUKOH0wZu4CC8XIN/s400/servicio+web+IANA.bmp" alt="" id="BLOGGER_PHOTO_ID_5590295502389505202" border="0" /></a><br />Utiliza el siguiente servicio web, <a href="http://xmethods.com/ve2/ViewListing.po;jsessionid=eNKpjiPDB3WDG5g4ePRdh4uL?key=467143">http://xmethods.com/ve2/ViewListing.po;jsessionid=eNKpjiPDB3WDG5g4ePRdh4uL?key=467143</a>, para crear una interfaz web en la que dado el dominio primario de internet de un país (código IANA) nos muestre su nombre, latitud y longitud.Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-44324240933143411962011-03-31T06:51:00.000-07:002011-03-31T07:57:07.887-07:00Ejercicio. Habilitar acceso por login.<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4miLRNFccCFvgTppRnoxAllaTK3UIKf6CpvBlwrbvehTFDBFiVcp8KuncPFHGn7eP7ssS5WUfjqTdxIJGrDUZQ-Y6hQUDWlZ6g65td7kocnmpCf5pxBjBoc8aiDjAU89rSnSvfQZH3jKj/s1600/login.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 297px; height: 143px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4miLRNFccCFvgTppRnoxAllaTK3UIKf6CpvBlwrbvehTFDBFiVcp8KuncPFHGn7eP7ssS5WUfjqTdxIJGrDUZQ-Y6hQUDWlZ6g65td7kocnmpCf5pxBjBoc8aiDjAU89rSnSvfQZH3jKj/s320/login.bmp" alt="" id="BLOGGER_PHOTO_ID_5590241648890430034" border="0" /></a><br /><span style="color: rgb(153, 0, 0);">A la aplicación web del último ejemplo posteado ("Consulta de notas de un alumno") vamos a incluirle un control de acceso de manera que sólo el usuario que nosotros registremos pueda utilizarla. Sigue los pasos:</span><br /><br /><span style="color: rgb(153, 0, 0);">Primero vamos a crear el formulario para loguearnos:</span><br /><ol style="color: rgb(153, 0, 0);"><li>Abre la solución de consulta de notas de un alumno.</li><li>En el explorador de soluciones haz clic con el botón derecho del ratón sobre la raíz del árbol de exploración que representa el proyecto y selecciona la opción "Agregar nuevo elemento"</li><li>En el cuadro de diálogo selecciona "Web Forms" y ponle como nombre "Login.aspx". Recuerda marcar C# como lenguaje de nuestro nuevo Web Form.</li><li>Accede a la vista diseño de Login.aspx e inserta un objeto "Login". Lo encontrarás en el cuadro de herramientas, en el subgrupo "Inicio de sesión"<br /></li></ol><span style="color: rgb(153, 0, 0);">Ahora, para proteger el conjunto de nuestra aplicación la meteremos en una subcarpeta dentro del sitio:</span><br /><ol style="color: rgb(153, 0, 0);"><li>En el explorador de soluciones haz clic con el botón derecho del ratón sobre la raíz del árbol de exploración que representa el proyecto y selecciona la opción "Nueva carpeta". Ponle de nombre "Aplicacion".<br /></li><li>Arrastra los archivos que forman parte de la aplicación a la nueva subcarpeta, esto es, "ConsultarNotas.aspx" y "ResultadoForm.aspx". No obstante, no arrastres el archivo "web.config"<br /></li></ol><span style="color: rgb(153, 0, 0);">Nos queda crear un usuario y darle los permisos apropiados:</span><br /><br /><ol style="color: rgb(153, 0, 0);"><li>Vuelve a la vista diseño de Login.aspx, selecciona el control Login y haz clic en la fecha de la parte superior derecha para abrir sus opciones. Selecciona "Administrar sitio web"</li><li>Se abrirá una ventana de configuración en el navegador.</li><li>En la pestaña "Página principal" haz clic en "Seguridad".</li><li>Ahora, haz clic en <a id="ctl00_content_linkhook" href="http://localhost:2562/asp.netwebadminfiles/security/wizard/wizard.aspx">"Utilice el Asistente para la configuración de seguridad para configurar la seguridad paso a paso</a>" y se iniciará un asistente de configuración.<br /></li><li>El paso 1 es la bienvenida. Simplemente haz clic en "Siguiente"</li><li>En el paso 2, "Seleccionar método de acceso", marca la opción "Desde Internet". Haz clic en "Siguiente"<br /></li><li>Ignora los pasos 3 y 4 pulsando en "Siguiente"</li><li>En el paso 5, "Agregar nuevos usuarios", te aparecerá un formulario para crear un nuevo usuario. Rellena todos los campos y haz clic en "Siguiente"</li><li>El paso 6 te permite añadir reglas de acceso. Tenemos que centrarnos en la subcarpeta que queremos proteger, esto es, la subcarpeta "Aplicacion". Así que selecciónala en el árbol de la izquierda expandiendo primero el nodo principal (clic en el símbolo [+]).</li><li>Debes añadir dos reglas: la primera que deniegue el permiso a los usuarios anónimos y la segunda que permita el acceso al usuario que creaste en el paso 5. No olvides pulsar el botón "Agregar esta regla" una vez configuradas las opciones para que quede guardada.</li><li>Al hacer clic en "Siguiente" habrás terminado la configuración.</li></ol><span style="color: rgb(153, 0, 0);">Finalmente, añadimos unos pequeños ajustes al archivo "web.config". En realidad, ahora tendrás dos "web.config". Si haces clic con el botón derecho en la carpeta "Aplicación" en el explorador de soluciones y seleccionas la opción "Actualizar carpeta" verás que el asistente te ha añadido un archivo "web.config" en la subcarpeta. Si lo abres verás las reglas de acceso definidas:</span><br /><br /><a style="color: rgb(153, 0, 0);" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz9lt38RhGxe1928kXpWFdkicAahYf8zXzovHW3M3_UU-RDWDJ7fbYO_9pl1Y9BOS6OS4VH6cYXSrlIitszE0fB0DhWNiySeCYKV-svoWiMWJoVLxRSecA_ANFMjVJpbH27HcD9SHk9Ifw/s1600/web.config1.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 146px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz9lt38RhGxe1928kXpWFdkicAahYf8zXzovHW3M3_UU-RDWDJ7fbYO_9pl1Y9BOS6OS4VH6cYXSrlIitszE0fB0DhWNiySeCYKV-svoWiMWJoVLxRSecA_ANFMjVJpbH27HcD9SHk9Ifw/s320/web.config1.bmp" alt="" id="BLOGGER_PHOTO_ID_5590249157340016866" border="0" /></a><span style="color: rgb(153, 0, 0);">Aclarado esto, vamos a abrir el otro "web.config", el que está en la raíz del sitio web y busca la etiqueta </span><authentication style="color: rgb(153, 0, 0);">. Como puedes observar, está cerrada, no se ha incluido nada en ella. Simplemente ábrela y añade las siguientes etiquetas para indicar la página de login a la que debe redirigirnos la aplicación en caso de que intentemos acceder a un recurso protegido sin habernos logueado así como la página por defecto a la que se redirigirá el flujo una vez que el login ha tenido éxito.<br /><br /><br /></authentication><a style="color: rgb(153, 0, 0);" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK04bNmttunVy73qITcforCBuMwtl71ER8DJh_H_SREuZtR-sN7WfA4WnAgulNH58FnXMTYjw24MxwTe5RO-oJJJ9denG_Wb0CBtbUwc2v9zpL5hnOOMJbaHbtk2899hbVObdQw2FrzJwZ/s1600/web.config2.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 76px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK04bNmttunVy73qITcforCBuMwtl71ER8DJh_H_SREuZtR-sN7WfA4WnAgulNH58FnXMTYjw24MxwTe5RO-oJJJ9denG_Wb0CBtbUwc2v9zpL5hnOOMJbaHbtk2899hbVObdQw2FrzJwZ/s400/web.config2.bmp" alt="" id="BLOGGER_PHOTO_ID_5590250820381678850" border="0" /></a><a style="color: rgb(153, 0, 0);" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRa05xJY2TmCkrqENLBQpa1UIjXhlo8aK0kX8GfPSiZLYThWzXKbFDlOkTOHbmT8AO0z7d8kEUD95K9662m-q8JeoUHIJHluYGJQIAMC9nYgl-U63Aw4Ud2tqgNNro2tE2Kv5ASv6TrIUd/s1600/web.config2.bmp"><br /></a><span style="color: rgb(153, 0, 0);">Ya puedes ejecutar la aplicación y comprobar que funciona. Es importante que limpies las cookies del navegador entre prueba y prueba porque puede suceder que pienses que la aplicación te está dejando acceder directamente a la página protegida sin haber hecho login cuando quizás no haya expirado el tiempo máximo de login de un acceso correcto anterior.</span><br /><br /><span style="color: rgb(153, 0, 0);">Debes verificar que:</span><br /><br /><ol style="color: rgb(153, 0, 0);"><li>Si escribes la URL de la página "ConsultarNotas.aspx" en el navegador, te redirige a la página de login.</li><li>Si ingresas correctamente el usuario y la contraseña te redirige a la aplicación para consultar las notas.</li><li>Puedes seguir accediendo a "ConsultarNotas.aspx" aunque cierres la pestaña del navegador y vuelvas a entrar, pero siempre dentro del límite de tiempo establecido en el archivo de configuración.<br /></li></ol><authentication><br /><br /></authentication>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-41667779968236579302011-03-30T10:10:00.000-07:002011-03-30T10:31:07.825-07:00Ejemplo. Consulta de notas de un alumno<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8dxRxCsnDPwu9SmzUMzrOjW9FKPcQduHz6iPxRDFFPQtuEKk8KCT4NKLUmCFMymSM79ZUAeMqgl5fFlZrh0WEkJOt8SUXo2WIxLl-hVWPEJfV2dvjwg8ZsPG7dtNJ6sXJ6h9SKoP4SS45/s1600/consulta1.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 282px; height: 91px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8dxRxCsnDPwu9SmzUMzrOjW9FKPcQduHz6iPxRDFFPQtuEKk8KCT4NKLUmCFMymSM79ZUAeMqgl5fFlZrh0WEkJOt8SUXo2WIxLl-hVWPEJfV2dvjwg8ZsPG7dtNJ6sXJ6h9SKoP4SS45/s320/consulta1.bmp" alt="" id="BLOGGER_PHOTO_ID_5589922229252933458" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIElhEODK_OITMcKhIit4tdTqFGKioum_3LQcR2qqtW6zt3HxhdpkfruPMbmJS7oIuhAVAcT-hSXoh_e0u4gcMx7hasx1dmk0phJxykBqTIqHVm8QFMoebce5YOCEeP6zdrIyt9G8vYxa2/s1600/consulta2.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 94px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIElhEODK_OITMcKhIit4tdTqFGKioum_3LQcR2qqtW6zt3HxhdpkfruPMbmJS7oIuhAVAcT-hSXoh_e0u4gcMx7hasx1dmk0phJxykBqTIqHVm8QFMoebce5YOCEeP6zdrIyt9G8vYxa2/s320/consulta2.bmp" alt="" id="BLOGGER_PHOTO_ID_5589922225058497538" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdMNyHQb2h5j26JqOk893rAPtgFSXN6hRt_nzmSHGoXhUPkA-zgRmuEQY6zravSSm8Q_UOuD4YdMiDBKTus6TEUmbiVcJqfr453GXumJ-Mp8CU4oKg1BWWJVV1HJkU6-t3KvoE0iVJ3STT/s1600/consulta3.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 194px; height: 89px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdMNyHQb2h5j26JqOk893rAPtgFSXN6hRt_nzmSHGoXhUPkA-zgRmuEQY6zravSSm8Q_UOuD4YdMiDBKTus6TEUmbiVcJqfr453GXumJ-Mp8CU4oKg1BWWJVV1HJkU6-t3KvoE0iVJ3STT/s320/consulta3.bmp" alt="" id="BLOGGER_PHOTO_ID_5589922218442204914" border="0" /></a><br /><div style="text-align: justify; font-weight: bold;">En <a href="http://db.tt/ndRfAZJ">esta aplicación de ejemplo</a>, veremos cómo incorporar accesos a bases de datos desde formularios web usando los controles de Visual Web Developer. Además revisaremos otros aspectos como las cookies y la interacción entre varios formularios web. Consiste en una página de consulta donde un alumno introduciendo su clave o número de control podrá consultar las notas de las distintas materias en las que está matriculado.<br /><br /><span style="color: rgb(153, 0, 0);">Trata de realizar algo similar con esta base de datos </span><a style="color: rgb(0, 0, 153);" href="http://www.yunque.net/jbabilon/Books2000.mdb">de Libros</a><span style="color: rgb(153, 0, 0);">. Simplemente utiliza la tabla BOOKS para realizar consultas por género (campo DETCAT).</span><br /><br /></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-59903764097225182762011-03-29T10:13:00.000-07:002011-03-29T10:28:53.301-07:00Ejemplo de control de usuario personalizado<div style="text-align: justify; font-weight: bold;">Examina <a href="http://db.tt/UWH6jNw">este ejemplo</a> de control de usuario personalizado. En él se implementa un cuadro de texto que nos avisa de que el dato introducido debe ser numérico en caso de que hayamos introducido caracteres no numéricos.<br /><br />Puedes seguir el ejemplo paso a paso en <a href="http://www.maestrosdelweb.com/editorial/tutorial-asp-net-controles-de-usuarios-reutilizables/">este tutorial</a>. La única diferencia es que en él en vez de colocar en el cuadro de texto un aviso simplemente se vacía.</div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-83212029840609476712011-03-29T08:39:00.000-07:002011-03-30T10:32:13.258-07:00Ejercicio. Conversor de moneda<div style="text-align: justify;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyqwlx29rR4r24Yklt7P4-wkx5w76tpil0693VIEalHjugIAShWOIraHGYzcUc4yqJoDDwDXYUuP1mgDujWMSWjhKaP1I1Tiv9uskjey9mBzXT_0yUsOwnD2nUtWCkLimjhR6wqLxJGAdb/s1600/Conversor.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 297px; height: 242px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyqwlx29rR4r24Yklt7P4-wkx5w76tpil0693VIEalHjugIAShWOIraHGYzcUc4yqJoDDwDXYUuP1mgDujWMSWjhKaP1I1Tiv9uskjey9mBzXT_0yUsOwnD2nUtWCkLimjhR6wqLxJGAdb/s320/Conversor.bmp" alt="" id="BLOGGER_PHOTO_ID_5589527049371589474" border="0" /></a><span style="font-weight: bold;">Crea un sencillo conversor de moneda que sea capaz de pasar valores a Euros, Dólares americanos y Rublos sabiendo que a día de hoy 1 € = 1.4083 USD y 1€= 39.9563 RUB. No obstante, y para poder modificar dichos valores en un futuro, inclúyelos como parámetros en web.config. </span><br /><br /><span style="font-weight: bold;">Asimismo, utilizando cookies o sesiones, haz que en la etiqueta del resultado siempre se muestre la última conversión aunque se cierre la ventana del navegador y se vuelva a entrar, siempre que no expire el tiempo de la sesión. </span><br /><br /><span style="font-weight: bold;">Por otra parte, convierte el campo de texto donde se introduce la cantidad en un campo obligatorio utilizando un objeto de validación.</span><br /><br /><div style="text-align: center;font-family:trebuchet ms;"><span style="color: rgb(153, 0, 0); font-weight: bold;font-size:180%;" >Haz clic <a style="color: rgb(0, 0, 153);" href="http://db.tt/ORsGO5Z">aquí</a> para descargar una posible solución</span><br /></div><br /></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-81312939245501153552011-03-29T07:44:00.000-07:002011-03-29T08:21:25.276-07:00Ejemplo del uso de sesiones en ASP.NET<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH2fp9K9xE1WB7QfbTyz-gHkRknDkvHHwFcSm9H8hcYyOClohMkT3OVre2rW2YxwR1ZnAQlPjm3F0_B7gUG9UixwpsNM6kqVeldPmJoykBHMCjw7lIQjgpfI_o8ksnCjbHBdBO0pydTcqf/s1600/selectorColor.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 122px; height: 39px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH2fp9K9xE1WB7QfbTyz-gHkRknDkvHHwFcSm9H8hcYyOClohMkT3OVre2rW2YxwR1ZnAQlPjm3F0_B7gUG9UixwpsNM6kqVeldPmJoykBHMCjw7lIQjgpfI_o8ksnCjbHBdBO0pydTcqf/s320/selectorColor.bmp" alt="" id="BLOGGER_PHOTO_ID_5589518631787110194" border="0" /></a><br /><div style="text-align: justify;"><span style="font-weight: bold;">En <a href="http://db.tt/5HBuZzu">este ejemplo</a> se emplea una variable de sesión BackgroundColor para mantener el color de fondo elegido por el usuario en el primer acceso al servidor en solicitudes posteriores, no pudiéndose variar mientras no expire el tiempo máximo de la sesion.</span><br /></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com1tag:blogger.com,1999:blog-337189836017931311.post-33624446005032499792011-03-29T02:42:00.001-07:002011-03-29T08:22:23.699-07:00Solución al ejercicio propuesto de Threads "pang-ping-pong-pung"<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3sdRSR-y39XLFdrYPeEjOPbdzuy9F-mHGg5l3e4kZLFHpCgUf0qFbJAfmoQnfCcglylPhIp4eZpN1MgPYCG7Oe1M_ycFkPeGSdjF-Tcv5YsLPI29BK2JUoDfH6NDXOeKj7sWEfNqz8O4w/s1600/pangpingpongpung.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 162px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3sdRSR-y39XLFdrYPeEjOPbdzuy9F-mHGg5l3e4kZLFHpCgUf0qFbJAfmoQnfCcglylPhIp4eZpN1MgPYCG7Oe1M_ycFkPeGSdjF-Tcv5YsLPI29BK2JUoDfH6NDXOeKj7sWEfNqz8O4w/s320/pangpingpongpung.bmp" alt="" id="BLOGGER_PHOTO_ID_5589435103929098882" border="0" /></a><br /><pre>using System;<br />using System.Threading;<br /><br />namespace PangPingPongPung<br />{<br /><br /><br />public class Contador<br />{<br /> const int NUM_HILOS=4;<br /> private int Turno;<br /> private string[] Mensajes={"pang", "ping", "pong", "pung"};<br /><br /> public Contador(int Turno)<br /> {<br /> this.Turno=Turno;<br /> }<br /> <br /> public void Incrementar()<br /> {<br /> Turno++;<br /> }<br /><br /> public string ValorActual()<br /> {<br /> return (Turno%NUM_HILOS).ToString();<br /> }<br /><br /> public string MensajeActual()<br /> {<br /> return Mensajes[Turno%NUM_HILOS];<br /> }<br /><br />}<br /><br />class Program<br /><br />{<br /> private Contador c;<br /> const int NUM_HILOS=4;<br /> public Program(int turnoInicial)<br /> {<br /> Thread [] vThreads=new Thread[4];<br /> c=new Contador(turnoInicial);<br /> for (int I=0; I<NUM_HILOS; I++) {<br /> vThreads[I]=new Thread(new ThreadStart(pangpingpongpung));<br /> vThreads[I].Name=I.ToString();<br /> vThreads[I].Start();<br /> if (I<NUM_HILOS-1)<br /> vThreads[I].Join(20);<br /> else<br /> vThreads[I].Join(10000);<br /> }<br /> for (int I=0; I<NUM_HILOS; I++)<br /> vThreads[I].Abort();<br /> <br /> Console.Write("Press any key to continue . . . ");<br /> Console.ReadKey(true);<br /> }<br /><br /> public static void Main(string[] args)<br /> {<br /> Program p=new Program(0);<br /> }<br /><br /><br /><br /><br /> public void pangpingpongpung()<br /> {<br /> while (true) {<br /> Monitor.Enter(c);<br /> try{<br /> if (Thread.CurrentThread.Name==c.ValorActual()) {<br /> Console.WriteLine(c.MensajeActual());<br /> c.Incrementar();<br /> int esperaAleatoria=new Random(<br /> DateTime.Now.Millisecond).Next()%500;<br /> Thread.Sleep(esperaAleatoria);<br /> }<br /> }<br /> finally {<br /> Monitor.Exit(c);<br /> }<br /> }<br /> }<br />}<br />}<br /></pre>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-39479279066656770542011-03-28T13:25:00.000-07:002011-03-29T01:39:24.879-07:00Ejemplo. Visto en clase: Iniciación a ASP .NET<pre><span style="color: rgb(204, 0, 0);font-size:130%;" ><span style="font-weight: bold;">Archivo default.aspx.cs</span></span><br /><br />using System;<br />using System.Configuration;<br />using System.Data;<br />using System.Linq;<br />using System.Web;<br />using System.Web.Security;<br />using System.Web.UI;<br />using System.Web.UI.HtmlControls;<br />using System.Web.UI.WebControls;<br />using System.Web.UI.WebControls.WebParts;<br />using System.Xml.Linq;<br />using System.Collections;<br />using System.Collections.Specialized;<br /><br /><br />public partial class _Default : System.Web.UI.Page<br />{<br /><br />protected void BtnEnviar_Click(object sender, EventArgs e)<br />{<br /> EtiRespuesta.Visible = true;<br /> EtiRespuesta.Text = "Hola " + TxtNombre.Text;<br /><br /> Response.Write("Estoy escribiendo con el objeto Response <br />");<br /> Response.Write("Información del objeto Request " +<br /> Request.Browser.Browser+"<br />);<br /><br /><br /> // Visualizando la colección de parámetros<br /> // del archivo web.config<br /> NameValueCollection Coleccion;<br /><br /> Coleccion=(NameValueCollection)Context.GetConfig("appSettings");<br /> for (int iCtr = 0; iCtr < Coleccion.Count; iCtr++)<br /> {<br /> String s = Coleccion.Keys[iCtr];<br /> Response.Write(s+" "+Coleccion[s]+"<br />");<br /> }<br /><br />}<br />protected void Page_Load(object sender, EventArgs e)<br />{<br /> if (Request.Cookies["ultimaVisita"] == null)<br /> Response.Write("Es tu primera visita");<br /> else<br /> Response.Write("Tu última visita fue: "+<br /> Request.Cookies["ultimaVisita"].Value);<br /><br /> Response.Cookies["UltimaVisita"].Value=DateTime.Now.ToString();<br /> Response.Cookies["UltimaVisita"].Expires=DateTime.Now.AddMinutes(2);<br />}<br />}<br /></pre>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-45680040561028938392011-03-28T08:35:00.000-07:002011-03-28T09:25:24.719-07:00Desarrollo de aplicaciones Web con Microsoft ASP.NET utilizando Visual Studio .NET<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.willydev.net/descargas/cursos/aspnet/"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 443px; height: 190px;" src="http://www.onglasses.net/wwwroot/UpFiles/Imagenes/Articulos/cursoASP1.JPG" alt="" border="0" /></a><span style="color: rgb(153, 0, 0);font-size:130%;" >Si utilizas un navegador distinto a Microsoft Explorer puede que no visualices adecuadamente el curso. Haz clic en la imagen para iniciarlo</span><br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://db.tt/avbQR4K"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 467px; height: 350px;" src="http://blog.ihualia.com/wp-content/uploads/2010/08/by3u319j8ncf4767ublm6tl18w1.jpg" alt="" border="0" /></a><br /><div style="text-align: center; color: rgb(153, 0, 0);"><span style="font-size:180%;"><span style="font-size:100%;">Haz clic en la imagen para bajar el contenido del curso en PDF</span><br /></span></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-50647548173199927382011-03-26T05:32:00.000-07:002011-03-26T05:50:02.991-07:00Ejercicio. Ping Pong concurrente.<div style="text-align: justify; color: rgb(153, 0, 0);">Sincroniza dos threads de manera que uno escriba <span style="color: rgb(0, 0, 153);">Ping </span>por pantalla sólo cuando el anterior allá escrito <span style="color: rgb(0, 0, 153);">Pong</span>, alternando de forma perfecta las dos escrituras. Emplea los métodos <span style="font-weight: bold;">Enter()</span> y <span style="font-weight: bold;">Exit() </span>de la clase Monitor.<br /><br /><span style="color: rgb(102, 51, 102);"><span style="font-weight: bold;">NOTA</span>: debido al boxing y unboxing (conversión de los tipos primitivos a su respectivo objeto del CTS y viceversa), bloquear tipos primitivos puede hacer que no funcionen los bloqueos. Envuelve dichos tipos en una clase creada por ti para evitarlo.</span><br /></div><br /><div style="text-align: center;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://db.tt/YITSzcs"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 202px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNXlS3A-Up8ZMyEgX-X1uVoygGucRmY2awyEhtkDFWtJX3tE5fju-8ysKZJkDlMfMlRCHdqe3MOW5YuzqO4xrNCUvzJvgcHHQ2wmLtWK7JEJvaBs6GnJbSWzU3SJ2MlV11yqiSelff9B-0/s400/pingpong.bmp" alt="" id="BLOGGER_PHOTO_ID_5588367896798088770" border="0" /></a><span style="font-weight: bold;">Haz clic en la imagen para descargar la solución al problema de Ping Pong con monitores.</span><br /></div><br /><br /><span style="font-weight: bold; color: rgb(0, 51, 0);">PROBLEMA PROPUESTO</span><span style="color: rgb(0, 51, 0);">. Realiza el mismo ejercicio pero con cuantro hilos que escriban de forma alterna Pang-Ping-Pong-Pung</span>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-78352612750236456392011-03-26T03:14:00.000-07:002011-03-26T04:00:39.528-07:00Dudas alumnos. Qué diferencia hay entre Monitor.Try() y Monitor.TryEnter()<div style="text-align: justify;"><span style="font-weight: bold; color: rgb(153, 0, 0);">Con TryEnter si el recurso está libre se bloquea, si no, se espera el tiempo especificado. </span><span style="font-weight: bold; color: rgb(153, 0, 0);">En caso de que el tiempo expire y el recurso siga bloquedo se devuelve False para poder </span><span style="font-weight: bold; color: rgb(153, 0, 0);">continuar con otros procesos si es preferible a esperar por conseguir el recurso compartido. </span><br /></div><br /><pre class="lang-cs prettyprint"><br /> public bool WaitToAddElement(object qValue, int waitTime)<br /> {<br /> if(!Monitor.TryEnter(m_inputQueue,waitTime))<br /> return false;<br /> m_inputQueue.Enqueue(qValue);<br /> Monitor.Exit(m_inputQueue);<br /><br /> return true;<br /> }<br /></pre><br /><code><span class="pln"></span><span class="pun"></span><span class="pln"><br /><br /><br /></span></code> <span style="color: rgb(153, 0, 0); font-weight: bold;">En cambio, con Enter, el hilo se bloquearía sin condiciones si el recurso está</span><span style="color: rgb(153, 0, 0); font-weight: bold;"> siendo usado por otro hilo.</span><br /><pre class="lang-cs prettyprint"><br /> public void AddElement(object qValue)<br /><br /> {<br /> Monitor.Enter(m_inputQueue);<br /> m_inputQueue.Enqueue(qValue);<br /> Monitor.Exit(m_inputQueue);<br /> }<br /><br /></pre>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-52145514822839821902011-03-26T02:39:00.000-07:002011-03-26T02:56:53.026-07:00Suspend y Resume obsoletos. Cómo resolver el problema<pre class="lang-cs prettyprint"><code><span class="kwd"><span style="font-weight: bold;">ANTES:</span><br /><br /></span></code><code><span class="kwd">private</span><span class="pln"> </span><span class="typ">Thread</span><span class="pln"> myThread</span><span class="pun">;</span><span class="pln"><br /><br /></span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">WorkerThread</span><span class="pun">()</span><span class="pln"><br /></span><span class="pun">{</span><span class="pln"><br />myThread </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Thread</span><span class="pun">.</span><span class="typ">CurrentThread</span><span class="pun">;</span><span class="pln"><br /></span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"><br /></span><span class="pun">{</span><span class="pln"><br /> myThread</span><span class="pun">.</span><span class="typ">Suspend</span><span class="pun">();</span><span class="pln"><br /> </span><span class="com">//Ejecutar tareas</span><span class="pln"><br /></span><span class="pun">}</span><span class="pln"><br /></span><span class="pun">}</span><span class="pln"><br /><br /></span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">StartWorking</span><span class="pun">()</span><span class="pln"><br /></span><span class="pun">{</span><span class="pln"><br />myThread</span><span class="pun">.</span><span class="typ">Resume</span><span class="pun">();</span><span class="pln"><br /></span><span class="pun">}</span><span class="pln"><br /></span></code><br /><code><span class="kwd"><br />***************************************<br /><br /><span style="font-weight: bold;">AHORA:</span><br /><br /><br /><br />...<br /><br /></span><span class="pun"></span></code><code><span><span class="kwd">private static EventWaitHandle wh;<br /><br />...</span></span></code><code><span class="pln"><br />wh = new EventWaitHandle(false,EventResetMode.AutoReset);<br /></span><span class="kwd"><br />...<br /><br />private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">WorkerThread</span><span class="pun">()</span><span class="pln"><br /></span><span class="pun">{<br /><br /><br /></span><span class="pln"> </span><span class="kwd">while</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"><br /></span><span class="pun">{</span><span class="pln"><br /> wh.WaitOne();</span><span class="pun"></span><span class="pln"><br /> </span><span class="com">//Ejecutar tareas</span><span class="pln"><br /></span><span class="pun">}</span><span class="pln"><br /></span><span class="pun">}</span><span class="pln"><br /><br /></span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">StartWorking</span><span class="pun">()</span><span class="pln"><br /></span><span class="pun">{</span><span class="pln"><br />wh.Set();</span><span class="pun"></span><span class="pln"><br /></span><span class="pun">}</span><span class="pln"><br /></span></code></pre>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-553796693665151592011-03-25T18:08:00.000-07:002011-03-25T18:11:11.914-07:00Práctica de threading.<div><object style="width: 420px; height: 297px;"><param name="movie" value="http://static.issuu.com/webembed/viewers/style1/v1/IssuuViewer.swf?mode=embed&layout=http%3A%2F%2Fskin.issuu.com%2Fv%2Fcolor%2Flayout.xml&backgroundColor=A4112B&showFlipBtn=true&documentId=110326010723-2450cd7c77634cc5bfdf35a7742859c3&docName=hilos&username=Mejia&loadingInfoText=Threads%2FHilos%20en%20C%23&et=1301101691879&er=77"><param name="allowfullscreen" value="true"><param name="menu" value="false"><embed src="http://static.issuu.com/webembed/viewers/style1/v1/IssuuViewer.swf" type="application/x-shockwave-flash" allowfullscreen="true" menu="false" style="width: 420px; height: 297px;" flashvars="mode=embed&layout=http%3A%2F%2Fskin.issuu.com%2Fv%2Fcolor%2Flayout.xml&backgroundColor=A4112B&showFlipBtn=true&documentId=110326010723-2450cd7c77634cc5bfdf35a7742859c3&docName=hilos&username=Mejia&loadingInfoText=Threads%2FHilos%20en%20C%23&et=1301101691879&er=77"></embed></object><div style="width: 420px; text-align: left;"><br /><div style="text-align: center; font-weight: bold; color: rgb(0, 0, 102);"><span style="font-size:130%;">Puedes descargarlo <a href="http://db.tt/gG4Nk0X">aquí</a><br /><a href="http://issuu.com/search?q=c%20sharpp" target="_blank"></a></span></div></div></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-81817505526421007462011-03-25T16:55:00.000-07:002015-05-26T11:26:37.367-07:00Programación multihilo. Introducción<div>
<embed align="middle" allowfullscreen="true" flashvars="mode=embed&layout=http%3A%2F%2Fskin.issuu.com%2Fv%2Fcolor%2Flayout.xml&backgroundColor=A4112B&showFlipBtn=true&documentId=110326002751-86c164e9d4bf4525a7f6da9d729f1505&docName=threads_csharp&username=Mejia&loadingInfoText=Threading%20en%20C%23&et=1301099332729&er=94" menu="false" name="flashticker" quality="high" salign="l" scale="noscale" src="http://static.issuu.com/webembed/viewers/style1/v1/IssuuViewer.swf" style="height: 297px; width: 420px;" type="application/x-shockwave-flash"></embed><br />
<div style="text-align: left; width: 420px;">
<a href="http://issuu.com/Mejia/docs/threads_csharp?mode=embed&layout=http%3A%2F%2Fskin.issuu.com%2Fv%2Fcolor%2Flayout.xml&backgroundColor=A4112B&showFlipBtn=true" target="_blank"><br /></a></div>
</div>
<br />
<br />
<div style="color: #000099; font-weight: bold; text-align: center;">
<span style="font-size: 130%;">Puedes descargarlo <a href="https://www.dropbox.com/s/lgl8s38uski652u/threads_csharp.pdf?dl=0">aquí</a></span></div>
Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com4tag:blogger.com,1999:blog-337189836017931311.post-60274340244219333132011-03-24T13:25:00.000-07:002011-03-24T13:30:57.462-07:00Ejercicio. Repaso<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.mundoprogramacion.com/NET/ADONET/ejemplo_adonet_sql_csharp.htm"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 429px; height: 343px;" src="http://www.mundoprogramacion.com/NET/ADONET/ejemplo_adonet_sql01.png" alt="" border="0" /></a><br /><div style="text-align: justify;"><span style="font-weight: bold;">A partir de los pasos vistos en los ejercicios anteriores de ADO.NET trata de realizar el ejercicio planteado (Haz clic en la imagen para verlo). El único cambio a adoptar es utilizar una base de datos Access en lugar de una base de datos SQL Server. Trata de guiarte por los conocimientos adquiridos más que por las propuestas del ejemplo, en caso de duda.</span><br /></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-25969479646628496272011-03-24T13:10:00.001-07:002011-03-24T13:18:20.573-07:00Ejercicio. Cargar el archivo de Base de Datos .mdb al arrancar la aplicación<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsf4odRcK8RqqyDqokOP4YHK6_7YCGpcSWjLsHDm4g6eFFMjgsH1IU4kpOe1Lr2qMI2iVaUKVrxujPpMsbBpZ1yZzMqD8WSq4lj0HThtS81vd_GYMZLW5AfUKpmfz_W8OteQ6W5d_TCNIS/s320/dialogo_abrir.gif"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 203px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsf4odRcK8RqqyDqokOP4YHK6_7YCGpcSWjLsHDm4g6eFFMjgsH1IU4kpOe1Lr2qMI2iVaUKVrxujPpMsbBpZ1yZzMqD8WSq4lj0HThtS81vd_GYMZLW5AfUKpmfz_W8OteQ6W5d_TCNIS/s320/dialogo_abrir.gif" alt="" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/imagenes/webbrowser-common-dialog-guardar-pagina.gif"><br /></a><br /><div style="text-align: justify; font-weight: bold;">Si quisiésemos que la aplicación diese la oportunidad de cargar un archivo de Access específico al abrir el formulario principal, sólo tendríamos que añadir un objeto <span style="color: rgb(204, 0, 0);">OpenFileDialog</span><span style="color: rgb(204, 0, 0);"> </span>para cargar la ruta del archivo:<br /></div><br /><pre><br /> public MainForm()<br /> {<br /><br /> <span style="color: rgb(153, 0, 0); font-weight: bold;">OpenFileDialog of = new OpenFileDialog();</span><br /> <span style="color: rgb(153, 0, 0); font-weight: bold;"> of.ShowDialog();</span> <span style="color: rgb(153, 0, 0); font-weight: bold;"><br /> string direccion = of.FileName;</span> <span style="color: rgb(153, 0, 0); font-weight: bold;"><br /> con = new OleDbConnection(</span><br /> <span style="color: rgb(153, 0, 0); font-weight: bold;">"Provider=Microsoft.Jet.OLEDB.4.0;</span><br /><span style="color: rgb(153, 0, 0); font-weight: bold;"> Data Source="+direccion+";</span> <span style="color: rgb(153, 0, 0); font-weight: bold;"> <br /> Persist Security Info=True");</span><br /> con.Open();<br /> InitializeComponent();<br /><br /><br /> }<br /></pre>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-2785701115603477042011-03-24T10:35:00.000-07:002011-03-24T10:42:53.778-07:00Libros. Para saber más... ADO .NET step by step<div style="text-align: center; font-weight: bold; color: rgb(153, 0, 0);">[Haz clic en la portada del libro para descargarlo]<br /></div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://easy-share.com/1912874378"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 397px; height: 487px;" src="http://nsa20.casimages.com/img/2010/11/05/1011050448042610.jpg" alt="" border="0" /></a><br /><ul><li>Conectarse a orígenes de datos externos, incluyendo bases de datos y otras formas de almacenamiento.</li><li>Uso del framework ADO.NET para interactuar con almacenes de datos subyacentes.</li><li>Crear modelos de entidad con herramientas de diseño gráfico en Visual Studio 2010</li><li>Vincular datos directamente a tus formularios Windows y Web para proporcionar información a los usuarios.</li><li>Manejar datos e información aislada sin estar conectado directamente a una base de datos.<br /></li></ul><span style="display: block; width: 735px; overflow: hidden;"></span>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-53018938318640317012011-03-24T09:53:00.000-07:002011-03-24T10:01:08.363-07:00Ejercicio. Habilitar un cuadro de búsqueda<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVpesykYhcGkc-zni4cLezNT4HXKSkp9pUVH2nkk87NFnqYsDsUWLcYa-mYOaQd6UGXTGqsY_whKcoOrX_YGKzStfG98Sk9hOWIl2l5xAQsv2uOE6kwrTfXBoDxhDS6pzKm0RlzYFg-W7p/s1600/cuadroBusqueda.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 276px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVpesykYhcGkc-zni4cLezNT4HXKSkp9pUVH2nkk87NFnqYsDsUWLcYa-mYOaQd6UGXTGqsY_whKcoOrX_YGKzStfG98Sk9hOWIl2l5xAQsv2uOE6kwrTfXBoDxhDS6pzKm0RlzYFg-W7p/s400/cuadroBusqueda.bmp" alt="" id="BLOGGER_PHOTO_ID_5587690902675869250" border="0" /></a><br /><div style="text-align: justify;">Añade un cuadro de búsqueda simple de tal modo que al introducir el nombre de la persona buscada se marque el registro correspondiente a la misma. En caso contrario, se visualizará una ventana de alerta advirtiéndonos de que el nombre no existe. Para ello, inserta mediante el diseñador de formularios un cuadro de texto (llámale <span style="font-weight: bold;">txtBusquedaNombre</span>) y un botón (llámale <span style="font-weight: bold;">btnBusqueda</span>) En el método que atienda el evento de clic incluye un código como este adaptándolo a los nombres de objetos de tu proyecto (aquí <span style="font-weight: bold;">bs </span>es el objeto <span style="font-weight: bold;">BindingSource</span>)<br /><br /></div><pre> int elementoEncontrado =<br /> bs.Find("Nombre",textBusquedaNombre.Text );<br /> if (elementoEncontrado>=0)<br /> bs.Position = elementoEncontrado;<br /> else MessageBox.Show("Nombre no encontrado");<br /></pre>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-3918221143017008192011-03-24T08:00:00.000-07:002011-03-24T13:01:39.722-07:00Ejercicio. Insertar controles de navegación<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7m81ESPdsNVtUR-gcWZLY-W1X2Q58NV4x_zCnHlvG_FqXo8RsAuvx03wZN1iSoPsmEV-th2lorTNPPgvJJNYWykoIF03goGJq3KmG83VQfmZLnNOG4K4lpa74HT5TeFx8yygV-wh1LQF1/s1600/BindingNavigator.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 276px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7m81ESPdsNVtUR-gcWZLY-W1X2Q58NV4x_zCnHlvG_FqXo8RsAuvx03wZN1iSoPsmEV-th2lorTNPPgvJJNYWykoIF03goGJq3KmG83VQfmZLnNOG4K4lpa74HT5TeFx8yygV-wh1LQF1/s400/BindingNavigator.bmp" alt="" id="BLOGGER_PHOTO_ID_5587661588498011586" border="0" /></a><br /><div style="text-align: justify;">Partiendo de tu proyecto del ejercicio anterior o de <a href="http://db.tt/09qzjdQ">este proyecto ya resuelto</a>, añade una barra de navegación que permita moverse por los registros de la tabla. Para ello, inserta utilizando el IDE de Sharp Develop un control de tipo <span style="font-weight: bold;">BindingNavigator</span>. Para mayor claridad del código, llámale Navegador. El navegador ya implementa toda la funcionalidad necesaria; lo único que tienes que hacer es asociarlo al objeto BindingSource vinculado a los datos. Es decir añade el código marcado en rojo:<br /></div><br /><pre><br /> ds=new DataSet();<br /> OleDbCommand cmd = new OleDbCommand(<br /> "Select Id, Nombre, Edad from Persona",con);<br /> da=new OleDbDataAdapter(cmd);<br /> cb = new OleDbCommandBuilder(da);<br /> da.Fill(ds);<br /> bs=new BindingSource();<br /> bs.DataSource=ds.Tables[0];<br /> dgPersona.DataSource=bs;<br /> <span style="font-weight: bold; color: rgb(204, 0, 0);"> Navegador.BindingSource=bs;</span><br /><br /></pre><br /><div style="text-align: justify;">Si haces clic sobre el objeto <span style="font-weight: bold;">BindingNavigator </span>en el diseñador de formularios aparecerá una flecha negra en la esquina superior derecha del control desde la que puedes acceder a la opción <span style="font-weight: bold;">Dock </span>(anclar). Selecciona <span style="font-weight: bold;">Button </span>para colocar el navegador en la parte inferior de la ventana tal y como se muestra en la figura, de manera que no se solape con los controles ya dispuestos sobre el formulario principal.<br /><br />*************************************<br /><br /><a href="http://www.codeproject.com/KB/grid/BindSourceBindingNavCS/image1.jpg"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 372px; height: 288px;" src="http://www.codeproject.com/KB/grid/BindSourceBindingNavCS/image1.jpg" alt="" border="0" /></a><br />Ahora imagina que no dispusieses del objeto <span style="font-weight: bold;">BindingNavigator </span>y tuvieses que conseguir la misma funcionalidad de desplazamiento con botones y una etiqueta que muestre en qué registro nos encontramos del total. Descarga el siguiente <a href="http://db.tt/lIhXyE0">proyecto de codeproject.com</a> en el que se implementa este aspecto para una base de datos SQL Server. Aunque no lo podrás ejecutar directamente sí se representa en el diseñador de formularios, lo que te permitirá rastrear los métodos asociados a los eventos de clic de cada botón. En realidad, el proceso resulta tan simple como invocar a los métodos <span style="font-weight: bold;">moveFirst(),</span> <span style="font-weight: bold;">moveLast()</span>, <span style="font-weight: bold;">moveNext()</span> y <span style="font-weight: bold;">movePrevious() </span>del objeto <span style="font-weight: bold;">BindingSource </span>con alguna lógica adicional. Haz lo mismo sobre tu proyecto.<br /><br /></div>Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0tag:blogger.com,1999:blog-337189836017931311.post-15820161444427075202011-03-23T11:13:00.000-07:002011-03-24T08:47:24.490-07:00Ejercicio. Vincular campos de texto a un BindingSource.<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWqCr7hAGWlEpMQfKn0JBKYPvbz5lZGItihv-L39yjFmg8uO2MGEjW2-EZx3v0iSaDA5sCokEZLfs8dVtkaQOEyaNSScF07FEDAL5Hps1vc1-2kqeqd7jv-iXC88Gz_CQqK7q0WybXMz3j/s1600/vincularCuadrosDeTexto.bmp"><img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 220px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWqCr7hAGWlEpMQfKn0JBKYPvbz5lZGItihv-L39yjFmg8uO2MGEjW2-EZx3v0iSaDA5sCokEZLfs8dVtkaQOEyaNSScF07FEDAL5Hps1vc1-2kqeqd7jv-iXC88Gz_CQqK7q0WybXMz3j/s400/vincularCuadrosDeTexto.bmp" alt="" id="BLOGGER_PHOTO_ID_5587341662368795906" border="0" /></a><br /><div style="text-align: justify;"><span style="font-weight: bold;">Sobre el proyecto del ejercicio anterior, vamos a hacer que cada vez que haga clic en un registro del DataGridView, automáticamente se visualice el nombre y la edad de la persona seleccionada en los cuadros de texto correspondientes. Para ello modifica el método que trata la carga del formulario de la siguiente manera:</span><br /></div><br /><pre><br />void MainFormLoad(object sender, EventArgs e)<br /> {<br /> this.ActualizarGrid();<br /> this.txtNombre.DataBindings.Add(<br /> new Binding("Text",bs,"Nombre",true));<br /> this.mstxtEdad.DataBindings.Add(<br /> new Binding("Text",bs,"Edad",true));<br /> }<br /></pre><br />Aquí, <span style="font-weight: bold;">this.txtNombre</span> y <span style="font-weight: bold;">this.mstxtEdad </span>son los campos de texto del Nombre y la Edad de la persona respectivamente; <span style="font-weight: bold;">bs</span> es nuestro objeto<span style="font-weight: bold;"> BindingSource</span> y "Nombre" y "Edad" son los campos de la tabla <span style="font-weight: bold;">Persona </span>en la base de datos. <span style="font-weight: bold;">Text </span>es la propiedad de los controles en la que almacenamos los valores y el valor booleano <span style="font-weight: bold;">true </span>me indica que dejo habilitado el formateo de datos.Neuromantehttp://www.blogger.com/profile/06894823022047676520noreply@blogger.com0