dotnetmanía - tecnología, tips de programación y datos ... · tica”, ha declarado bill gates....
TRANSCRIPT
WebParts en ASP.NET 2.0 (II) • Modelos de seguridad en dispositivos móviles • Detección deproblemas de rendimiento en SQL Server 2000 y 2005 (III). Qué consultas procesa miservidor SQL Server • Acceso asistido a datos con ADO.NET 2.0 yVisual Studio 2005
dotNetManíanº
27 ju
nio
2006
• 6
,50
€ (E
spañ
a)Visual Basic • C# • ASP.NET • ADO.NET • .NET Framework • Windows Server System
dotNetManíawww.dotnetmania.com Dedicada a los profesionales de la plataforma .NET
Bienvenido al número 27, de junio de2006, de dotNetManía.
Este mes tenemos la suerte de habercharlado con una leyenda de la historiade la informática (o con un viejo pro-gamador, como prefiere definirse élmismo): David Intersimone. OctavioHernández, con amplia experiencia enlos entornos de desarrollo de Borland-entre otras materias-, ha sido el encar-gado de realizar la entrevista para loslectores de dotNetManía. David esactualmente vicepresidente de relacio-nes con los desarrolladores de Borland,aunque pronto dejará de serlo. Como yasabrá, Borland ha decidido desprender-se de la línea de entornos de desarrolloy esta parte del negocio la retomará unanueva empresa creada ex profeso a la quepertenecerá David, fiel a sus orígenes, ytambién Jason Vokes, quien participóactivamente en la entrevista. Así queBorland ya no será lo que fue y lo quevenga será lo que un día fue Borland...Nos queda desearle suerte a David, aJason y a todos los que se embarquen enesta nueva aventura. Les mantendremosinformados.
Seguimos con los artículos seriados“WebParts en ASP.NET 2.0” y “Detec-ción de problemas de rendimiento enSQL Server 2000 y 2005 (III)”, de JoséManuel Alarcón y Eladio Rincón.Como quizá sepa, no me gustan mucholas series, pero esta vez creo que merecela pena realmente.
El artículo central de este mes es“Estilos en XAML”. Un fenomal artícu-lo de Luis Miguel Blanco que reco-miendo vivamente a quien quiera comen-zar a usar estilos en XAML. Le recuerdoque no necesita Windows Vista; descár-guese la última CTP de WinFX y prue-be los ejemplos.
Como cada mes, y siempre quepodemos, damos la bienvenida a estu-pendos nuevos autores: a Unai Zorrillaque se estrena con su “Modelos deseguridad en dispositivos móviles” y aFrancisco Javier Rodríguez recien-temente nombrado MVP de IronSpeed, el único español que lo es porahora –quién mejor que él para evaluareste producto–.
Pero, por supuesto, dentro hay más.Espero que le guste.
dotN
etM
anía
<<
3
Leyendas de la Informática
dotNetManíaDedicada a los profesionales de la plataforma .NET
Vol. III •Número 27 • Junio 2006Precio: 6,50€
EditorPaco Marín
Atención al suscriptorPilar Pérez
Redactor JefeMarino Posadas
Consejo de RedacciónDino Esposito, Guillermo 'guille' Som, José
Manuel Alarcón, Lorenzo Ponte, LuisMiguel Blanco, Miguel Katrib (Grupo
Weboo) y Octavio Hernández
Colaboradores habitualesAntonio Quirós, Braulio Díez, Carlos
Quintero, Eladio Rincón, Javier Aragonés,Jorge Serrano, José Miguel Torres, PepeHevia, Salvador Ramos y Sergio Vázquez
Además colaboran en este númeroFrancisco Javier Rodríguez y Unai Zorrilla
IlustracionesYamil Hernández
Edición, suscripciones y publicidad.netalia
c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)
www.dotnetmania.com
Tf. (34) 91 666 74 77Fax (34) 91 499 13 64
ImprimeGráficas Vallehermoso
www.graficasvallehermoso.com
ISSN1698-5451
Depósito LegalM-3.075-2004
>>
<<
dnm.editorial
Paco MarínEditor de dotNetManía
27dnm.sumario
dnm
.sum
ario
Entrevista a David Intersimone y Jason Vokes 12-14Con motivo del seminario efectuado en Madrid el pasado 8 de mayo como parte delDeveloper Studio 2006 World Tour, dotNetManía entrevistó a David Intersimone,actual Vicepresidente de Relaciones con los Desarrolladores de Borland y a JasonVokes, Director para Europa de la línea de productos Delphi/C++. La entrevistaganaba aún más interés con motivo del reciente anuncio por parte de Borland dedesprenderse de la línea de entornos de desarrollo para concentrarse únicamente enlas herramientas de Ciclo de Vida del Software.
WebParts en ASP.NET 2.0 (II) 16-19En esta segunda entrega sobre la creación de páginas personalizables con WebParts, vamosa estudiar algunas características que van más allá de los conceptos básicos estudiadosanteriormente.
Modelos de seguridad en dispositivos móviles 20-24Los modelos de seguridad en dispositivos móviles son los grandes desconocidos para losdesarrolladores de software; sin embargo, entenderlos es fundamental para comprenderciertos problemas en el desarrollo y realizar aplicaciones más seguras. Mediante este artículotrataremos de explicar, tanto desde el punto de vista teórico como práctico, cómo funcionanlos distintos modelos impuestos por los fabricantes y operadoras de telefonía.
Estilos en XAML 25-36Con la llegada de Windows Vista se presentará también oficialmente WinFX, lanueva plataforma para la creación de aplicaciones, que cubre dos grandes áreas deldesarrollo: interfaces de usuario con WPF(Avalon), y comunicaciones con WCF(Indigo); tecnologías ambas que se perfilan como claves para la próxima generaciónde aplicaciones. En el presente artículo vamos a realizar una revisión de los elementosque WPF pone a disposición del desarrollador para aplicar estilos a los controles denuestras ventanas.
Detección de problemas de rendimiento en SQL Server 2000 y 2005 (III)Qué consultas procesa mi servidor SQL Server 38-42
Este es el tercer artículo de la serie, y en él nos vamos a centrar en cómo y qué “cosas”auditar de las conexiones de usuario que llegan al servidor. Para auditar las peticionesque realizan los clientes utilizaremos SQL Server Profiler (existente en SQL Server2000 y SQL Server 2005).
Acceso asistido a datos con ADO.NET 2.0 y Visual Studio 2005 43-47Como ya adelantamos en el artículo anterior, en éste veremos cómo utilizar los asistentes deVisual Studio 2005 relacionados con el acceso a datos. En particular, veremos los pasosnecesarios para crear formularios tanto para introducir datos como para mostrar el resultadode la llamada a un procedimiento almacenado de SQL Server 2005.
dnm.laboratorioIron Speed Designer 48-51
En la era del desarrollo fugaz y las tareas repetitivas CRUD (Create, Restore, Update,Delete), Iron Speed nos ofrece su particular visión centrada en ASP.NET. Aunquea muchos ni siquiera les sonará este nombre, lo cierto es que son muchos los desarro-lladores, empresas y organizaciones gubernamentales que lo utilizan.
dnm.todotnet.qaCuando la IU se viste de gala 52-54
Este mes tenemos tres preguntas relacionadas con la Interfaz de Usuario (IU). Veremoscómo añadir una ventana corporativa (splash window) a las aplicaciones WindowsForms, cómo suministrar un alto nivel de descripción para la API Ink (tinta) enTablet PC y la localización de mapas de sitios Web en ASP.NET.
dnm.biblioteca.net 55Microsoft ASP.NET Coding Strategies with the Microsoft ASP.NET TeamMCAD/MCSD Self-Paced Training Kit: Implementing Security for Applicationswith Microsoft Visual Basic .NET and Microsoft Visual C# .NET
dnm.desvan 58
dotN
etM
anía
<<
6
dnm.noticias<<n
oti
cia
s.n
oti
cia
s.n
oti
cia
s.n
oti
cia
s.n
oti
cia
s.n
oti
cia
s
Microsoft anuncia la disponibilidad de la beta 2 de WindowsVista, 2007 Microsoft Office system y Windows Server
La conferencia anual de inge-niería de hardware de Microsoft,WinHEC, ha sido el escenario ele-gido por Bill Gates, presidente yarquitecto jefe de Microsoft, paraanunciar la disponibilidad inme-diata de la beta 2 de WindowsVista, Microsoft Office System2007 y Windows Server “Long-horn”.
“El lanzamiento de la beta deestos tres productos supone unimportante hecho para Microsoft,así como un gran paso para garan-tizar las plataformas que harán rea-lidad la próxima década informá-tica”, ha declarado Bill Gates.
La beta 2 de Windows Vista yde Windows Server “Longhorn”se encuentran ya disponibles paralos desarrolladores y profesionalesen tecnologías de la información,a través de MSDN y las suscrip-ciones TechNet, así como para losmiembros del Programa de Adopciónde Tecnología (TAP) y del proyectoTechBeta. Además, en las próximassemanas, Microsoft dará comien-zo al programa previo de análisisde Windows Vista para aquellosdesarrolladores y profesionales deTI que no formen parte de los pro-gramas anteriormente citados, yque deseen disponer de los requi-sitos necesarios para comenzar aanalizar los productos. Como par-te del programa de análisis previo,Microsoft concederá, a un ampliogrupo de entusiastas de la tecno-logía, una muestra del sistema ope-rativo para que puedan comenzar
a analizar losdiversos escena-rios de WindowsVista. La beta 2 delos diferentes com-ponentes de 2007Microsoft OfficeSystem estará dis-ponible para sudescarga en españolen la siguiente direc-ción: www.micro-soft.com/spain/office/preview apartir del miércoles,24 de mayo.
Bill Gates tam-bién ha dado aconocer los planes de lanzamien-to de la versión beta del kit dedesarrollo de software (SDK) paraeste verano, que permitirá a lospartners desarrollar dispositivos,que van desde cámaras Web hastaequipos de mano que trabajan conlos servicios Live tanto en PC odirectamente sobre la plataformaWindows Live. Más informaciónen http://dev.live.com/hard-ware.
Disponibilidad de la beta 2 de WinFX y lalicencia Go-Live
Microsoft también ha dado aconocer la beta 2 de WinFX y lacorrespondiente licencia Go-Live,ambas disponibles para los desa-rrolladores en MSDN.
La licencia Go-Live tambiénincluye la primera licencia paraWindows Presentation Foundation ypermite a los clientes el desplieguede aplicaciones para Windows
Vista haciendo uso de algunas delas tecnologías principales deWinFX –Windows PresentationFoundation, Windows WorkflownFoundation, Windows CommunicationFoundation e “InfoCard”, el nombreclave de una tecnología diseñadapara simplificar y mejorar la segu-ridad en el acceso a los recursos, yla información compartida enInternet– antes del lanzamientofinal de WinFX.
Además de todos estos anun-cios, durante la celebración delWinHEC también se han desvela-do nuevos detalles sobre la virtua-lización en Windows Server, quese espera esté disponible con la lle-gada de Windows Server “Long-horn”. Una beta de este productoestará disponible a finales de 2006.Más información sobre la virtuali-zación en Windows Server en:http://www.microsoft.com/presspass/features/2006/may06/05-22Virtualization.mspx.
Bill Gates ha dado a conocer en el WinHEC 2006 las características de sus tres productos insigniay sus ventajas para empresas y usuarios.
Access 2007 corriendo bajo Windows Vista
Inés Arbolí, directora de la División deDesarrolladores y Plataforma de MicrosoftIbérica y José María Soler, director deMovilForum y Aplicaciones Sectoriales deTelefónica Móviles España, han renovadopor segundo año consecutivo la firma delacuerdo de colaboración que ambas enti-dades alcanzaron en marzo de 2005, y cuyoprincipal objetivo es el de potenciar las ayu-das para la comunidad técnica de desarro-lladores de software.
Ambas entidades han establecido suspropios programas de acercamiento a estecolectivo técnico: MSDN (MicrosoftDeveloper Network), la principal herramientade la compañía de software para comuni-carse y formar a los desarrolladores en susúltimas propuestas tecnológicas; yMovilForum, el foro de TelefónicaMóviles que garantiza a este colectivo elacceso a todo lo que necesita para realizaraplicaciones exitosas sobre la red MoviStar.
Dentro del acuerdo alcanzado porambas compañías se incorporan diversasactividades de colaboración mutua, algu-nas de las cuales han sido renovadas tras el
éxito obtenido el pasado año.Entre ellas se encuentran laparticipación de TelefónicaMóviles en el Developer Day, elprincipal evento anual deMicrosoft con los desarrolla-dores; el patrocinio de la com-pañía de software en la FeriaMovilForum, promoviendo lacreación de soluciones con tec-nología móvil Microsoft sobrela red MoviStar; la participa-ción conjunta en los talleresMSDN Workshops de Madridy Barcelona, con especial atención a lassesiones centradas en Windows Mobile;así como el soporte técnico y la formaciónen movilidad por parte de TelefónicaMóviles a los ISV del laboratorio tecnoló-gico Aragón Microsoft Technology Center.
“El pasado año más de 6.000 desarro-lladores españoles participaron en algunode los eventos MSDN organizados porMicrosoft, lo que indica el interés que estecolectivo muestra hacia las iniciativas dela compañía”, ha declarado Inés Arbolí.
Para José María Soler, “las más demil empresas que visitaron la FeriaMovilforum 2005 pudieron comprobarque la innovación en el campo de lassoluciones móviles es una realidad con-solidada y con espectaculares casos deéxito, y esto ha sido posible por el con-tinuo avance de la tecnología móvil y ladecisiva aportación de las nuevas plata-formas móviles, como Windows Mobilede Microsoft y el respaldo de la comu-nidad MSDN”.
dnm.noticias
Microsoft y Telefónica Móviles renuevan su acuerdo decolaboración dirigido a los desarrolladores de software
dnm.noticias
dotN
etM
anía
<<
7
Nueva CTP de LINQ de mayo 2006Microsoft ha puesto a disposición
del público una nueva presentaciónpreliminar de LINQ (LanguageIntegrated Query), tecnología sobre laque dotNetManía ha venido escri-biendo en los últimos meses y quejugará un papel muy importante en elmodelo de programación que se ave-cina con la futura aparición de Orcasy WinFX. Entre las características mássobresalientes que aparecen por pri-mera vez en esta versión podemosmencionar: • En LINQ:
- Nuevas construcciones sintácti-cas en las expresiones de con-sulta.
- Nuevo modelo para el desarrollode procesadores de consulta amedida.
- Nuevos operadores estándar.- Enlace a datos de consultas.
• En DLINQ:- Soporte para el diseño de clases
de entidad dentro de VisualStudio 2005.
- Soporte para la herencia entreentidades y escenarios de múlti-ples capas.
- Soporte mejorado para procedi-mientos almacenados y funcionesdefinidas por el usuario.
- Soporte mejorado para la resolu-ción de conflictos de concurrencia.
• En XLINQ:- Soporte mejorado para conteni-
dos XML complejos.- Soporte para anotaciones.
Esta nueva CTP puede ser descarga-da desde: http://www.microsoft.com/downloads/details.aspx?familyid=1e902c
21-340c-4d13-9f04-70eb5e3dceea&dis-
playlang=en
Inés Arbolí y José María Soler
Liberado ROTOR 2.0
Microsoft ha liberado la versión 2.0de SSCLI (Shared Source CommonLanguage Infrastructure), popularmenteconocida como ROTOR. Se trata de unaimplementación de referencia (en códi-go fuente) de las especificaciones ECMAde la infraestructura de .NET Frame-work y el lenguaje C#, que será de utili-dad a investigadores y desarrolladoresque deseen profundizar en el funciona-miento interno de esas tecnologías. Estaimplementación está destinada a ser com-pilada y ejecutada sobre Windows XP.
Entre las principales novedades queaporta esta segunda versión está elsoporte para todas las nuevas carac-terísticas incorporadas en C# 2.0 (gené-ricos, iteradores, métodos anónimos) ylas nuevas funcionalidades añadidas ala Librería de Clases Base (BCL) en.NET Framework 2.0.
Además...
dotN
etM
anía
<<
8
dnm.noticias<<
dnm.noticias
Expo:QA trae por primera vez a Españaa Michael Bolton,el mayor experto mun-dial en Rapid Software TestingEn un curso de tres días,escrito por JamesBach y presentado por Michael Bolton,los asistentes obtendrán las claves delRapid Software Testing.
Michael Bolton es la única personaautorizada para impartir las enseñanzasde James Bach. Posee 15 años de expe-riencia en la industria informática, teste-ando, desarrollando, gestionando y escri-biendo sobre software. James Bach es unode los fundadores de Context-DrivenSchool of Software Testing.
La filosofía de Rapid Testing, pre-sentada en este curso, no se parece alos métodos tradicionales de test, queignoran la parte racional del mismo y,en cambio, abogan por un papeleointerminable. Actualmente, los pro-ductos son demasiado complejos paraeso y los testeadores resultan demasia-do caros. Rapid Testing utiliza un méto-do cíclico, así como métodos heurísti-cos para optimizar constantemente eltest y adecuarlo a los requisitos de susclientes. Rapid Testing no es solo un testde urgencia, es un test centrado en unamisión, que elimina el trabajo innece-sario, garantiza que se lleve a cabo todolo necesario, y constantemente pre-gunta qué puede hacer el test para ace-lerar el proyecto en su integridad.
El curso se celebrará el 28,29 y 30 dejunio en las instalaciones de inQA.labsen el Fòrum Nord de la Tecnologia.
Más información y reservas en:http://www.expoqa.com.
Además...
SQLU Summit Madrid 2006
El evento se dividirá en dos salas:• La sala de los Cubos: donde se
impartirá un track dedicado exclusi-vamente a Inteligencia de Negocio (BI)
• La sala de los Índices: donde seimpartirá un track dedicado a sistemasde bases de datos relacionales conSQL Server 2005.
En estas salas se impartirán las confe-rencias de forma simultánea, y los asis-tentes tendrán la flexibilidad de cambiarde sala tantas veces como sea necesariopara asistir a sesiones de ambos tracks encualquier momento.
Para aquellos interesados en temasmuy específicos, se ofrece la posibilidadde organizarse de modo que se pueda asis-tir de forma ordenada a sesiones con eltema deseado. Estos tracks virtuales pue-den ofrecer sesiones en diferentes salascuando así sea conveniente, ya que algu-
nas sesiones podrían ser marcadamenteDBA, mientras que otras tendrán mayororientación en BI.
Laboratorio de prácticas
Existe un laboratorio especial, conel patrocinio de Dell, para que practi-que las nuevas tecnologías que SQLServer 2005 aporta. En este laboratoriose impartirán en primicia en España loslaboratorios de actualización de SQLServer 2000 a 2005 que Solid QualityLearning preparó para MicrosoftCorporation, para el nuevo Kit deRecursos de Actualización a SQL Server2005 (de próxima aparición), así comoejercicios específicos para practicar lasnuevas tecnologías disponibles en SQLServer 2005.
Información y reservas en:http://www.sqlu.com/summits.aspx
Solid Quality Learning celebra el segundo SQLU Summit Madrid entre el 19y el 23 de junio de la mano de expertos de gran prestigio en SQL Server.
MSDN y Spain.NET presentan una nueva edición del CODECAMP
Si eres inquieto, emprendedor, tegusta lo que haces y además quieres vivirde ello, te proponemos pasar un fin desemana en Vic y compartir con gentecomo tú dos días donde sólo se hará unacosa: ¡escribir código!
Tendrás la oportunidad de aprenderlas últimas tecnologías que más sedemandan en la actualidad, con ponen-tes muy cualificados y con carácter
100% práctico, sin transparencias niadornos, sólo código.
Además si tienes alguna idea quequieras poner en práctica te ayudare-mos a hacerlo. Hablaremos de las dis-tintas posibilidades para escribir soft-ware por tu cuenta y tendrás a exper-tos que te podrán asesorar en tus pri-meros pasos. Y por supuesto cuentacon pasar un fin de semana divertido,con actividades y en un entorno pri-vilegiado.
MSDN y Spain.NET patrocinan el CodeCamp,un evento de fin de semana dirigido a desarrolladores de software.
Borland Day 2006El día 6 de junio, en el Palacio
Municipal de Congresos de Madrid,Borland celebrará la tercera edición delBorland Day.
En las distintas ponencias se mos-trarán las soluciones para la Optimizacióndel Desarrollo del Software de Borland ycasos reales de implementación de susherrramientas para el ciclo de vida delas aplicaciones. Este año contamos con
la presencia de Bill Curtis, director deprocesos de Borland, miembro del SEIy experto en implementaciones CMMI.La Calidad y la Metodología de Procesosestarán muy presentes durante la jor-nada, donde podrá ver el valor que apor-ta para su negocio la implementaciónde estas buenas prácticas.
Puede registrarse en la Web del even-to: http://www.borlandday.com.
Nuevas tecnologías y nuevas propuestas formativas
Alhambra-Eidos prepara un ambicioso programa de formación blended paracubrir la formación en Visual Studio 2005, SQL Server 2005, y otros nuevosproductos Microsoft.
una vorágine de cambios y cuandoalguien contribuye a asentar las cosas, todos debemosagradecerlo. Y eso es lo que están haciendo desdeAlhambra-Eidos con esa nueva oleada de tecnologíasque Microsoft está promoviendo: Visual Studio 2005,SQL Server 2005, BizTalk 2006, Sharepoint 2007, etc.
Lo mismo sucede con las certificaciones paradesarrolladores: están siendo cambiadas, ya no ten-dremos más MCAD y MCSD, nuevas siglas comoMCPD aparecen ahora, y es una imperiosa necesi-dad la existencia de centros donde éstas se puedanpreparar debidamente.
Para aclararnos lo que este líder de la formación tec-nológica está realizando para ayudar a los desarrollado-res, tenemos con nosotros a Antonio Quirós, su direc-tor de operaciones, que es, históricamente hablando,quien arrancó y ha impulsado durante muchos años losservicios de formación de la compañía.
¿Qué programas formativos está desarrollandoAlhambra-Eidos ante todos estos nuevos retos?
Somos conscientes de que estamos ante cambiosmuy importantes. Un cambio tecnológico relevante,ya que tenemos una oleada de productos como desdehace años no se daba. Visual Studio 2005, SQL Server2005, BizTalk 2006, SharePoint 2007, etc. Un cambioacadémico notorio, ya que Microsoft ha cambiado lastitulaciones para desarrolladores y ya no tendremosmás MCAD y MCSD. Por último, también un cam-bio cultural notorio en el entorno de cómo los técni-cos se forman. Cada vez la formación presencial esmenos posible de hacer, todos estamos muy ocupadosy no podemos restar mucho tiempo a nuestro trabajodiario para formarnos. Por otro lado la formación vir-tual ha demostrado que no siempre es la solución, yaque muchas personas necesitan más labor de transmi-sión de contenidos y tutorización. Nuestra respuesta
ante todos estos cambios es un nuevo panel de cursosenfocados a estas nuevas tecnologías, con el objetivode que el desarrollador alcance el máximo nivel de cer-tificación que Microsoft ofrece para desarrolladores (elMCPD orientado a Enterprise Applications Developers)y que esto se haga pensado para ser impartido en unprograma de tipo blended, con una mezcla proporcio-nada de la asistencia presencial a clases y del autoestu-dio de contenidos virtualizados.
Algunos centros de su competencia están ya ofre-ciendo cursos para la obtención de las nuevas certifi-caciones y ustedes están aún preparando su progra-ma. ¿Van más lentos que los demás?
Ni mucho menos. Simplemente tratamos de serhonestos. En este momento ni la propia Microsofttiene desarrollada la documentación oficial para cubriruna buena parte de los cursos oficiales y ni siquieraestán accesibles los exámenes oficiales, por tanto, sialguien dice que puede ofrecer este tipo de accionesformativas con los niveles de calidad adecuadas está
<< Estamos sumidos en
dotN
etM
anía
<<
10
Antonio Quirós, director de operaciones de Alhambra-Eidos
faltando a la verdad. Nosotros estamoshaciendo bien las cosas. Hemos puestoa trabajar a nuestro mejor equipo deprofesionales, muchos de ellos bienconocidos por los lectores de esta revis-ta en tanto que son desarrolladores dereconocido prestigio y de los que apor-tan cosas continuamente a la comuni-dad de desarrolladores de Microsoft. Merefiero a Marino Posadas (MVPMicrosoft), a Luis Miguel Blanco, aÁngel Esteban, a Pepe Hevia y a otrosvarios algo menos populares hoy, peroque lo serán pronto. Ellos están desa-rrollando nuestro material formativo,nuestro asesoramiento para superar losexámenes oficiales y, además, todo ellodesde la nueva perspectiva de la forma-ción blended. Yo creo que podremos afir-mar sin riesgo de equivocarnos que deAlhambra-Eidos, como casi siempresucede, saldrán los primeros y mejorestitulados.
¿Cómo incide todo este proyectocon su ya popular Máster Alhambra-Eidos en Desarrollo de Software?
Bien, lo que realmente estamoshaciendo es reorientar nuestro másterpara que se enfoque hacia el objetivode lograr la certificación MCPDEnterprise Application Developer. Todoel courseware se está desarrollandoespecíficamente para formación blen-ded y, por tanto, habrá muchos módu-los específicos que se podrán impartirpor separado para lograr certificacio-nes de menos nivel.
¿En qué consiste ese nuevo forma-to blended?
Tratamos de confeccionar un pro-grama de alto nivel, comparable con elexecutive de una escuela de negocios yque se base en los mismos principios deestos cursos. Es decir, 40% de horas pre-senciales de clase frente a un 60% deautoestudio, orientación al caso, muchoslabs, etc. Para llevar esto adelante, nece-sitamos, por un lado, un buen coursewa-re, que es el que estamos confeccionan-do, un reconocido sistema de segui-miento de la autoformación, como esnuestro www.ElCampusDigital.com, porotro lado los formadores más cualifica-dos en cada tecnología y, por último, unabordaje de todo el programa enfocadoa la consecución de la certificación, conexámenes de prueba, sesiones de aseso-ramiento, etc. En resumen, los alumnossólo tienen que asistir a clase los vier-nes por la tarde y los sábados por la
mañana, el resto es autoestudio por suparte y tutorización por la nuestra.
¿Realmente es tan importante acce-der a la nueva certificación?
Bueno, te contestaré con otra pre-gunta: ¿conoces algún MCSD desem-pleado o con lo que se denomina empleobasura? Yo no conozco a ninguno, des-de luego. Son los profesionales másdemandados, mejor pagados y conmejor consideración en las compañías.Pues imagínate lo que sucederá cuandotengamos las primeras hornadas de titu-lados MCPD y aún no exista ningunoen el mercado. El progreso profesionalpara estas personas está garantizado y,desde luego, las empresas que cuentencon ellos tendrán la mejor garantía posi-ble en el desarrollo de sus proyectos desoftware.
En cuanto al ámbito tecnológico,¿Qué remarcarías de estos nuevos pro-gramas vuestros?
Yo remarcaría el enfoque industrialsobre el ciclo de vida del desarrollo desoftware que tratamos de imprimir. EnVisual Studio 2005 tenemos TeamSystem, que está totalmente enfocadohacia la coherencia en el proceso dedesarrollo de software, comenzando porla fase de diseño y garantizando la cohe-rencia a lo largo de todo el ciclo de vida.Este es nuestro principio fundamental.Nuestros cursos no sólo enseñan lopráctico de VB o C#, sino que tratan deenseñar cómo construir soluciones demodo organizado y coherente.
Más información: www.alhambra-eidos.com/master06-07.
dotN
etM
anía
<<
11
dnm.publireportaje
Yo creo que podemos afirmar sin riesgo de equivocarnos, que de Alhambra-Eidos, como casi siempre
sucede, saldrán los primeros y mejores titulados
Fundamentos para desarrolladores de los sistemas operativos Windows.Ingeniería de producto basada en Visual Studio 2005 Team System y en el estándar UML.Introducción a Visual Studio 2005 y al Framework 2.0.Diseño y programación de bases de datos con SQL Server 2005.Despliegue y mantenimiento de bases de datos con SQL Server 2005.Acceso a datos con ADO.Desarrollo de aplicaciones Windows.Aspectos básicos.Desarrollo de aplicaciones Web.Aspectos básicos.Desarrollo de aplicaciones Windows.Aspectos avanzados.Desarrollo de aplicaciones Web.Aspectos avanzados.Desarrollo de aplicaciones para dispositivos móviles.Desarrollo de aplicaciones distribuidas.Sharepoint Portal Server.Integración de soluciones con Biztalk Server.
Tabla de contenidos del Máster Alhambra-Eidos en Desarrollo de Software
Entrevista a David Intersimoney Jason Vokes
Con motivo del seminario efectuado en Madrid el pasado 8 de mayo como parte delDeveloper Studio 2006 World Tour,dotNetManía entrevistó a David Intersimone,actual Vicepresidente de Relaciones con los Desarrolladores de Borland y a JasonVokes,Director para Europa de la línea de productos Delphi/C++.La entrevista gana-ba aún más interés con motivo del reciente anuncio por parte de Borland de des-prenderse de la línea de entornos de desarrollo para concentrarse únicamente en lasherramientas de Ciclo de Vida del Software.
de la historia de lainformática en los últimos 30 años. ¿Puede contarnosalgo sobre sus inicios en este exigente mundo?
David. Yo no me considero ninguna leyenda, sinosólo un viejo programador que disfruta interactuandocon otros programadores. Entré en la universidad en1969 para estudiar Informática, y mi primer programafue escrito en FORTRAN. De eso hace ya 36 años, quees mucho tiempo. Conocí a Phillip Kahn en la feriaCOMDEX de Las Vegas de noviembre de 1983, y allíme enseñó un nuevo producto que tenía llamado TurboPASCAL. Yo lo probé y me di cuenta de que aquellorevolucionaría completamente la tecnología de pro-gramación del momento, así que decidí que tenía quetrabajar para esa empresa.Tomó algún tiempo, pero enjunio de 1985 ya estaba traba-jando para Borland. Siempreme ha apasionado el desarrollode herramientas de software, ypor eso sigo aún aquí despuésde tantos años.
Usted, Jason, también seha convertido desde hacemucho en un referente para laextensa comunidad de desa-rrolladores de Delphi y C++Builder. ¿Cómo fueron suscomienzos?
Jason. Bueno, yo vengo delmundo de la consultoría, y yahace diez años desde que entré
en Borland para trabajar en una línea de productos quesiempre me ha apasionado, la de Delphi y C++ Builder.
¿Cómo van las cosas en relación con la separaciónde la línea de productos de desarrollo de Borland? ¿Hayalgún plazo prefijado para la finalización del proceso?
David. Ahora mismo estamos en un punto en el quecomienzan las reuniones con los inversores. Se ha cons-tituido formalmente el Developer Tools Group, embriónde la futura empresa, del que Nigel Brown ha sido nom-brado Director General. Hemos reunido toda la docu-mentación necesaria sobre nuestros productos, las finan-zas, la distribución de los equipos de desarrollo en todoel mundo, nuestras expectativas para el futuro, etc. Enlas próximas semanas comenzaremos a hacer estas pre-
Octavio Hernández
dnm.directo.entrevistas
<< David, usted es una leyenda viva
David Intersimone,Vicepresidente de Relaciones con los Desarrolladores de Borland
Octavio Hernándezes redactor de
dotNetManía, Ingenieroen Informática de
Sistemas y MVP de C#.
sentaciones, y luego vendrán las negocia-ciones. Esperamos que el proceso estéconcluido para el verano. Pero mientrastanto, el trabajo sigue avanzando en todoslos frentes.
Jason. Y por eso nosotros estamosaquí, visitando a nuestros clientes entodo el mundo, interactuando con ellosy al mismo tiempo potenciando nues-tras estructuras corporativas y las rela-ciones con nuestros partners, que con-tinúan aquí, trabajando más fuerte quenunca. Es realmente muy excitanteconstatar eso.
Una de las características que másnos impresionó del BDS 2006 fue laestrecha integración con la tecnologíade Borland Together, en la que se apo-yan características como la generaciónde código y la ingeniería inversa a par-tir de diagramas UML, o las auditoríasy métricas. ¿Afectará de alguna maneraa la disponibilidad de estas característi-cas en las próximas versiones del BDSla futura separación de Borland?
David. Está garantizado que dis-pondremos de licencias de utilizaciónde todas las tecnologías de Borland.Nuestros clientes pueden estar tran-quilos en este sentido. Cuando ToddNielsen (presidente de Borland) anun-ció la separación, también resaltó quecontinuaríamos siendo partners muy cer-canos. Así que en la medida en que avan-cen las tecnologías de Borland, porejemplo las relacionadas con el mode-lado UML, nosotros iremos recibiendolas actualizaciones correspondientes.
Adicionalmente, el equipo de desarro-lladores en San Petersburgo que traba-ja en todo lo relacionado con la inte-gración de los productos ALM en elBorland Developer Studio y JBuilderseguirá perteneciendo a nuestro reciénanunciado Grupo de Herramientas deDesarrollo.
Otra característica presente enDelphi 2005 y 2006 y que ha tenido ungran reconocimiento es la tecnologíaECO. ¿Qué puede decirnos sobre ella?
Jason. ECO provee un marco detrabajo corporativo completo y adapta-ble para el desarrollo de aplicaciones.NET guiadas por modelos paraWindows y la Web, que se apoya enestándares reconocidos como UML yOCL, del Object Management Group(OMG). Se trata de una tecnología yamadura (9 años), y de su desarrollo seencarga otro equipo nuestro localizadoen Estocolmo, que ya está trabajandoen la próxima versión, ECO IV.
¿Cómo van avanzando los trabajospara ofrecer el soporte para .NET 2.0en Highlander ?
David. El equipo principal en ScottsValley, California está desarrollandoahora todo lo necesario para garantizarese soporte, en particular todo lo rela-cionado con la incorporación al lenguajede los tipos genéricos y ese tipo de cosas.También hay gente trabajando en elsoporte para las tecnologías especifícas,como Windows Forms (incluyendo suencapsulado en la VCL) o ASP.NET2.0. Los trabajos se están desarrollandosegún la planificación prevista, y algomás adelante durante este año presen-taremos los resultados en las confe-rencias de desarrolladores y pondremosa disposición del público presentacio-nes preliminares.
La adición de nuevas característicasa Object Pascal para dar soporte a lasnuevas características del CLR como losgenéricos o los iteradores parece ser algonecesario, ¿no? ¿Estarán también dis-ponibles estas características para lasaplicaciones Win32?
David. Absolutamente. Yo y algunosotros miembros del equipo hemos veni-do abogando desde hace tiempo por poderdisponer de contenedores genéricos e ite-radores sobre esos contenedores, y sinduda se trata de una de las característicasmás solicitadas por los desarrolladores.Tenemos otras novedades más para el len-guaje en mente, aunque por supuesto loprimero es garantizar el soporte para.NET 2.0 y más allá. Por ejemplo, ahoraMicrosoft está promoviendo LINQ, y nocreo que nos sea muy difícil dar soporte aesa tecnología ya que tenemos desde hacemucho los class helpers, que permiten inyec-tar código dentro de las clases. Por supues-to, tenemos licencias de utilización detodas las tecnologías presentes y futurasde Microsoft, y esas licencias seguirán connosotros en la nueva empresa.
Nuestro objetivo es siempre mante-ner las implementaciones de Delphi para
Tenemos el firme compromiso de dar soporte a todaslas tecnologías y subsistemas de Microsoft
dotN
etM
anía
<<
13
dnm.directo.entrevistas<<
Jason Vokes, Director para Europa de la línea de productos Delphi/C++
Win32 y .NET sincronizadas en lo queal lenguaje se refiere, y aunque puede queen ciertas ocasiones algunas característi-cas aparezcan primero en una de las ver-siones, más adelante se implementan enla otra. Fue el caso, por ejemplo, de lasobrecarga de operadores.
¿Para cuándo debemos esperar elsoporte para las nuevas API de WindowsVista como WPF (Avalon) o WCF(Indigo)?
David. El soporte para Vista puedeverse como un proceso de varias fases. Loprimero es garantizar que el propio BDSy las aplicaciones que se generen con élfuncionen correctamente en WindowsVista. Ya eso garantiza que se puedan apro-vechar en cierta medida las ventajas delnuevo sistema operativo. Pero por supues-to, la segunda fase del soporte para Vistaen nuestra planificación consiste en imple-mentar el soporte directo para WPF, asícomo una versión de la VCL para WPF,y en extender nuestros servicios Web paraque funcionen sobre WCF. Even-tualmente, implementaremos también elsoporte para WinFS.
Hemos venido utilizando C++ Builderprácticamente desde su aparición. ¿En quédirecciones de futuro se trabaja actual-mente? ¿Tenéis planes para hacer posibleel desarrollo para .NET Framework uti-lizando C++? ¿Habéis pensado en incluirsoporte para C++/CLI en versiones futu-ras del BDS?
David. Continuaremos trabajando enC++ principalmente para seguir estre-chamente los avances del estándar ISO,del que se avecina una actualización. Ahoramismo ya ofrecemos en BDS 2006 sopor-te para algunas librerías que muy proba-blemente pasarán a formar parte de la
librería estándar de C++ en un futuro,como Boost o TR1 (implementada porDinkumware).
Jason. Nuestros clientes utilizan C++Builder principalmente para desarrollaraplicaciones y servicios nativos de alto ren-dimiento, con acceso directo y eficiente atodos los recursos de bajo nivel, y es muyimportante que continuemos sirviendo lo
mejor posible a esos clientes. Creo que esaes nuestra preocupación fundamental conrelación a C++ en este momento. A losprogramadores de C++ les es general-mente muy fácil adaptarse a C# para losdesarrollos en código manejado.
David. Con relación al soporte paraC++/CLI, creo que deberíamos esperarun tiempo para ver qué aceptación tieneentre los desarrolladores esta nueva tec-nología de Microsoft (que algunos vencomo un nuevo lenguaje por las exten-siones que incorpora), y qué posturatomará el Comité de Estandarización deC++ con relación a ella. Pienso que dada
nuestra relación con Microsoft, es posi-ble que simplemente licenciáramos en elmomento adecuado la tecnología en lugarde implementarla nosotros mismos. Perode momento no hay nada de eso en nues-tra hoja de ruta.
Por favor, unas palabras finales parala comunidad .NET en general.
David. A los desarrolladores .NETles decimos que nosotros tenemos el fir-me compromiso de dar soporte a todas lastecnologías y subsistemas de Microsoft,cosa que venimos haciendo desde los tiem-pos de Windows 3.1, luego Win32, COMy ahora .NET. Tenemos también el com-promiso de permitir a nuestros clientesno sólo avanzar hacia delante aprove-chando las nuevas tecnologías que apa-rezcan, sino también de mantener susinversiones y experiencia de muchos añosen el desarrollo de aplicaciones basadasen Windows y la VCL. Por eso intenta-mos ofrecer implementaciones de la VCLsobre las diferentes API, sin impedir elacceso directo a ellas cuando el progra-mador así lo requiera, y ofrecer un len-guaje común para la generación tanto decódigo nativo (que mucha gente aún sigueutilizando) como de código manejado.Esos son nuestros compromisos de caraal futuro, para así continuar ayudando almáximo a nuestros clientes.
Jason. Durante el seminario de hoymostraremos un montón de tecnologíasque ofrecen una gran potencia, flexibili-dad y alta productividad al desarrollador.Invitamos a todos los que no han visto aúnel BDS 2006 a que lo prueben, quedarángratamente sorprendidos.
dotN
etM
anía
<<
14
dnm.directo.entrevistas<<
Octavio Hernández con David Intersimone, durante la entrevista
Figura 1. Hoja de ruta para las futuras versiones de Delphi (BDS)
qué son los WebParts y cómopodemos usarlos para personalizar nuestras páginasASPX sin apenas código. Ahora vamos a presentar algu-nas otras cuestiones más avanzadas para sacarle mayorpartido a los bloques de funcionalidad.
Personalización de bloquesCon lo visto hasta ahora, es el programador el que
decide de qué manera se van a comportar los bloquesdentro de la página o qué aspecto van a tener. Si estascapacidades las pudiésemos extender a nuestros usuariossería de gran utilidad, ya que serían ellos mismos los quedecidirían cómo quieren que sea cada bloque. La infra-estructura de WebParts de ASP.NET 2.0 nos propor-ciona todo lo necesario para facilitar esta capacidad.Veamos un ejemplo de cómo hacerlo.
En la página que hemos estado desarrollando ante-riormente añada, en la celda de la derecha, un controlEditorZonedesde la barra de herramientas de “ElementosWeb”. Sitúelo encima o debajo del catálogo de bloquesque ya teníamos. Por defecto, este control contenedorsólo muestra un espacio en blanco (para arrastrar otroscontroles) y un grupo de botones (“Aceptar”, “Cancelar”y “Aplicar”). En la barra de herramientas disponemosde varios controles que habilitan la edición de ciertascaracterísticas de nuestros bloques:• AppearanceEditorPart: se utiliza para personalizar las
propiedades de apariencia de cada bloque. Contemplacuestiones como el título a mostrar, las dimensiones,los bordes, etc.
• BehaviorEditorPart: personaliza el comportamien-to de cada bloque, ofreciendo gran cantidad de ajus-tes como la URL a la que se enviará al usuario cuan-do pulse en el título del bloque, el icono a mostrar
al lado del título, si se permitirá o no exportar el blo-que, o qué acciones se permitirán en el mismo (cerrar-lo, conectarlo, editarlo...).
• LayoutEditorPart: fundamentalmente sirve para con-trolar en qué zona de la página se ubicará el control.Evita tener que arrastrar los bloques, y es indispen-sable si queremos trabajar con navegadores que nosean Internet Explorer, ya que la distribución visualde bloques sólo funciona con este navegador por elmomento.
Arrastre un controlde cada uno de estostipos sobre la zona deedición que acabamosde crear. Podrá hacerseuna idea de qué propie-dades permite tocar cadauno con sólo leer sucontenido en la superfi-cie de diseño (figura 1).
En la lista de opcio-nes de la parte superiorañadiremos un nuevoenlace que servirá paraque la página se pongaen modo de edición:
WebPartManager1.DisplayMode =
WebPartManager.EditDisplayMode
Al pulsar este botón en tiempo de ejecución, el menúdesplegable de cada bloque tendrá una nueva opción“Editar”, que hará que aparezca la nueva zona de edi-ción de propiedades que acabamos de crear (figura 2).
WebParts en ASP.NET 2.0 (II)
En esta segunda entrega sobre la creación de páginas personalizables con WebParts,vamos a estudiar algunas características que van más allá de los conceptos básicos estu-diados anteriormente.
<< Hasta ahora hemos visto
José M.Alarcón
dnm.asp.net
José Manuel Alarcón es redactor de dotNetManía.
Es ingeniero industrial yespecialista en consultoría de
empresa.Ha escrito varios libros,y ha publicado más de
doscientos artículos sobreinformática e ingeniería en
revistas especializadas.Visita sublog en www.jasoft.org.
Figura 1
Pero... ¡un momento!, si se fija veráque el editor de comportamiento (delsegundo tipo) que habíamos arrastrado noaparece al editar las propiedades de unbloque. ¿Qué está pasando aquí?
Personalización global y porusuario
Por defecto, los usuarios de nuestraaplicación únicamente pueden efectuarpersonalizaciones que les afecten a ellosmismos. Es decir, los cambios que reali-cen sólo serán efectivos para su perfil deusuario. Los demás visitantes verán la con-figuración por defecto y podrán a su vezpersonalizarla sin afectar a otros.
El editor de propiedades de compor-tamiento sirve para decidir cosas comoque un bloque se pueda o no cerrar, edi-tar, etc. Este tipo de ajustes tiene una res-ponsabilidad importante, ya que afecta aqué cosas se pueden o no hacer en el por-tal. Como es lógico, esto no es algo quecualquier usuario debiera tocar, puestoque de ser así podría condicionar el usoque los demás usuarios hacen de los blo-ques. Por ello sólo determinados usuarioso grupos de usuarios tienen acceso a estaspropiedades.
A la hora de personalizar una pági-na existen dos modos de hacerlo: pági-na compartida (Shared) o por usuario(User). Cuando estamos en modo com-partido todos los cambios que hagamosen el portal se convertirán en carac-terísticas predeterminadas para éste y losnuevos usuarios (o los que no hayan per-sonalizado nunca) se verán afectados porellos. Se puede averiguar en qué modoestamos consultando la propiedad
Personalization.Scope del gestor deWebParts. Dado que esta propiedad es desólo lectura, para cambiar entre ellas sedebe emplear el método ToggleScope delmismo objeto Personalization. De todosmodos, como hemos dicho, no todos losusuarios pueden personalizar la página enámbito compartido, por lo que si inten-tamos el cambio y el usuario no tiene per-miso se producirá una excepción. Para evi-tarlo, debemos consultar la propiedadCanEnterSharedScope, que precisamentenos indica si es posible la edición en for-ma compartida para el usuario actual.
Aclarémoslo continuando con nues-tro ejemplo. Agregue dos botones de radiodebajo de los enlaces de la parte superior.Nómbrelos como rUsuario y rCompartiday asígneles el texto “Personal” y“Compartida” respectivamente. Esta-blezca su propiedad AutoPostback en ver-dadero y GroupName como “TipoPer-sonalización”. Ahora agregue el fuente 1al evento de carga de la página.
Es decir, si el usuario actual no tienederecho a personalizar el ámbito global(compartido) de la página desactivamos laopción correspondiente. Además, marca-mos la opción que está actualmente habi-litada con el segundo condicional.
En los eventos de cambio de selecciónde ambos controles agregue el código delfuente 2.
Es decir, si podemos, llamamos alcambio de ámbito al seleccionar cadacontrol.
Si ahora ejecutamos la aplicación,veremos que no nos deja pasar al modocompartido. De hecho, si lo intentásemosobtendríamos una excepción. El motivoes que hay que indicar de alguna maneraqué usuario o usuarios tienen derecho autilizar ese ámbito compartido. La formade hacerlo es mediante una entrada en elarchivo de configuración de la aplicación,como la del fuente 3.
El atributo roles de la etiqueta allowsirve para indicar una lista de grupos deusuario (o roles) que tienen permitida lapersonalización global del sitio. Podemos
dotN
etM
anía
<<
17
dnm.asp.net<<
Figura 2
If Not WebPartManager1.Personalization.CanEnterSharedScope ThenrCompartida.Enabled = False
End If
If WebPartManager1.Personalization.Scope = PersonalizationScope.User ThenrUsuario.Checked = True
ElserCompartida.Checked = True
End If
Fuente 1
Protected Sub rUsuario_CheckedChanged(ByVal sender As Object, _ByVal e As System.EventArgs) Handles rUsuario.CheckedChangedIf WebPartManager1.Personalization.CanEnterSharedScope And _
rUsuario.Checked ThenWebPartManager1.Personalization.ToggleScope()
End IfEnd Sub
Protected Sub rCompartida_CheckedChanged(ByVal sender As Object, _ByVal e As System.EventArgs) Handles rCompartida.CheckedChangedIf WebPartManager1.Personalization.CanEnterSharedScope And _
rCompartida.Checked ThenWebPartManager1.Personalization.ToggleScope()
End IfEnd Sub
Fuente 2
<WebParts><personalization><authorization><allow verbs=”enterSharedScope”
roles=”Admins”/></authorization>
</personalization></WebParts>
Fuente 3
quitar “roles” y usar la opción “users” paraindicar usuarios concretos en lugar de gru-pos. De hecho, se pueden combinar ambasy también se puede emplear una etiquetadeny análoga para negar el permiso explí-citamente a usuarios o grupos. Si usamosel valor “*” para estos atributos, permiti-remos o denegaremos a todo el mundo lapersonalización compartida. En el ejem-plo incluido se ha dejado así para permi-tir las pruebas, pero en una aplicación realjamás deberíamos dejar un asterisco.
Si entramos en el ámbito compartidoveremos que, ahora sí, al editar un bloqueaparece también la zona de propiedadesde comportamiento que son globales(figura 3).
Propiedades personalizadasLos editores de propiedades que
hemos visto ofrecen muchas posibilida-des de personalización, pero aún así eshabitual que se nos queden cortas. Si tene-mos un WebPart de diseño propio segu-ramente tendremos la necesidad de adap-tar su funcionamiento a las particularida-des del dominio de nuestra aplicación. Porejemplo, si construimos un WebPart paramostrar el listado de las últimas facturasde nuestra empresa, podríamos crear unapropiedad personalizada que permitiera alos usuarios decidir la fecha de la facturamás antigua a mostrar, elegir entre variasseries de facturas, etc. Cada caso tendránecesidades particulares.
Para ello, es indispensable poder defi-nir propiedades especiales en nuestros blo-ques y habilitar su edición de un modoanálogo al que hemos visto para las pro-piedades genéricas.
Vamos a construir un sencillo controlcuyo objetivo será el de visualizar un men-saje que el usuario pueda escoger. A losusuarios les será útil, por ejemplo, paraapuntar en él cosas que deban recordar yque así verán cada vez que entren en elportal.
Cree un nuevo control de usuario denombre Notas.ascx. Arrastre sobre él unaetiqueta de ancho 100% y de nombrelblNota.
En realidad, definir una propiedadpersonalizable para un WebPart no difie-re de la creación de una propiedad comúnde un control, más que en el hecho de quese decora con ciertos atributos. Éstos indi-can a la infraestructura cómo debe tratarla propiedad. En nuestro caso, crearemosuna propiedad llamada Nota con el códi-go del fuente 4.
Con esto es suficiente. El primer atri-buto (Personalizable) indica el ámbito dela personalización (global o por usuario).El segundo de ellos (WebBrowsable) sirvepara indicar que la propiedad se debevisualizar durante la edición de propieda-des, mientras que los dos últimos(WebDisplayName y WebDescription) indi-can el encabezado de la propiedad y sudescripción para el editor.
Antes de poder usar éste o cualquiercontrol con propiedades no estándar,debemos añadir a nuestra zona de ediciónde propiedades un tipo de editor que antesno se ha mencionado: el PropertyGridEditorPart. Éste solo aparece si el bloqueque se está editando tiene propiedades noestándar, como es el caso.
Agregue nuestro nuevo control denotas al catálogo de la página como yahicimos con los anteriores. Arranque laaplicación y pulse el enlace “Catálogo”para añadir uno o varios controles de notasa la página. Pase a modo de edición de
propiedades (enlace “Propiedades”) y edi-te un control de notas. Escriba un textoen la propiedad personal y verá cómo sevisualiza en la página (sólo para usted, cla-ro). La figura 4 lo ilustra bien. La infra-estructura de WebParts se encarga de per-sistir el valor de la propiedad para que ensucesivas visitas a la página el usuario sigaviendo sus notas.
Según el tipo de la propiedad el edi-tor mostrará un control u otro. Si es unacadena (como en este ejemplo) será unacaja de texto, una lista desplegable con losvalores disponibles en el caso de una enu-meración, o una casilla de verificación parapropiedades booleanas. Se pueden creareditores personalizados para nuestras pro-piedades, pero ello se sale del ámbito deeste artículo.
Acciones personalizadasEn función del modo en el que se
encuentre la página, cada bloque mues-tra unas u otras acciones asociadas, comocerrar, editar, etc. Otra interesante posi-bilidad es la de crear nuestras propias
dotN
etM
anía
<<
18
dnm.asp.net<<
Figura 3
Private _Nota As String
<Personalizable(PersonalizationScope.User), _WebBrowsable(), WebDisplayName(“Nota a visualizar”), _WebDescription(“Ajuste el contenido de la nota”)> _Public Property Nota() As String
GetReturn _Nota
End GetSet(ByVal value As String)
_Nota = valueEnd Set
End Property
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadIf _Nota = “” Then
lblNota.Text = “Actualmente no hay notas disponibles”Else
lblNota.Text = _NotaEnd If
End Sub
Fuente 4
Figura 4
acciones para, por ejemplo, ofrecer dife-rentes modos de visualización delWebPart, inicializar sus contenidos o loque nuestra imaginación decida en cadamomento.
Ello sólo es posible si hemos creadoun WebPart puro (no nos sirven los con-troles de usuario), ya que en este caso, alheredar de la clase WebPart, podremossobrescribir su propiedad Verbs.
Vamos a hacer un ejemplo sencillopara verlo en la práctica. Si recuerda, antescreamos un control UsuarioWebpart queservía para mostrar el nombre del usua-rio actual. Vamos a añadir una acción per-sonalizada a dicho control para que nospermita escoger en cada momento si elnombre del usuario se mostrará en mayús-culas o tal como lo devuelve el sistema. Sielegimos la opción de mayúsculas, la deja-remos marcada para indicarlo.
Lo primero que hay que hacer es cre-ar una nueva propiedad personalizable quellamaremos Mayusculas (fuente 5).
También tocamos el código de ren-derización para que muestre el nombrede usuario en mayúsculas en caso de queesta propiedad sea verdadera (se trata deun código trivial, por lo que no se mues-tra aquí).
Ahora debemos sobrescribir la pro-piedad de sólo lectura Verbs de nuestroWebPart, añadiendo las acciones persona-lizadas que deseemos (fuente 6).
Lo único que se hace es crear unacolección de elementos WebPartVerb quecontienen la definición de nuestras accio-nes personalizadas. El constructor de estetipo de elementos toma normalmente dosparámetros que son el identificador úni-co de la acción (así la podremos distinguirsi hay varias que comparten el mismoevento) y un delegado que apunta a unafunción que se llamará cuando un usua-
rio escoja esa acción. También establece-mos el texto y la descripción a mostrar ylo marcamos en el caso de que la propie-dad Mayusculas sea verdadera.
La definición del método que se lla-mará como resultado de usar esta acciónes el siguiente:
Como se puede observar, nada mássencillo. El efecto conseguido se puedever en la figura 5. Fíjese en que la opciónestá marcada, la descripción aparece aldejar el cursor encima y en que el nom-bre de usuario aparece en mayúsculas.
Inicialización de páginas
Es conveniente facilitar a los usuariosla posibilidad de dejar todo como estaba,ya que en muchas ocasiones, a base de
tocar en todas partes, la página puede que-dar irreconocible.
Es muy fácil proporcionar un botónde inicialización (o “reset” de la página).Agregue un enlace al lado de todos losanteriores con el texto “Reset”. En suevento de pulsación se llamará al métodoestático ResetUserState de la clasePersonalizationAdministration, pasán-dole bien el nombre de la página cuya per-sonalización queremos inicializar, bien elnombre del usuario cuya personalizaciónqueremos eliminar, o bien ambos.
El nombre de la página siempre sedebe indicar precediéndolo por “~/”, quehace referencia a la raíz de la aplicación(que no tiene por qué ser la raíz del ser-vidor). Nuestro código queda como se veen el fuente 8.
En este caso inicializamos sólo la pági-na actual. Redirigimos de nuevo a la pro-pia página para forzar la recarga de la mis-ma y que se vean los efectos de la inicia-lización.
En resumenEn esta segunda parte de la serie
sobre WebParts hemos visto con deta-lle algunas características avanzadas dela infraestructura que ASP.NET 2.0 nosproporciona. Todavía nos quedan algu-nas cosas interesantes por estudiar,como por ejemplo la conexión y tras-paso de datos entre los bloques. Esto loveremos en la próxima (y definitiva)entrega de la serie.
dotN
etM
anía
<<
19
dnm.asp.net<<
Private _mayusculas As Boolean<WebBrowsable(), Personalizable()> _Public Property Mayusculas() As Boolean
GetReturn _mayusculas
End GetSet(ByVal value As Boolean)
_mayusculas = valueEnd Set
End Property
Fuente 5
Public Overrides ReadOnly Property Verbs() AsSystem.Web.UI.WebControls.WebParts.WebPartVerbCollection
GetDim accion As WebPartVerbaccion = New WebPartVerb(“CambiaMays”, New WebPartEventHandler(AddressOf CambiaMayusculas))accion.Text = “Mayúsculas”accion.Description = “Mostrar el nombre de usuario en mayúsculas”accion.Checked = Me.MayusculasDim colAcciones() As WebPartVerb = New WebPartVerb() {accion}Return New WebPartVerbCollection(colAcciones)
End GetEnd Property
Fuente 6
Public Sub CambiaMayusculas(_ByVal sender As Object, _ByVal e As WebPartEventArgs)
Me.Mayusculas = Not Me.MayusculasEnd Sub
Fuente 7
Figura 5
Protected Sub LinkButton5_Click( ByVal sender As Object, ByVal e As System.EventArgs) _Handles LinkButton5.Click
PersonalizationAdministration.ResetUserState(“~/dotNetMania.aspx”)Response.Redirect(Request.FilePath)
End Sub
Fuente 8
de dispositivos móviles como SmartPhoney Pocket PC ha aumentado en gran medida el desa-rrollo para este tipo de dispositivos. Visual Studio 2005representa un avance incuestionable en este sentido,al proporcionarnos distintas herramientas para losdesarrollos.
Hoy en día casi cualquier desarrollador con unteléfono móvil o Pocket PC con Windows Mobilese ha puesto manos a la obra para realizar sus “pro-gramas caseros”. En la mayoría de los casos, uno seencuentra con ciertas sorpresas cuando realmente vaa implementar estos programas en el dispositivo real,y la mayoría de estas sorpresas hacen referencia almodelo de seguridad. Frases como: “ mi Smartphoneno me permite instalar las aplicaciones; éstas tienenque tener un certificado digital…”, “no puedo depu-rar en el dispositivo real… ¿qué está pasando?…”son de las más usuales en los foros de desarrollo conCompact Framework.
A lo largo de este artículo trataremos de desglo-sar el modelo de seguridad de los dispositivos móvi-les y de mostrar una serie de recomendaciones quenos ayudarán a solventar todos estos problemas.
Procesos confiables y procesos normalesPodríamos decir que los procesos en Windows
Mobile corren de dos formas distintas: como proce-sos confiables (trusted) o como procesos normales.Los procesos confiables son aquellos que pueden lla-mar a cualquier elemento de la API de WindowsMobile o leer y escribir en cualquier sección del regis-tro. Por el contrario, los procesos normales no tie-
nen permitido invocar a ciertas librerías del sistema,un ejemplo sería invocar a la API de telefoníatapi.dll, ni escribir en ciertas zonas del registro deWindows Mobile.
Esta diferencia permite agregar un valor de segu-ridad a los dispositivos móviles, puesto que los pro-cesos corriendo en forma normal reducen el riesgode ejecución de código malicioso y de provocar algúnerror que dañe al dispositivo.
En la tabla 1 puede encontrarse una relación delibrerías que solamente pueden ser llamadas por pro-cesos confiables.
Una vez hecha la diferencia entre procesos con-fiables y normales es fácil entender el concepto dedispositivos One Tier y Two Tier. En los dispositi-vos One Tier, la mayoría de dispositivos PocketPC, cualquier proceso que se pueda ejecutar esconfiable. Por el contrario en el modelo Two Tier,ampliamente usado por dispositivos SmartPhoney previamente establecido por las operadoras, losprocesos pueden ejecutarse como procesos con-fiables o procesos normales.
Modelos de seguridad en dispositivos móviles
Los modelos de seguridad en dispositivos móviles son los grandes desconocidospara los desarrolladores de software; sin embargo, entenderlos es fundamentalpara comprender ciertos problemas en el desarrollo y realizar aplicaciones másseguras. Mediante este artículo trataremos de explicar, tanto desde el punto devista teórico como práctico, cómo funcionan los distintos modelos impuestospor los fabricantes y operadoras de telefonía.
<< Con la proliferación
Unai Zorrilla
dnm.movilidad
Unai Zorrillaes MVP en Compact
Framework y colaborafrecuentemente con MSDN
España en diversas iniciativas.Actualmente es Development
Advisor en Plain Concepts,empresa especializada en
plataforma .NET desde la cualimparte formación y
consultorías especializadas.
Componente API
ShortMessageService SmsSetMessageNotification
SmsClearMessageNotification
...
SIM Manager simUnlockPhone
simSetLockingStatus...
Tabla 1. Ejemplo de API restringidas a procesos confiables
Política de seguridad
La política de seguridad en los dispositivosWindows Mobile está marcada por una serie deconstantes especiales que se pueden encontrar enel header secpol.h. Estas constantes están repre-sentadas por un par clave/valor, hay aproximada-mente dos docenas de pares; algunas de ellas se des-criben en la tabla 2.
Teniendo en cuenta estas constantes clave/valor sepueden realizar distintas configuraciones de los disposi-tivos. Windows Mobile tiene por defecto 5 posibles con-figuraciones, tal y como se puede observar en la tabla 3.
Poniendo en práctica loaprendido
Llegados a este pasopodemos decir que enten-demos el modelo de segu-ridad expuesto en los dis-
positivos móviles. Sin embar-go, como suelepasar en casi
todos los casos, lomejor es pasar a la prác-
tica y ver realmentecómo podemos probar los
distintos modelos de seguridad.
Primeros pasos
La primera tarea a realizar será la creación de unnuevo proyecto para dispositivos móviles. En nues-tros ejemplos usaremos un proyecto para WindowsMobile 5.0 SmartPhone tal y como se puede obser-var en la figura 1.
Una vez creado el nuevo proyecto para dispositi-vo móvil arrancaremos el emulador adecuado y lo sin-cronizaremos mediante ActiveSync: para ello segui-mos los siguientes pasos:
dotN
etM
anía
<<
21
dnm.movilidad<<
ConstanteSECPPOLICY
Política de seguridad
4102 ¿Pueden ejecutarse aplicaciones no firmadas?
4122 ¿Se le pregunta al usuario cuando intenta arran-car una aplicación no firmada?
4123 ¿Es One Tier o Two Tier el dispositivo?
4097 ¿Qué permisos para llamadas RAPI se tienen?
Tabla 2. Constantes de SecPol.h
Configuración 4102 4122 4123 4097 Observaciones
Locked No (0) No (1) Two Tier (0) One Tier (1)
Desactivado(0) No incluye certificado de Mobile2Market
Third-Party-Signed No (0) No (1) Two Tier (0) One Tier (1)
Desactivado(0) Incluye el certificado de Mobile2Market
Two-Tier-Prompt Si(1) Si(0) Two Tier(0) Restringido(2) El emulador de SmartPhone de Visual Studio 2005 posee esta con-figuración por defecto.
One-Tier-Prompt Si(1) Si(0) One-Tier(1) Restringido(2) El emulador de Pocket PC de Visual Studio posee esta configuración
Security-Off Si(1) No(1) One-Tier(1) Allowed(1) No es lo recomendado por razones obvias.
Tabla 3. Las configuraciones estándar de seguridad.
Figura 1.Creación de un nuevo proyecto para dispositivos móviles
• Arrancamos la herramienta Device EmulatorManager desde el menú “Herramientas de VisualStudio 2005” (véase la figura 2).
• Seleccionamos el emulador de SmartPhone paraWindows Mobile 5.0 y lo arrancamos.
• Configuración de ActiveSync para la sincroni-zación con el emulador.Con la llegada de Visual Studio 2005 tenemos la posi-bilidad de sincronizar los emuladores con ActiveSyncde igual forma que con un dispositivo real. Basta paraello una serie de pasos. El primero será el de indicara ActiveSync que permita conexiones por DMA en
el menú de configuración deconexiones tal y como pue-de verse en la figura 3.• Sincronización del emu-
lador de SmartPhone. Una vez configuradoActiveSync, para sincro-nizar el emulador de dis-positivo móvil basta condirigirse a la herramientaDevice Emulator Mana-ger y en menú contextualdel emulador seleccionarla opción “Cradle”; estopuede verse en la figura 4.
Aplicando las políticas de seguridad
Ahora ya podemos aplicar las políticas de seguri-dad con la finalidad de probar las mismas. Para elloVisual Studio 2005 nos ofrece una herramienta deconsola, rapiconfig.exe, que nos va a permitir esta-blecer las políticas de seguridad mediante archivos deprovisionamiento XML. Por defecto, tenemos variosarchivos de provisionamiento en la ruta Archivos deprograma\Microsoft Visual Studio 8\SmartDevices\
SDK\SDKTools\SecurityModels.Estos archivos de provisionamiento especifican los
valores de las constantes de secpol.h que habíamoscomentado al principio del artículo. Por ejemplo, siechamos un vistazo a la política locked.xml veremoslo siguiente.
Como puede observarse, lo que se está especifi-cando son los valores de las constantes, con lo cual essuficiente con modificar estos valores a nuestro gus-to para probar las distintas políticas que habíamos vis-to en la tabla 3.
Como primer ejemplo, veremos cómo aplicar lapolítica de seguridad Locked en el emulador. Comohabíamos comentado, disponemos de la herramientarapiconfig.exe para instalar archivos de provisiona-miento en el emulador sincronizado. Abrimos una con-
dotN
etM
anía
<<
22
dnm.movilidad<<
NOTA
Mobile2Market es un programa de Microsoft para ISV. Los desa-rrollos firmados y validados por Mobile2Market están abiertos a cual-quier dispositivo móvil ya que la mayoría de los dispositivos comoSmartPhone y Pocket PC poseen por defecto un certificado deMobile2Market. Puede encontrar más información acerca del progra-ma Mobile2Market en http://msdn.microsoft.com/mobility/windows-mobile/partners/mobile2market/default.aspx. ][
Figura 2.Arrancando DeviceEmulator Manager
Figura 3.ConfigurandoActiveSync para
permitir DMA
Figura 4. Sincronizando el emulador
<wap-provisioningdoc><characteristic type="SecurityPolicy"> <!-- Disallow unsigned apps --><parm name="4102" value="0"/> <!-- Prompt --><parm name="4122" value="0"/> <!-- 2-tier mode --><parm name="4123" value="0"/> </characteristic></wap-provisioningdoc>
Fuente 1
sola y nos dirigimos a la ruta Archivos de programa\Microsoft Visual Studio 8\SmartDevices\SDK\
SDKTools.Ejecutamos el siguiente comando para proveer la
configuración de seguridad:
rapiconfig.exe /P /M ./SecurityModels/locked.xml
Una vez hecho esto, ya podremos ver como secomportaría un dispositivo con la política de seguri-dad Locked. Si en este punto intentáramos probar unaaplicación de dispositivo móvil desde Visual Studio2005 veríamos un error indicándonos que la políticade seguridad no permite tal acción, véase figura 5.
Este comportamiento es lógico si tenemos encuenta que el modelo Locked no permite la ejecuciónde aplicaciones no firmadas. Si en vez de estableceresta política de seguridad hubiéramos seleccionadoel modelo Prompt, se preguntaría si se desea permi-tir la ejecución de aplicaciones no seguras, tal y comopodemos ver en la figura 6.
Primeras conclusiones
Llegados a este punto ya sabemos cuáles son losmodelos de seguridad de los dispositivos móviles,la diferencia entre los procesos confiables y los pro-cesos normales. Además hemos visto cómo sincro-nizar un emulador de dispositivo móvil y aplicarmediante archivos de provisionamiento las distin-tas políticas de seguridad ayudándonos de la herra-mienta rapiconfig.exe. Sin embargo, aún no hemosvisto nada acerca de la firma de las aplicaciones paraconseguir la ejecución de éstas en dispositivos móvi-les que no permitan nada más que la ejecución deprocesos confiables, o bien no tengamos el mensajede confirmación de ejecución en modelos Prompt.
Firma de aplicacionesEn esta sección veremos cómo firmar las aplica-
ciones y revisar su comportamiento con los distintosmodelos de seguridad.
El primer paso a dar será el de instalar el certi-ficado que usaremos para firmar nuestras aplica-ciones. Si no disponemos de uno, el SDK deSmartPhone y PocketPC de Windows Mobile 5.0pone a nuestra disposición una serie de certificadosde prueba.
La ventana de propiedades del proyecto de dispo-sitivo móvil nos permite especificar si queremos fir-mar el proyecto y la selección del certificado con elque queremos realizar la firma, tal y como puede ver-se en la figura 7.
dotN
etM
anía
<<
23
dnm.movilidad<<
Figura 5. Error al intentar desplegar una aplicaciónen el emulador con política Locked
Figura 6.Confirmaciónde ejecución de una
aplicación no firmada Figura 7. Firma de aplicación con un certificado digital
Podríamos decir que los procesos enWindows Mobile corren de dos formas
distintas: como procesos confiables(Trusted) o como procesos normales
Para firmar el certificado hacemos clic en el botón“Seleccionar Certificado” y seleccionamos o impor-tamos el certificado, en nuestro caso para ver un ejem-plo completo vamos a importar el certificado de prue-ba, véase figura 8.
El certificado de prueba lo podemos obtener dela ruta C:\Archivos de programa\Windows CE
Tools\wce500\Windows Mobile 5.0 Smartphone
SDK\Tools.Una vez importado el certificado, ya podemos
hacer uso de él para firmar nuestra aplicación.
Cuando usábamos el modelo de seguridad Promptveíamos que puesto que la aplicación no estaba fir-mada, se nos presentaba un mensaje de confirma-ción para permitir o no la ejecución de la misma.Una vez firmada la aplicación, veremos como ya nose nos presenta el mensaje de confirmación con estemodelo. De igual forma si tenemos establecido elmodelo Locked, que recordamos que no permitía laejecución de aplicaciones no firmadas, la aplicaciónse implementará sin problemas.
Conclusiones
A lo largo de este artículo hemos presentado elmodelo de seguridad de los dispositivos móvilesWindows Mobile, además de ver cómo podemosimplementar las distintas políticas en los emuladoresde Visual Studio 2005 con la finalidad de ver su fun-cionamiento real. Para terminar se ha visto cómo fir-mar las aplicaciones con un certificado digital y hemospodido comparar el funcionamiento de éstas estandofirmadas o no. No debemos caer en el error de pen-sar que con firmar las aplicaciones con un certificadoes suficiente; el certificado debe de estar presente enel dispositivo. Por defecto los dispositivos vienen pre-provisionados de unos determinados certificados, entrelos que se encuentra el de Mobile2Market; es por elloque si deseamos probar el certificado de prueba conun dispositivo real necesitamos además añadir al dis-positivo los certificados raíz. Para ello podremos usarla herramienta rapiconfig.exe y el archivo de provi-sionamiento sdktestcerts.xml.
dotN
etM
anía
<<
24
dnm.movilidad<<
Figura 9. Selección del certificado importado
No debemos caer en el error de pen-sar que con firmar las aplicaciones con
un certificado es suficiente; el certificado debe de estar presente en
el dispositivo
Figura 8. Importación del certificado de prueba
dotN
etM
anía
<<
25
Estilos en XAML
Con la llegada de Windows Vista se presentará también oficialmente WinFX, la nuevaplataforma para la creación de aplicaciones,que cubre dos grandes áreas del desarrollo:interfaces de usuario con WPF(Avalon),y comunicaciones con WCF (Indigo);tecnologíasambas que se perfilan como claves para la próxima generación de aplicaciones.En el pre-sente artículo vamos a realizar una revisión de los elementos que WPF pone a disposi-ción del desarrollador para aplicar estilos a los controles de nuestras ventanas.
<<Dentro del contexto del diseño de interfaces de
usuario, un estilo consiste en aquella característicadisponible en una herramienta de desarrollo, léaseIDE, lenguaje, diseñador visual, etc., que permitedefinir unas reglas comunes de aspecto, aplicables aun conjunto de elementos de nuestra interfaz.
XAML como lenguaje para definirinterfaces
XAML (Extensible Application MarkupLanguage), consiste en un esquema XML desarro-llado para la creación de interfaces gráficos enWPF (Windows Presentation Foundation), utilizan-do, como su propio nombre indica, una sintaxis demarcado para definir los elementos visuales. Dadoque este artículo versa sobre uno de los aspectosde la interfaz de usuario, y por lo tanto, será nece-sario crear ventanas de ejemplo con algunos con-troles básicos, se asume por parte del lector unmínimo conocimiento de XAML; en caso contra-rio, le remito al número 19 de dotNetManía, encuyo artículo “Primeros pasos con WindowsPresentation Foundation” de David Carmona,encontrará una magnífica introducción a este nue-vo subsistema gráfico.
Creando el proyecto de ejemploLos ejemplos presentados a lo largo de este artí-
culo se han desarrollado utilizando la versión CTP
de WinFX correspondiente a Enero de 2006, aun-que si el lector dispone de una versión posterior,también deberían funcionarle correctamente.Como entorno de desarrollo se ha utilizado VisualStudio 2005 (VS 2005 en lo adelante), ya que unavez instalados ambos productos, en VS 2005 dis-ponemos de plantillas de proyecto específicas paralos diferentes tipos de aplicaciones que podemosdesarrollar con WinFX. La figura 1 muestra el IDEde VS 2005, con la creación del proyectoEstilosXAML, utilizado para algunos de los ejem-plos de este artículo.
El lector puede encontrar todos los ejemplos quese exponen a lo largo de este artículo en la direcciónwww.dotnetmania.com.
Luis Miguel Blanco
dnm.futuro
Luis Miguel Blancoes redactor de dotNetManía. Es
consultor en Alhambra-Eidos.Haescrito varios libros y decenas de
artículos sobre la plataforma.NET (lalibreriadigital.com)
¿Qué es un estilo?
Figura 1. Proyecto de aplicación WinFX
La utilidad de los estilos
Supongamos que comenzamos a diseñar una ven-tana con varios controles TextBox, los cuales debentener la misma apariencia. Para ello podemos escri-bir el código que vemos en el fuente 1.
El aspecto de la ventana quedaría como vemos enla figura 2.
Revisando el código del fuente 1, comprobamosque para que todos los TextBox tengan el mismo aspec-to en cuanto a color y letra, debemos repetir el mis-mo código uno por uno, lo cual supone un mayoresfuerzo de codificación. Podemos aliviar parte de estatarea repetitiva, y al mismo tiempo organizar mejornuestro código, si creamos un estilo para este tipo decontrol y lo aplicamos en nuestra ventana, como mues-tra el fuente 2.
En el fuente 2, dentro de la etiqueta de recursosde la ventana, Window.Resources, definimos un estilomediante la etiqueta Style.
El atributo TargetType, perteneciente a la etique-ta Style, nos permite especificar el tipo de control
sobre el que aplicamos el estilo. Seguidamente, paraestablecer las características que mostrará el controlal que se aplica el estilo, usaremos un asignador depropiedad, representado por la etiqueta Setter, en laque mediante los atributos Property y Value asigna-mos un valor a una propiedad del tipo de control des-tinatario del estilo; como es natural, podemos utilizartantos asignadores como propiedades del control que-ramos incluir en el estilo.
Como consecuencia de la creación de nuestroestilo, a cada control TextBox existente en el códi-go XAML de la ventana automáticamente se le apli-carán las propiedades definidas en el estilo, ahorrán-donos el trabajo de establecer dichas propiedadesindependientemente por cada control. Esto supo-ne ello una mejor organización y mantenimientode las mismas, al estar situadas en un punto cen-tralizado de nuestro código.
Estilos de aplicación explícita, o esti-los con nombre
En el ejemplo de estilo comentado en el apartadoanterior, podemos ver que no es necesario indicar acada uno de los controles TextBox el estilo a utilizar,dado que al ser declarado con el atributo TargetType,ya se aplica automáticamente a los controles. A estemodo de utilización del estilo se le denomina tambiénestilo de aplicación implícita.
Pero supongamos que no queremos que un esti-lo se aplique a todos los controles de un mismo tipouniformemente, o bien, queremos tener estilos que
dotN
etM
anía
<<
26
dnm.futuro<<
Fuente 1
<Window x:Class=”Window1”xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”Title=”EstilosXAML” Height=”350” Width=”400”>
<Canvas><TextBox Name=”txtNombre”Canvas.Left=”10” Canvas.Top=”5”Background=”PaleGreen” FontWeight=”Bold”/>
<TextBox Name=”txtApellidos”Canvas.Left=”10” Canvas.Top=”40”Background=”PaleGreen” FontWeight=”Bold”/>
<TextBox Name=”txtCiudad”Canvas.Left=”10” Canvas.Top=”80”Background=”PaleGreen” FontWeight=”Bold”/>
</Canvas></Window>
Figura 2.Ventanacon controles
sin estilo
Fuente 2
<Window x:Class=”Window1”xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”Title=”EstilosXAML” Height=”350” Width=”400”>
<Window.Resources><Style TargetType=”{x:Type TextBox}”><Setter Property=”Background”
Value=”PaleGreen”></Setter><Setter Property=”FontWeight” Value=”Bold”/>
</Style></Window.Resources>
<Canvas><TextBox Name=”txtNombre”Canvas.Left=”10” Canvas.Top=”5” />
<TextBox Name=”txtApellidos”Canvas.Left=”10” Canvas.Top=”40” />
<TextBox Name=”txtCiudad”Canvas.Left=”10” Canvas.Top=”80” />
</Canvas>
</Window>
puedan ser asignados a tipos distintosde controles; es el momento de recurrira los estilos de aplicación explícita, tam-bién denominados estilos con nombre.
Los estilos con nombre se caracte-rizan porque al ser declarados se empleael atributo x:Key, con el cual asignamosun nombre al estilo. Posteriormente,desde el código XAML de un controlinvocaremos el estilo mediante su atri-buto Style y la sintaxis {StaticResourceNombreEstilo}. Esta técnica nos permi-te aplicar selectivamente estilos a loscontroles, lo que en ciertos escenariospuede ser más conveniente que la apli-cación global de un estilo a todos loscontroles de un determinado tipo.
En el fuente 3 ampliamos el códigode nuestra ventana de ejemplo aña-diendo un estilo con nombre, que apli-caremos a ciertos controles Label, y aun TextBox.
La figura 3 muestra el resultado dela ejecución de la ventana.
Nótese que en el caso de los estiloscon nombre, al definir el asignador, elatributo Property debe especificarse conel formato Clase.Propiedad, siendoClase el tipo de la plataforma corres-pondiente al control sobre el que se apli-ca, o un tipo más genérico en la jerar-quía de controles; es por esto que en elejemplo anterior también podríamoshaber declarado las etiquetas Settercomo muestra el fuente 4.
dotN
etM
anía
<<
27
dnm.futuro<<
Fuente 3
Figura 3.Ventanautilizando estilo
con nombre
Fuente 4
...<Setter Property=”Label.BorderBrush”
Value=”Orange”></Setter>...
<Window x:Class=”Window1” .... ><Window.Resources>....<Style x:Key=”styVarios”><Setter Property=”Control.BorderBrush” Value=”Orange”></Setter><Setter Property=”Control.BorderThickness” Value=”3”></Setter><Setter Property=”Control.Background” Value=”Aqua”></Setter>
</Style></Window.Resources>
<Canvas><LabelCanvas.Left=”10” Canvas.Top=”5”Content=”Nombre:”Style=”{StaticResource styVarios}” />
<TextBox Name=”txtNombre”Canvas.Left=”75” Canvas.Top=”5” />
<LabelCanvas.Left=”10” Canvas.Top=”40”Content=”Apellidos:”Style=”{StaticResource styVarios}” />
<TextBox Name=”txtApellidos”Canvas.Left=”75” Canvas.Top=”40” />
<LabelCanvas.Left=”10” Canvas.Top=”80”Content=”Ciudad:” />
<TextBox Name=”txtCiudad”Canvas.Left=”75” Canvas.Top=”80”Style=”{StaticResource styVarios}” />
</Canvas></Window>
El lector puede pensar en este momento que siutilizamos Label.Propiedad en el asignador, el estilosólo sería válido para ser aplicado a controles Label;sin embargo, aunque esto parece lo más lógico no esasí, ya que el control TextBox al que se aplica el estilotambién lo aceptaría.
El motivo de este comportamiento reside en queal ser aplicado el asignador, éste es aceptado tanto porcontroles que se encuentran en el mismo árbol dejerarquía, como por aquellos que comparten la imple-mentación de la propiedad, caso este último que es elque nos ocupa actualmente.
El control Label se encuentra en el espacio denombres System.Windows.Controls.ContentControl,mientras que TextBox se halla ubicado enSystem.Windows.Controls.Primitives.TextBoxBase. Sinembargo, la implementación de las propiedades queusamos en el estilo styVarios del ejemplo es compar-tida por ambas clases, y esto hace que podamos decla-rar en el atributo Property del asignador cualquierade las dos clases, con la seguridad de que el estilo seráaplicado indistintamente a controles de ambos tipos,como vemos en el fuente 5.
También puede darse el caso contrario: controlescon propiedades específicas, las cuales no existen enotros controles de nuestra ventana. En esta situaciónigualmente podemos crear un único estilo y asigna-dores para este tipo de propiedades.
Como ejemplo ilustrativo tenemos el controlTextBox con su propiedad Text, y por otra parte elcontrol CheckBox con su propiedad IsChecked. El
fuente 6 demuestra cómo es posible crear un esti-lo con un asignador para cada una de estas propie-dades, y utilizarlo sin que los asignadores entren enconflicto. Al ser aplicado el estilo, lo que sucederáes que si un asignador no encuentra la propiedaden el control de destino, simplemente no será teni-do en cuenta.
Para el código del fuente 6 se ha creado en el pro-yecto una nueva ventana con el nombre Window2; enel caso de necesitar que la ventana inicial sea ésta,debemos editar el archivo MyApp.xaml, y en el atribu-to StartupUri asignar el nombre de la ventana inicialdel proyecto, como vemos en el fuente 7.
Herencia de estilos Gracias al atributo BasedOn de la etiqueta Style,
podemos crear un estilo hijo a partir de un estilo defi-nido anteriormente, de manera que el nuevo estilotendrá todos los asignadores del estilo padre más lospropios que él defina, como vemos en el ejemplo delfuente 8.
dotN
etM
anía
<<
28
dnm.futuro<<
Fuente 5
...// podemos declarar el asignador así<Setter Property=”Label.BorderBrush” Value=”Orange”></Setter>....// y también así<Setter Property=”TextBox.BorderBrush” Value=”Orange”></Setter>...
Fuente 8
<Window.Resources><Style x:Key=”styPadre”><Setter Property=”Button.Background” Value=”SkyBlue”/><Setter Property=”Button.Foreground” Value=”Red”/>
</Style>
<Style x:Key=”styHijo” BasedOn=”{StaticResource styPadre}”><Setter Property=”Button.FontSize” Value=”18”/><Setter Property=”Button.Opacity” Value=”0.5”/>
</Style></Window.Resources>
<Canvas><ButtonCanvas.Left=”5” Canvas.Top=”5”Style=”{StaticResource styPadre}”>ACEPTAR
</Button>
<ButtonCanvas.Left=”100” Canvas.Top=”5”Style=”{StaticResource styHijo}”>CANCELAR
</Button></Canvas>
Fuente 7
<Application x:Class=”MyApp”xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”StartupUri=”Window3.xaml”><Application.Resources>
</Application.Resources></Application>
Fuente 6
<Window.Resources><Style x:Key=”styNuevo”>
<Setter Property=”TextBox.Text” Value=”Introduzca su nombre” /><Setter Property=”CheckBox.IsChecked” Value=”True” />
</Style></Window.Resources>
<Canvas><TextBox Canvas.Left=”5” Canvas.Top=”5” Style=”{StaticResource
styNuevo}” />
<CheckBox Canvas.Left=”150” Canvas.Top=”5”Content=”Comprobar” Style=”{StaticResource styNuevo}” />
</Canvas>
En la figura 4 podemos apreciar ladiferencia en la aplicación de ambosestilos.
Ámbito de estilosEl radio de acción que abarca un
estilo depende básicamente del lugar
dentro del código en donde el estilo esdeclarado. En los ejemplos vistos hastael momento hemos declarado los esti-los en la etiqueta de recursos de la ven-tana, de forma que todos los controlescontenidos en la misma recibían el esti-lo si ello era menester.
No obstante, podemos reducir oampliar esta zona de influencia del esti-lo; por ejemplo, si lo declaramos en elarchivo MyApp.xaml del proyecto, dentrode la etiqueta Application.Resources, elestilo se aplicará globalmente a todoslos controles de la aplicación definidospor el estilo. Como contrapartida, si cre-amos un estilo en un elemento con unrango de influencia menor, como pue-de ser el Canvas de una ventana, sóloafectará a los controles situados dentrode dicho elemento.
Para ilustrar las mencionadas situa-ciones, vamos a crear un proyecto conel nombre AmbitoEstilos, que con-tenga dos ventanas. A nivel de aplica-ción crearemos un estilo que aplica-remos a los controles Button; en losrecursos de una de las ventanas tam-bién añadiremos un estilo para losTextBox; y dentro del Canvas, el esti-lo será para los CheckBox, como vemosen el fuente 9.
En la figura 5 vemos el aspecto delos formularios de este ejemplo.
Estilos por códigoAunque en la mayoría de las ocasio-
nes manipularemos nuestros estilosdeclarativamente desde XAML, tam-bién es posible realizar su creación yasignación desde el código de nuestraaplicación.
dotN
etM
anía
<<
29
dnm.futuro<<
Fuente 9
<!—MyApp.xaml—><Application x:Class=”MyApp”xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”StartupUri=”Window1.xaml”>
<Application.Resources><Style TargetType=”{x:Type Button}”><Setter Property=”Background” Value=”SkyBlue”/><Setter Property=”Width” Value=”100”/><Setter Property=”Height” Value=”40”/>
</Style></Application.Resources>
</Application>
<!—Window1.xaml—><Window x:Class=”Window1”xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”Title=”AmbitoEstilos” Width=”200” Height=”200”><Window.Resources><Style TargetType=”{x:Type TextBox}”><Setter Property=”FontSize” Value=”18”/><Setter Property=”FontStyle” Value=”Italic”/><Setter Property=”FontWeight” Value=”UltraBold”/>
</Style></Window.Resources>
<Canvas><Canvas.Resources><Style TargetType=”{x:Type CheckBox}”><Setter Property=”IsChecked” Value=”True”/><Setter Property=”BorderThickness” Value=”5”/>
</Style></Canvas.Resources>
<TextBox Canvas.Left=”5” Canvas.Top=”5” Width=”150” /><Button Name=”btnAbrir” Canvas.Left=”5” Canvas.Top=”50” Content=”Abrir ventana” /><CheckBox Canvas.Left=”5” Canvas.Top=”100” Content=”Comprobado”/>
</Canvas></Window>
<!—codebehind de Window1.xaml—>Private Sub btnAbrir_Click(ByVal sender As Object, ByVal e AsSystem.Windows.RoutedEventArgs) Handles btnAbrir.Click
Dim oWin2 As Window2 = New Window2oWin2.Show()
End Sub
<!—Window2.xaml—><Window x:Class=”Window2”xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”Title=”AmbitoEstilos” Width=”200” Height=”200”><Canvas><Button Name=”btnAceptar” Canvas.Left=”5” Canvas.Top=”5” Content=”Aceptar” />
</Canvas></Window>
Figura 5. Estilos con diferenteámbito
Figura 4. Controlescon herencia de estilos
Para acceder a un estilo desde el code-behind denuestra aplicación, debemos llamar al métodoFindResource() de la clase Window, pasándole comoparámetro una cadena con el estilo a recuperar. Estaoperación nos devolverá un objeto Style que pode-mos asignar a los controles de la ventana.
En el caso de que necesitemos crear los estilosdinámicamente en tiempo de ejecución, instanciare-
mos un objeto de la clase Style, a cuya colecciónSetters iremos añadiendo, también dinámicamente,tantos objetos asignadores como queramos que ten-ga el estilo.
Como ejemplo de creación dinámica de estilos,crearemos un nuevo proyecto con el nombreEstilosPorCodigo, con la definición de ventana enXAML, que vemos en el fuente 10.
Es de destacar en este fuente el asignador deestilo que establece el valor para la propiedadBackground. Como puede comprobar el lector, enesta ocasión no asignamos un nombre simple decolor para la propiedad, sino que utilizamos un obje-to LinearGradientBrush, que crea el color a partir deun degradado basado en la mezcla de varios colores.
Puesto que se trata de un valor complejo para asig-nar a la propiedad Background del estilo, utilizaremosla etiqueta Setter.Value, incluyendo en su interior elvalor para la propiedad.
Para aplicar el estilo creado en el XAML, utiliza-remos un control CheckBox, mientras que para crearun nuevo estilo por código emplearemos un Button.El fuente 11 muestra el código en el que se imple-menta esta tarea.
dotN
etM
anía
<<
30
dnm.futuro<<
Fuente 10
<Window x:Class=”Window1”xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”Title=”EstilosPorCodigo” Height=”262” Width=”336”>
<Window.Resources><Style x:Key=”styControles”><Setter Property=”Control.FontWeight” Value=”Heavy”/>
<Setter Property=”Control.Background”><Setter.Value><LinearGradientBrush StartPoint=”0,0.5” EndPoint=”1,0.5”><LinearGradientBrush.GradientStops><GradientStop Color=”GreenYellow” Offset=”0”/><GradientStop Color=”Cyan” Offset=”0.30”/><GradientStop Color=”Pink” Offset=”0.70”/>
</LinearGradientBrush.GradientStops></LinearGradientBrush>
</Setter.Value></Setter>
</Style></Window.Resources>
<Canvas><Button Name=”btnAceptar”Canvas.Left=”10” Canvas.Top=”10”Width=”100” Height=”50” Content=”Aceptar”/>
<ListBox Name=”lstCiudades”Canvas.Left=”10” Canvas.Top=”100”Width=”100” Height=”100”><ListBoxItem>Bruselas</ListBoxItem><ListBoxItem>París</ListBoxItem><ListBoxItem>Londres</ListBoxItem>
</ListBox>
<CheckBoxName=”chkAplicarEstilo”Canvas.Left=”125” Canvas.Top=”10”>Aplicar estilo
</CheckBox>
<ButtonName=”btnCrearEstilo”Canvas.Left=”125” Canvas.Top=”50”Width=”100” Height=”25”>Crear estilo
</Button>
<TextBox Name=”txtNombre”Canvas.Left=”125” Canvas.Top=”90”Width=”150” Height=”50”>Prueba
</TextBox></Canvas>
</Window>
Fuente 11
Partial Public Class Window1Inherits Window
Private Sub chkAplicarEstilo_Click( ByVal sender As Object,_ByVal e As System.Windows.RoutedEventArgs) _Handles chkAplicarEstilo.Click
‘ aplicar/quitar desde código un estilo definido en xamlIf Me.chkAplicarEstilo.IsChecked Then
Me.btnAceptar.Style = _CType(Me.FindResource(“styControles”), Style)
Me.lstCiudades.Style = _CType(Me.FindResource(“styControles”), Style)
ElseMe.btnAceptar.Style = NothingMe.lstCiudades.Style = Nothing
End IfEnd Sub
Private Sub btnCrearEstilo_Click(ByVal sender As Object,_ByVal e As System.Windows.RoutedEventArgs)_Handles btnCrearEstilo.Click
‘ crear estilo por código y aplicarlo a un controlDim styCaja As Style = New Style(GetType(TextBox))styCaja.Setters.Add( New Setter(BackgroundProperty,_
Brushes.Aquamarine))styCaja.Setters.Add( New Setter(FontFamilyProperty,_
New FontFamily(“Arial Black”)))styCaja.Setters.Add(New Setter(BorderThicknessProperty,_
New Thickness(7)))
Resources.Add(“styCajaTexto”, styCaja)Me.txtNombre.Style = styCaja
End SubEnd Class
La figura 6 muestra la ventana en ejecución des-pués de haberle aplicado estos estilos por código.
Aplicación directa de estilo en la declara-ción del control
Si bien esta técnica la usaremos en raras ocasio-nes, ya que implica un trabajo adicional de codifica-ción y un nulo reaprovechamiento del estilo, debe-mos saber que es posible crear estilos en la propiadeclaración del control, como vemos en el fuente 12.
Estilos y plantillas de datos
Supongamos que creamos un proyecto con el nom-bre EstilosPlantillasDatos, y escribimos una clasecuyos objetos queremos visualizar a través de un con-trol situado en la ventana del proyecto. El código dela clase podemos verlo en el fuente 13.
A continuación escribimos el código de definiciónde la ventana, que tenemos en el fuente 14.
Y por ultimo, en el evento Click del botón ins-tanciamos un objeto de la clase Empleado, y lo asigna-mos al control Label, como muestra el fuente 15.
dotN
etM
anía
<<
31
dnm.futuro<<
Fuente 12
<Button Name=”btnHola”Canvas.Top=”150” Canvas.Left=”20”Height=”30”><Button.Style>
<Style><Setter Property=”Button.Background”
Value=”Yellow”></Setter><Setter Property=”Button.FontSize”
Value=”16”></Setter><Setter Property=”Button.Width”
Value=”200”></Setter></Style>
</Button.Style>Hola
</Button>
Fuente 13
Public Class EmpleadoPrivate nCodigo As IntegerPrivate sNombre As String
Public Property Codigo() As IntegerGet
Return nCodigoEnd GetSet(ByVal value As Integer)
nCodigo = valueEnd Set
End Property
Public Property Nombre() As StringGet
Return sNombreEnd GetSet(ByVal value As String)
sNombre = valueEnd Set
End Property
Public Sub New( ByVal nCod As Integer, ByVal sNom As String)nCodigo = nCodsNombre = sNom
End SubEnd Class
Fuente 14
<Window x:Class=”Window1”xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”Title=”EstilosPlantillasDatos” Height=”328” Width=”352”>
<Canvas><Button Name=”btnAsignar”Canvas.Left=”10” Canvas.Top=”10” Content=”Asignar objeto”/>
<Label Name=”lblPrueba”Canvas.Left=”10” Canvas.Top=”50”Width=”200” Height=”80”Background=”LightBlue”>Etiqueta de prueba
</Label></Canvas>
</Window>
Fuente 15
Partial Public Class Window1Inherits Window‘....Private Sub btnAsignar_Click(ByVal sender As Object, _
ByVal e As System.Windows.RoutedEventArgs) _Handles btnAsignar.Click
Dim oEmpleado As Empleado = New Empleado(12350, “Alberto”)Me.lblPrueba.Content = oEmpleado
End SubEnd Class
Figura 6. Estilos aplicados por código
Si esperamos que, al pulsar btnAsignar, el controlLabel al que hemos asignado el objeto muestre las pro-piedades del mismo, vamos por el camino equivoca-do, ya que el control carece de la lógica necesaria parasaber representar un tipo complejo de la plataforma,como vemos en la figura 7.
Lo que está sucediendo en la figura 7 es que elcontrol Label detecta que tiene un objeto Empleado ensu propiedad Content, y sabe que de alguna maneradebe interpretarlo y mostrarlo, pero al no haberleindicado la forma de visualizar el objeto, opta por lla-mar al método genérico ToString(), que devuelve unacadena con el espacio de nombres y nombre de la cla-se Empleado.
Para solucionar este problema, debemos dotar alcontrol Label de un comportamiento inteligente eneste aspecto utilizando una plantilla de datos, repre-sentada en WPF por un objeto DataTemplate.
Un objeto DataTemplate permite, desde el códigoXAML de la ventana, especificar cómo van a ser repre-sentados visualmente los miembros de un tipo de.NET Framework a través de un control situado endicha ventana; para ello, el elemento primario quedebe tener un DataTemplate es un objeto contenedor(cualquier derivado de la clase Panel), dentro del cualespecifiquemos los controles encargados de visuali-zar el objeto a representar.
Dado que necesitamos acceder desde el códigoXAML a un objeto de la plataforma gestionado porel CLR (la clase Empleado en este ejemplo), es pre-ciso declarar este hecho, es decir, mapear el espa-cio de nombres en el que está la clase, para que seaaccesible desde XAML; esto lo conseguimosmediante la etiqueta Mapping al comienzo del códi-go de definición de la ventana, como vemos en elfuente 16.
Seguidamente en el código XAML tambiéndebemos especificar, mediante el atributoxmlns:EspacioNombresXML, el objeto que vaya a haceruso del espacio de nombres que acabamos de mapear,en este caso la ventana, como muestra el fuente 17.
El próximo paso consiste en crear elDataTemplate dentro de la zona de recursos de laventana, especificando el tipo de objeto cuyosmiembros va a representar en su interior, utilizan-do para ello el atributo DataType, y la sintaxis {x:TypeEspacioNombres:Clase}. También deben declararselos controles a utilizar para representar el objeto,y dentro de cada uno de ellos, establecer el enlaceo DataBinding con los miembros del objeto, usan-do la sintaxis {Binding Path=PropiedadClase}. Verel fuente 18.
dotN
etM
anía
<<
32
dnm.futuro<<
Fuente 16
<?Mapping XmlNamespace=”mio” ClrNamespace = ”EstilosPlantillasDatos” ?>
Fuente 17
<Window x:Class=”Window1”
xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”
xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”xmlns:mio=”mio”Title=”WindowsApplication1”Height=”362” Width=”426”>
. . . .
. . . .</Window>
Fuente 18
<Window.Resources><DataTemplate DataType=”{x:Type mio:Empleado}”><StackPanel Orientation=”Vertical”
Background=”LawnGreen”><Label Content=”{Binding Path=Codigo}”
HorizontalAlignment=”Left” /><TextBox Text=”{Binding Path=Nombre}” />
</StackPanel></DataTemplate>
</Window.Resources>
Figura 7. Objeto Empleadoasignado a control Label
Gracias al atributo BasedOnde la etiqueta Style, podemos
crear un estilo hijo a partir de un estilo definido anteriormente
Tras realizar todas estas operaciones, al ejecu-tar de nuevo nuestra ventana, el control LabellblPrueba ya sabrá cómo interpretar visualmente elobjeto Empleado, mostrándose como vemos en lafigura 8.
Pero estamos en un artículo sobre estilos, y elDataTemplate muestra el objeto “en bruto”, es decir,sin formateo alguno; es por ello que ahora vamos acrear estilos en los recursos de la ventana, que utili-zaremos desde la plantilla de datos, para que el obje-to Empleado tenga una apariencia adaptada a nuestrosgustos. Veamos para ello el fuente 19.
La información mostrada por la plantilla de datosal ejecutar de nuevo la ventana será la misma, pero suapariencia será muy diferente gracias a la aplicacióndel estilo, como vemos en la figura 9.
Desencadenadores de estilosUn desencadenador o trigger es aquel elemento
que ejecuta una acción cuando ocurre una determi-nada circunstancia en nuestro código.
En el contexto de los estilos en XAML un desen-cadenador consiste en una etiqueta con el nombreTrigger, definida dentro de un estilo, que aplicará losasignadores que contiene siempre y cuando se cum-pla la condición definida en el desencadenador.
Los desencadenadores de estilos en WPF se cla-sifican en varias categorías, en función del elementosobre el que actúan; así tenemos desencadenadorespara propiedades, para objetos del CLR, y para even-tos. En los siguientes apartados trataremos cada tipopor separado.
Desencadenador para propiedadSe trata del tipo más básico, y su funcionamiento se
basa en el siguiente mecanismo: cuando la propiedaddefinida en el atributo Property tenga el valor indica-do en el atributo Value, se aplicarán los asignadores defi-nidos en el interior de la etiqueta Trigger. Como ejem-plo ilustrativo, crearemos un proyecto con el nombreDesencadenadorPropiedad, y en el XAML de su venta-na escribiremos el código del fuente 20.
dotN
etM
anía
<<
33
dnm.futuro<<
Figura 8. Objeto visualizadomediante un DataTemplate
Fuente 19
<Window.Resources><Style x:Key=”styEtiqueta”><Setter Property=”Control.FontWeight” Value=”Bold”/><Setter Property=”Control.Background” Value=”Pink”/><Setter Property=”Control.Width” Value=”30”/>
</Style>
<Style x:Key=”styCaja”><Setter Property=”Control.Background” Value=”Gold”/>
</Style>
<DataTemplate DataType=”{x:Type mio:Empleado}”><StackPanel Orientation=”Vertical”
Background=”LawnGreen”><Label Content=”{Binding Path=Codigo}”
Style=”{StaticResource styEtiqueta}”HorizontalAlignment=”Left” />
<TextBox Text=”{Binding Path=Nombre}”Style=”{StaticResource styCaja}” />
</StackPanel></DataTemplate>
</Window.Resources>
Figura 9. DataTemplate con estilos
Fuente 20
<Window x:Class=”Window1” …. ><Window.Resources><Style x:Key=”styCaja”><Style.Triggers><Trigger Property=”IsFocused” Value=”True”><Setter Property=” TextBox.Background”
Value=” LightCoral “/><Setter Property=”TextBox.FontWeight”
Value=”Bold”></Setter></Trigger>
</Style.Triggers></Style>
</Window.Resources><Canvas><TextBox Width=”150”Canvas.Left=”10”Canvas.Top=”10”Text=”prueba”/>
<TextBox Width=”200”Canvas.Left=”10”Canvas.Top=”40”Text=”otro texto”Style=”{StaticResource styCaja}”/>
</Canvas></Window>
Al ejecutar el fuente 20, al segundo TextBox le seráaplicado el estilo cuando obtenga el foco, ya que estaes la condición establecida en el desencadenador. Lafigura 10 muestra esta situación.
Pero el uso de desencadenadores no está limi-tado a un único desencadenador por cada estilo,sino que podemos definir tantos como necesitemos.En el fuente 21 realizamos una pequeña variacióndel anterior ejemplo, de modo que ahora tendre-mos múltiples desencadenadores para un mismoestilo.
Además de comprobar si el control tiene el foco,también se comprobará si el contenido del TextBoxcorresponde a una determinada cadena.
Desencadenador para datosEste tipo de desencadenador se utiliza en com-
binación con una plantilla de datos, para aplicar unoo varios estilos a los componentes de dicha plantillautilizados para visualizar los miembros de un obje-to, pero en este caso cuando se cumpla una deter-minada condición.
Basándonos en el ejemplo de un apartado anterior sobre estilos aplicados a un DataTemplate, vamos a crear un proyecto con el nombreDesencadenadorDatos, en el que deberemos incluirel código de la clase Empleado, realizando sobre elXAML de la ventana algunos retoques, consisten-
tes en crear dos estilos que incorporen un desen-cadenador por cada propiedad del objeto Empleado,como vemos en el fuente 22.
dotN
etM
anía
<<
34
dnm.futuro<<
Fuente 22
<?Mapping XmlNamespace=”mio” ClrNamespace=”DesencadenadorDatos” ?>
<Window x:Class=”Window1” ….xmlns:mio=”mio” . . . . >
<Window.Resources><DataTemplate DataType=”{x:Type mio:Empleado}”><StackPanel Orientation=”Vertical” Background=”LawnGreen”><Label Content=”{Binding Path=Codigo}”
Style=”{StaticResource styEtiquetaPlant}”HorizontalAlignment=”Left” />
<TextBox Text=”{Binding Path=Nombre}”Style=”{StaticResource styCajaPlant}” />
</StackPanel></DataTemplate>
<Style x:Key=”styEtiquetaPlant”><Style.Triggers><DataTrigger Binding=”{Binding Path=Codigo}” Value=”275”><Setter Property=”Control.Background” Value=”Cyan” />
</DataTrigger></Style.Triggers>
</Style>
<Style x:Key=”styCajaPlant”><Style.Triggers><DataTrigger Binding=”{Binding Path=Nombre}” Value=”Elena”><Setter Property=”Control.Background” Value=”Crimson” />
</DataTrigger></Style.Triggers>
</Style></Window.Resources>
<Canvas><LabelName=”lblEtiqueta1”BorderThickness=”3”BorderBrush=”Black”Background=”Silver”Canvas.Left=”10” Canvas.Top=”10”Width=”200” Height=”100”/>
<LabelName=”lblEtiqueta2”BorderThickness=”3”BorderBrush=”Black”Background=”Silver”Canvas.Left=”10” Canvas.Top=”125”Width=”200” Height=”100”/>
<ButtonName=”btnAsignaEtiqueta1”Canvas.Left=”225” Canvas.Top=”10”>Asignar etiqueta 1
</Button>
<ButtonName=”btnAsignaEtiqueta2”Canvas.Left=”225” Canvas.Top=”150”>Asignar etiqueta 2
</Button></Canvas>
</Window>
Figura 10
Fuente 21
<Style x:Key=”styCaja”><Style.Triggers><Trigger Property=”IsFocused” Value=”True”><Setter Property=” TextBox.Background” Value=”LightCoral”/><Setter Property=”TextBox.FontWeight” Value=”Bold”></Setter>
</Trigger>
<Trigger Property=”TextBox.Text” Value=”Camino”><Setter Property=”TextBox.FontSize” Value=”18”></Setter>
</Trigger></Style.Triggers>
</Style>
Como podemos observar, en esta ocasión el esti-lo sólo será aplicado a los elementos del DataTemplateque cumplan con las condiciones establecidas en losDataTrigger. El fuente 23 muestra el código de losbotones que asignan una instancia de la clase Empleadoa los controles Label.
Al ejecutar la aplicación, el objeto asignado al con-trol lblEtiqueta1 cumple con las condiciones de ambosestilos, por lo tanto se aplica el estilo al completo ensu DataTemplate. Para el controllblEtiqueta2 sólo se aplica el estilo corres-pondiente a la propiedad Codigo del obje-to Empleado asignado al control; todo ellolo vemos en la figura 11.
Desencadenador para eventosEl tercer y último tipo de desencade-
nador se mantiene a la escucha de undeterminado evento, y cuando éste ocu-rre, genera una animación sobre el con-trol al que se ha aplicado el estilo.
Para este ejemplo crearemos un pro-yecto con el nombre DesencadenadorEvento, en el que para crear la animación
que responda al evento del desencadenador, definiremosuna acción que contenga un objeto Storyboard.
Respecto a la animación, WPF dispone de unaamplia variedad de tipos, en función de la propiedaddel control que necesitemos animar. En el siguienteejemplo, realizamos una animación sobre el ancho yalto de un control Button durante un espacio de tiem-po de 5 y 10 segundos respectivamente. Dado que setrata de una propiedad numérica de tipo Double, emple-aremos el elemento DoubleAnimation, como muestrael fuente 24.
dotN
etM
anía
<<
35
dnm.futuro<<
Fuente 23
Private Sub btnAsignaEtiqueta1_Click(ByVal sender As Object, _ByVal e As System.Windows.RoutedEventArgs) _Handles btnAceptar.Click
Dim oEmpleado1 As Empleado = New Empleado(275, “Elena”)Me.lblEtiqueta.Content = oEmpleado1
End Sub
Private Sub btnAsignaEtiqueta2_Click(ByVal sender As Object, _ByVal e As System.Windows.RoutedEventArgs) _Handles btnAceptar.Click
Dim oEmpleado2 As Empleado = New Empleado(275, “Alberto”)Me.lblEtiqueta.Content = oEmpleado2
End Sub
Figura 11
Fuente 24
<Window x:Class=”Window1”xmlns=”http://schemas.microsoft.com/winfx/avalon/2005”xmlns:x=”http://schemas.microsoft.com/winfx/xaml/2005”Title=”DesencadenadorEvento”>
<Window.Resources><Style TargetType=”{x:Type Button}”><Setter Property=”Background” Value=”Green”></Setter><Setter Property=”Foreground” Value=”White”></Setter>
<Style.Triggers><EventTrigger RoutedEvent=”Click”><EventTrigger.Actions><BeginStoryboard><Storyboard><DoubleAnimation Storyboard.TargetProperty=”Width”To=”250” Duration=”0:0:5” />
<DoubleAnimation Storyboard.TargetProperty=”Height”To=”100” Duration=”0:0:10” AutoReverse=”True”/>
</Storyboard></BeginStoryboard>
</EventTrigger.Actions></EventTrigger>
</Style.Triggers>
</Style></Window.Resources>
<Canvas><ButtonCanvas.Left=”10” Canvas.Top=”10”Width=”100” Height=”30” Content=”Prueba a pulsar” />
</Canvas></Window>
Si declaramos el estilo en el archivo MyApp.xaml, dentro de laetiqueta Application.Resources, el estilo se aplicará globalmente a
todos los controles de la aplicación definidos por el estilo
Nótese en el fuente 24, que la animación para laaltura del control volverá a dejarlo en su estado ini-cial, gracias al atributo AutoReverse, perteneciente alelemento DoubleAnimation.
Desencadenadores de condición múltipleEn algunos escenarios puede ser interesante
que un desencadenador se ejecute cuando se cum-pla más de una condición. Esto es factible utili-zando las etiquetas MultiTrigger y Condition, per-tenecientes a Style, las cuales nos permiten defi-nir un desencadenador compuesto por varias con-diciones, que sólo será aplicado si todas ellas secumplen.
En el fuente 25 creamos un estilo de este tipo, enel que el control al que se asigne deberá cumplir trescondiciones para que dicho estilo se active.
La figura 12 muestra esta ventana en ejecución,con el estilo activo sobre el control.
Una variante de este desencadenador lo constitu-ye el MultiDataTrigger, que como su nombre indicase aplica a los desencadenadores de tipo DataTrigger,que muestran los miembros de un objeto, como vemosen el fuente 26.
En el fuente 26, el estilo será aplicado a unDataTemplate siempre que las propiedades del objetoEmpleado cumplan las dos condiciones definidas en elMultiDataTrigger.
</Style> Cerrando estiloY llegamos al final de este artículo en el que nos
hemos dedicado a repasar los principales aspectosde los estilos en XAML, el nuevo lenguaje de mar-cado para la creación de interfaces de usuario enWPF. Confiamos en haber despertado en el lectorla curiosidad e interés por esta nueva e interesantetecnología, en la que a buen seguro nos veremoscompletamente inmersos en un plazo no muy lar-go de tiempo.
dotN
etM
anía
<<
36
dnm.futuro<<
Fuente 26
<Style x:Key=”styEtiqueta”><Style.Triggers><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding=”{Binding Path=Codigo}” Value=”895” /><Condition Binding=”{Binding Path=Nombre}” Value=”Vicente”
/></MultiDataTrigger.Conditions>
<Setter Property=”Control.Background” Value=”Violet” />
</MultiDataTrigger></Style.Triggers>
</Style>
Fuente 25
<Window ….><Window.Resources><Style x:Key=”styVariasCondiciones”><Style.Triggers><MultiTrigger><MultiTrigger.Conditions><Condition Property=”Text”
Value=”Impresora”></Condition><Condition Property=”IsMouseOver” Value=”True”/><Condition Property=”Background” Value=”Lavender”/></MultiTrigger.Conditions>
<Setter Property=”Control.FontSize”Value=”18”></Setter>
<Setter Property=”Control.Foreground”Value=”Violet”></Setter>
</MultiTrigger></Style.Triggers>
</Style></Window.Resources>
<Canvas><TextBoxCanvas.Left=”10”Canvas.Top=”10”Background=”Lavender”Height=”50”Width=”150”Style=”{StaticResource styVariasCondiciones}” />
</Canvas></Window>
Figura 12
Un desencadenador consiste en una etiquetacon el nombre Trigger, definida dentro de un
estilo, que aplicará los asignadores que contiene siempre y cuando se cumpla la condición definida en el desencadenador
❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 65,00€ IVA incluido y recibir el CDVolumen 2 con los ejemplares desde el 12 al 22 en formato PDF de alta calidad de forma gratuita. Si su dirección está fuera deEspaña el precio es de 65,00€ transporte incluido (más información sobre envíos internacionales en www.dotnetmania.com)
❑ Deseo que me envíen los números atrasados marcados según el precio de portada. Otros:
FORMA DE PAGO❑ Talón nominativo a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:
La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia)
❑ Domiciliación Bancaria (con renovación automática, previo aviso)Indique su número de cuenta:
❑ Tarjeta de crédito❑ VISA ❑ MASTERCARDNúmero de su tarjeta: Fecha de caducidad: / (imprescindible)
Firma y/o sello
a de de 2006
DATOS DE ENVÍO
CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DATOS DE FACTURACIÓN (sólo si son distintos a los datos de envío)
CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Usted autoriza a la mecanizaciónde estos datos. El responsable ydestinatario de éstos es Netalia,S.L. Usted tiene derecho a acce-der a sus datos, modificarlos ycancelarlos cuando lo desee. Susdatos no serán cedidos en ningu-na de las formas posibles a terce-ras partes y no se utilizarán másque para el buen funcionamien-to de su suscripción a la revistadotNetManía y para informar-le de las actividades comercialesque realice la editorial Netalia,S.L. Si no desea recibir informa-ción comercial de dotNetManíamarque la casilla siguiente ❑Puede enviar sus datos por Fax al 91 499 13 64, o por teléfono al 91 666 74 77,
o por email a la dirección [email protected], o también puedeenviarlos por correo postal a la siguiente dirección:
Netalia, S.L.C/ Robledal, 13528529- Rivas Vaciamadrid (Madrid)
❑ Nº13 (6,00€) ❑ Nº14 (6,00€)
Suscríbase y llévese el CD Volumen 2 GRATIS
Oferta válida hasta el 30 de junio de 2006 o hasta agotar existencias
✃
❑ Nº15 (6,00€) Nº16 (6,00€) ❑ Nº18 (6,00€) ❑ N19 (6,00€)
❑ Nº24 (6,50€)
Nº17 (6,00€)
❑ Nº25 (6,00€) ❑ Nº26 (6,50€)❑ Nº20 (8,50€) ❑ Nº21 (6,00€) ❑ Nº22 (6,50€) ❑ Nº23 (6,50€)
Detección de problemas de rendimiento enSQL Server 2000 y 2005 (III)
Qué consultas procesa mi servidor SQL Server
Este es el tercer artículo de la serie, y en él nos vamos a centrar en cómo yqué “cosas” auditar de las conexiones de usuario que llegan al servidor. Paraauditar las peticiones que realizan los clientes utilizaremos SQL Server Profiler(existente en SQL Server 2000 y SQL Server 2005).
<<SQL Server Profiler (en castellano también cono-
cido como Analizador de SQL Server) es una herra-mienta incluida con SQL Server 2000 y 2005 cuyoobjetivo principal es capturar eventos de una instan-cia de SQL Server. Los eventos se guardan general-mente en un archivo de traza o en una tabla que pos-teriormente se puede analizar o utilizar para repro-ducir series concretas de pasos con el objetivo deidentificar o diagnosticar cierto problema.
El principal uso que hacemos de la herramienta espara tener una visión de las peticiones que llegan al ser-vidor en determinados períodos de tiempo, pero la herra-mienta se puede utilizar para muchas otras cosas:• Depurar procedimientos almacenados e instruc-
ciones Transact-SQL.• Realizar pruebas de carga en distintos servido-
res mediante la reproducción de trazas grabadas.• Analizar las consultas guardando en las trazas el
plan de ejecución.• Supervisar el rendimiento de una instancia del motor
relacional, Analysis Server o Integration Services(estos dos últimos sólo en la versión 2005).
• Como mecanismo de auditoria de seguridad.
Uno de los usos que más me ha gustado de SQLProfiler en entornos de desarrollo ha sido el siguien-te: hace unos meses estuve en un cliente en el que
cada miembro del equipo de desarrollo tenía dosmonitores planos de 17 pulgadas; en un principio asu-mí que eran diseñadores o desarrolladores Web, queen una pantalla tenían el editor de código HTML deVisual Studio, y en otra el resultado. Me acerqué auno de ellos y cuál fue mi sorpresa al ver que en unapantalla tenían Visual Studio y en la otra trazas deSQL Profiler en marcha. La empresa tenía definidasunas políticas de calidad en las que el número de lec-turas realizadas por cada proceso ejecutado contra labase de datos no podía superar ciertos valores pre-viamente definidos por tabla/proceso.
En la versión 2000 de SQL Server, si necesitabasabrir una traza contra una instancia de SQL Server2000, necesitabas ser miembro del rol de servidorsysadmin; en la versión 2005, esa limitación se ha eli-minado, y tan sólo es necesario que el usuario que eje-cute la traza tenga permisos ALTER TRACE.
GRANT ALTER TRACE TO <inicio_de_sesión>
Otra de las diferencias a tener en cuenta entre lasversiones 2000 y 2005 de SQL Profiler es cómo semide la duración de los eventos. El GUI de SQLProfiler en ambas versiones muestra la duración de loseventos en milisegundos; sin embargo, en SQL Server2000, la duración se mide en milisegundos, mientrasque en la versión 2005, la medida es en microsegun-dos (1.000 microsegundos = 1 milisegundo). ¿Cuál es
Eladio Rincón
dnm.servidores.sql
SQL Server Profiler
Eladio RincónEs Director de Tecnología de
Bases de Datos de SolidQuality Learning y
colaborador habitual dedotNetManía. Es MVP en SQL
Server y uno de los fundadoresdel grupo de usuarios de SQL
Server en España GUSE.
el problema? Si el resultado de la traza se guardacomo fichero de traza XML, o como tabla de basede datos, la duración se guardará como microsegun-dos, en lugar de los milisegundos que “muestra” elinterfaz gráfico.
Además, cuando en la versión 2000 estás seleccio-nando los eventos y columnas a registrar en la traza,resulta arduo seleccionar las columnas apropiadas,aún cuando el proceso se encuentra bien documen-tado en los libros en pantalla (BOL). Personalmente,en la versión 2000 usaba una “chuleta” que me pasóhace ya tiempo mi buen amigo Fernando G.Guerrero (en la lista de recursos al final del artícu-lo tiene la URL para bajarse la “chuleta-Excel” (Listade Eventos/Columnas en SQL Server 2000)). Para hacermás sencilla la selección de las columnas, en SQLServer 2005, con cada uno de los eventos, SQLProfiler nos muestra cuáles son las columnas quedevuelven información para cada evento. Observa enla figura 1 cómo para el evento SQL:StmtStarting lascolumnas CPU, Reads, Writes y Duration no están dis-ponibles. Como truco, podríamos definir siempre lastrazas con el SQL Profiler de la versión 2005, y ele-gir la versión de SQL Server a la hora de grabar ladefinición de la traza.
Como recomendación general, no debe usarseSQL Profiler en el propio servidor de base de datosporque la ejecución de la herramienta causa unapequeña sobrecarga en el servidor, que dependiendodel tipo de sistema será asumible en mayor o en menormedida. De mi propia experiencia, yo nunca he eje-cutado SQL Profiler en el propio servidor.
Crear trazas con SQL Profiler para no usar con elinterfaz gráfico
No voy a explicar cómo crear trazas para usardesde el interfaz gráfico porque en la documenta-ción del producto está bastante bien documentado.Sin embargo, voy a utilizar el interfaz gráfico paracrear trazas que luego ejecutaremos directamente
en el servidor mediante sentencias Transact-SQL.¿Y para qué crear trazas desde el interfaz gráfico yluego no ejecutarlas desde el propio interfaz? ¿Habráque saberse un montón de parámetros de memoria?¡La “chuleta-Excel” esta vez debería ser de un tama-ño considerable!
La respuesta es que ese mecanismo es menosintrusivo para el sistema: como veremos, el scriptTransact-SQL, tras ejecutarse en el servidor, registralos eventos seleccionados en el destino que hayamoselegido (normalmente un fichero de traza en unidadde red local al servidor).
¿Y cómo lo hacemos sin tener que aprender unmontón de procedimientos almacenados y paráme-tros? Dividiremos el proceso en cuatro pasos:1. Creamos una traza de SQL Profiler en nuestra
máquina local con los eventos que deseamos cap-turar; para ello:a. Elegimos la opción “New Trace”, en el menú
“File”.b. Seleccionamos los eventos que nos interesan.c. Ejecutamos la traza, e inmediatamente la para-
mos porque nuestro objetivo es el script de cre-ación de la traza, no la ejecución de la trazadesde las herramientas gráficas.
d. En el menú “File”, menú “Export”, “ScriptTrace Definition”, y elegimos “For SQLServer 2005”.
2. Una vez guardado el fichero de definición detraza, vamos a ver algunos de los parámetros deutilidad.a. En la cabecera del fichero tendremos algo
como lo siguiente:
-- Create a Queuedeclare @rc intdeclare @TraceID intdeclare @maxfilesize bigintset @maxfilesize = 5
El parámetro @maxfilesize indicará cuál seráel tamaño máximo que tendrá el fichero don-de se guardarán los resultados de la traza; elvalor se expresa en megabytes, y su valor pordefecto es 5.
b. Un poco más abajo, el fichero contiene:
exec @rc = sp_trace_create @TraceID output, 0,N'InsertFileNameHere', @maxfilesize, NULL
if (@rc != 0) goto error
Donde deberás reemplazar InsertFileNameHerepor el nombre y ruta del fichero de traza.Como recomendación, deberías guardar elfichero en una unidad física diferente a las uni-dades físicas donde están los ficheros de lasbases de datos.
Figura 1
dotN
etM
anía
<<
39
dnm.servidores.sql<<
dotN
etM
anía
<<
40
dnm.servidores.sql<<
c. Un poco más abajo, verás muchas ejecucionesdel procedimiento almacenado de sistemasp_trace_setevent, que lo que hace es precisa-mente definir los eventos y columnas que for-marán parte de la traza.
d. Casi al final del fichero está la sección para esta-blecer filtros para las trazas; la recomendaciónsería utilizar algún filtro en el GUI para crearla traza, y luego “ajustar” los valores a las nece-sidades concretas. Por ejemplo:
set @bigintfilter = 250000exec sp_trace_setfilter @TraceID,
13, 0, 4, @bigintfilter
Esta sentencia definiría un filtro de 250.000microsegundos; recuerde lo comentado ante-riormente sobre los milisegundos de la herra-mienta y los microsegundos “reales”.
3. El paso final sería la ejecución del script en el ser-vidor SQL Server.
4. Para comprobar o modificar el estado de la tra-za, existen funciones definidas de sistema y pro-cedimientos almacenados de sistema:a. Para recuperar información de todas las tra-
zas activas; la columna traceId es el identifi-cador de la traza <id_traza>:
-- Enumerar las trazasSELECT * FROM :: fn_trace_getinfo(default)
b. Para arrancar una traza:
-- Arrancar una trazaEXEC sp_trace_setstatus <id_traza>,1
c. Para parar una traza:
-- Parar una trazaEXEC sp_trace_setstatus <id_traza>,0
d. Para cerrar y borrar una definición de traza(para poder hacerlo, primero se debe haberparado la traza):
-- Cerrar y borrar una trazaEXEC sp_trace_setstatus <id_traza>,2
Tipos de eventos
Cuando llegamos al sitio del cliente, la primera tra-za de SQL Profiler que ejecutamos en el servidor sue-le ser para tener una imagen completa de todas las peti-ciones que llegan al servidor. Solemos jugar con untamaño del fichero que raras veces supera los 50megabytes de tamaño máximo. Evidentemente, cuan-ta más actividad tenga el servidor más rápido se llena
el fichero: me he encontrado con trazas dispares, unasllenaban ficheros de 20 megabytes en 30 segundos yotras con ficheros de 10 megabytes que se llenaban en15 minutos.
Tras esta primera imagen, y después de analizarla traza, solemos crear otra traza ya con filtros espe-cíficos basados en las necesidades de auscultacióndetectadas; en este segundo grupo de trazas, solemosfiltrar por base de datos (DatabaseId), duración(Duration), lecturas (Reads), escrituras (Writes), y/oaplicación (ApplicationName).
En la documentación del producto (libros en pan-talla, BOL), existe una lista completa de los eventosque captura SQL Profiler; en lugar de enunciar todosy cada uno de ellos, muestro una lista de los que con-sidero más significativos:
Eventos de procedimientos almacenados(StoredProcedures)
• RPC:Completed: registra la finalización de la ejecu-ción de un procedimiento remoto (RPC).
• SP:StmtCompleted: registra la finalización de cadauna de las sentencias Transact-SQL ejecutadas enprocedimientos almacenados.
• SP:Completed: registra la finalización de la ejecu-ción de un procedimiento almacenado.
Eventos de Transact-SQL (SQL)
• SQL:BatchCompleted: registra la finalización de unproceso por lotes.
• SQL:StmtCompleted: registra la finalización de unasentencia Transact-SQL.
Además de los eventos terminados en Completed,existen los eventos Starting que corresponden al ini-cio de la ejecución. Normalmente utilizo los eventosCompleted porque aportan información como núme-ro de lecturas, escrituras, duración, etc. que no ofre-cen los eventos Starting. Los eventos Starting queuso los suelo utilizar para localizar procesos/senten-cias involucradas en bloqueos.
Cuando selecciones los eventos, deberás ser cui-dadoso: prueba a ejecutar el siguiente código:
exec sp_helpgoselect @@version
estableciendo en el SQL Profiler los siguienteseventos SP:StmtCompleted, SQL:BatchCompleted,SQL: StmtCompleted. El resultado puede verse enla figura 2.
Las líneas marcadas en azul corresponden a lassentencias Transact-SQL que se ejecutan dentro delprocedimiento almacenado sp_help; además, fíjateque hay dos entradas para sp_who; ¿por qué? Porque
dotN
etM
anía
<<
41
dnm.servidores.sql<<
la ejecución del procedimiento almace-nado es ejecución de una sentenciaTransact-SQL, y también un procesopor lotes.
Advertencia sobre los filtros
Aunque puede parecer trivial, losfiltros se evalúan sólo para los even-tos que exponen la columna filtrada:por ejemplo, una traza que filtra lasconsultas cuya duración sea superiora 500 milisegundos con el eventoRPC:BatchCompleted) y además regis-tra el plan de ejecución de las consul-tas (ShowPlan All, o ShowPlan XML).Como el plan de ejecución no exponela columna Duración, el resultadoincluirá las consultas cuya duraciónfue superior a 500 milisegundos, yademás todos (sin ningún filtro) losplanes de ejecución de las consultasque llegaron al servidor.
Consultar las trazas desde Transact-SQL
Los ficheros de traza se puedenabrir perfectamente desde SQLProfiler; sin embargo, en multitud deocasiones necesitarás buscar informa-ción en la traza, y para ello qué mejorque utilizar Transact-SQL. El ficherode traza se puede consultar directamen-te usando la función definida por el sis-tema fn_trace_gettable; la función tie-ne como argumento el nombre delfichero de traza a leer:
SELECT *FROM ::fn_trace_gettable ('X:\SQLHealth\Traza_1.trc',default)
Donde X:\SQLHealth\Traza_1.trc es el fiche-ro de traza a consultar.Sin embargo, como elfichero de traza no se vaa consultar solo una vez,suele ser más fácil “vol-car” el contenido delfichero a una tabla detrabajo y consultardirectamente la tabla detrabajo:
SELECT * INTO [bd].[dbo].[Traza]FROM ::fn_trace_gettable(
'X:\SQLHealth\ Traza_1.trc',default)
Y realizar consultas, agrupaciones,borrados, búsquedas directamentesobre la tabla [Traza].
Búsqueda de patrones de ejecución deconsultas
Una vez guardadas las trazas, elobjetivo es encontrar “patrones de eje-cución” de consultas y su relación conlas operaciones de E/S y el uso de CPU.El objetivo final es conseguir algocomo:• El xx por ciento de las consultas
que contiene la traza correspon-
den a la llamada al procedimientoalmacenado…
• El xx por ciento de las lecturas reali-zadas corresponden a consultas queacceden a los objetos (tablas/vistas)…
• El xx por ciento del tiempo utili-zado por las consultas fueronhechas usando el patrón de con-sulta…
¿En qué consistirá un “patrón de eje-cución”?
Veamos un ejemplo con el que severá más claro: dada la tabla 1 de eje-cuciones (agrupado por sentencia SQLejecutada), podemos ver que el proce-dimiento almacenado sproc_obtener_pedido se ha ejecutado un total de 36veces realizando un total de 15.340 lec-turas; nuestro objetivo será tener lainformación de la forma que se mues-tra en la tabla 2.
¿Y para qué hacer esas agrupaciones?
Para obtener “agrupaciones de eje-cuciones” del orden de las que puedenverse en la tabla 3.
SQL Ejecuciones CPU Lecturas Escrituras
EXEC sproc_obtener_pedido '221231' 10 120 1.800 0
EXEC sproc_obtener_pedido '113' 2 20 2.000 0
EXEC sproc_obtener_pedido '55665' 4 52 9.100 0
EXEC sproc_obtener_pedido '77689' 4 56 1.400 0
EXEC sproc_obtener_pedido '921002' 1 15 0 0
EXEC sproc_obtener_pedido '834016' 15 120 1.040 0
Tabla 1
Figura 2
SQL Ejecuciones CPU Lecturas Escrituras
EXEC sproc_obtener_pedido '#' 36 383 15.340 0
Tabla 2
NOTA
Un buen comienzo para familia-rizarse con los eventos es reali-zar pruebas en el entorno dedesarrollo con las plantillas, yrevisando la información de loslibros en pantalla.
][
Fíjate que en lugar de perdernos en el“bosque”, de tener registrado que patrón_1ha tenido una serie de argumentos duran-te su ejecución, nos centramos en datos“generales”: el patrón_1 se ha ejecutado513 veces, y sus números totales hansido…
Lo que resumiendo la información dela tabla nos viene a decir lo siguiente:• Más del 79% de las lecturas (opera-
ciones de E/S) realizadas en el perío-do de tiempo corresponden a la eje-cución del patrón patrón_1.
• Casi el 24% del uso de CPU en elperíodo de tiempo fue realizado porla consulta de patrón_2.
• Más del 30% de la duración de las eje-cuciones Transact-SQL fue consumi-do por patrón_1 y patrón_2.
De esta forma identificamos patronesque afectan mucho al comportamientogeneral del sistema, y que modificandoligeramente su comportamiento (indexa-ción, análisis de la consulta, rediseño deproceso, etc.) tendrán un impacto muygrande en todo el sistema. ¿Qué pasaríasi encontramos que la consulta asociada apatrón_1 tiene índices no apropiados yprobamos en entornos similares a produc-ción (servidores de preproducción, etc.)que la creación de un índice reduce elnúmero de lecturas realizadas al 2% deltotal? Pues el escenario habría cambiado
totalmente y la consulta en este caso esmuy posible que deje de estar entre las 2-3 primeras que más lecturas realizan; ade-más, es muy posible que la duración totalse reduzca y ello conlleve la posibilidad degestionar más peticiones concurrentemen-te. En definitiva, el escenario será diferen-te y habrá que analizar de nuevo su impac-to (¿y mejoras?) en el funcionamiento delsistema.
¿Y cómo consigues agrupar las sentenciasde esa forma?
La columna TextData de la tabla don-de hemos guardado la traza contiene lasentencia Transact-SQL que se estabaejecutando en ese momento; la senten-cia como hemos visto antes era del tipoEXEC sproc_obtener_pedido '221231'. Elobjetivo será reemplazar “221231”, por“#” que actuará como “generalizador”cuando se hagan las consultas de agru-pación (GROUP BY).
Para calcular el valor “genérico”:1. Añadimos a la tabla una columna lla-
mada Sql_Signature, que será el cál-culo para convertir la columnaTextData en su valor “generalizado”.
2. Creamos una función definida por elusuario con .NET Framework querecorrerá cada columna TextData, y laconvertirá en su valor “generalizado”.
3. Ejecutaremos consultas del tipo:
SELECTcount(*) '#',T.databaseid,T.sql_signature,SUM(T.duration) duration, SUM(T.reads) reads, SUM(T.writes) writes, SUM(T.cpu) CPU,
FROM dbo.[Traza] TGROUP BY
T.Databaseid,T.sql_signature
ORDER BY SUM(T.reads) DESC
Donde depen-diendo de tipos depatrones, ordena-remos la consultapor duración, lec-turas o escrituras.Normalmentesolemos ordenarel resultado pornúmero de lectu-ras para identificar
los procesos/procedimientos almacena-dos que más lecturas realizan. La solucióna adoptar puede ser desde crear índicesnuevos, eliminar índices redundantes,modificar estrategias de indexación oincluso modificar los procesos asociados(procesos de negocio). En caso de encon-trarnos con muchas esperas debido a escri-turas en el registro de transacciones (recor-dar del primer número de la serie el tipode espera WRITELOG), analizaríamos lospatrones más usados para realizar escritu-ras. En caso de sólo encontrarnos conduraciones altas, es muy probable que ellovenga derivado por altas esperas por blo-queos (esperas del tipo LCK_*), o por ope-raciones muy pequeñas durante muchotiempo (los tan odiados cursores).
ConclusionesHemos visto una técnica “diferente”
para capturar trazas de SQL Profiler. Elobjetivo de capturar estas trazas es obte-ner qué consultas llegan al servidor y cre-ar una imagen de qué patrones de consul-tas se procesan. El objetivo es detectar quépatrones son los más costosos y atacar elproblema de raíz. Si mejoras un grupo deconsultas que suponen el 25% del total delas operaciones de lectura que se realizanen el servidor, habrás enfocado tus esfuer-zos en resolver probablemente uno de loscuellos de botella de tu sistema.
dotN
etM
anía
<<
42
dnm.servidores.sql<<
Referencias
SQL Server Profiler Tips. Página Web de BradM. McGehee, MVP en SQL Server.http://www.sql-server-performance.com/sql_ser-ver_profiler_tips.asp
Lista de Eventos/Columnas en SQL Server 2000.Página Web de Eladio Rincón Herrera.http://siquelnet.etraducciones.com/default.aspx?Tema=MSSQL&Seccion=ADM&Articulo=012.xml
Ejec. SQL Tiempo Lecturas Escrituras CPU Tiempo Lecturas Escrituras CPU
513 patrón_1 3,087 1,044,231 0 0 28.89% 79.06% 0.00% 0.00%
512 patrón_2 537 71,680 0 531 5.03% 5.43% 0.00% 23.27%
2,109 patrón_3 106 53,526 0 0 0.99% 4.05% 0.00% 0.00%
512 patrón_4 207 21,381 32 0 1.94% 1.62% 7.71% 0.00%
2,474 patrón_5 135 15,166 0 0 1.26% 1.15% 0.00% 0.00%
... ... ... ... ... ... ... ... ... ...
17,123 Total 10,684 1,320,848 415 2,282 100% 100% 100% 100%
Tabla 3
NOTA
También se pueden crear trazaspara que directamente se guardenen una tabla, en lugar de un fiche-ro; sin embargo, tenderemos a evi-tar guardar las trazas en sistemas deficheros directamente relacionadoscon los ficheros de bases de datos.
][
Es evidente que quien se acerca por primera veza Visual Studio 2005 y quiere hacer cualquier tipo deaplicación, particularmente una de acceso a datos, yse encuentra que existen asistentes (wizards) para ayu-darle a crear la aplicación, no dudará en usarlos.Además, quedará totalmente impresionado por la“belleza” del formulario resultante: botones al estilode Office 2003, un navegador de registros, unos boni-tos botones para añadir, eliminar y guardar los datos(ver figura 1). Vamos, ¡que no hay quien se resista!
Pero debemos recordar que asistente significa eso:que nos asiste, lo cual no significa que haga milagros.El asistente de acceso a datos nos va ayudando en lacreación de todo lo necesario para que nuestro pro-yecto sepa encontrar los datos que queremos usar,para finalmente prepararlo todo y dejarlo listo y ope-rativo. Y como veremos en un momento, lo único quetenemos que hacer para lograr esto es pulsar variasveces el botón “Siguiente”. Qué bien, ¿no? Pues sí,muy bien. Pero (lamentablemente, siempre hay unpero) el código generado por el asistente, pues... enfin... que precisamente para el que se inicia no es elidóneo. Al menos si lo queremos personalizar poste-riormente.
Llegados a este punto, debemos recordar que losasistentes nos ayudan a hacer las cosas que no sabe-mos hacer. Bueno, esto no es del todo cierto, ya quetambién podemos usarlos para que nos faciliten lastareas repetitivas y nos ayuden a generar el códigonecesario para lo que en ese preciso momento nece-
sitamos. Pero por regla general, los usamos cuandono tenemos demasiado claro qué es lo que hay quehacer. Y esto es lo que pasa con el asistente de acce-so a datos de Visual Studio 2005; que sí, nos generauna aplicación en la que solo necesitamos unos pocosclics de ratón, pero casi seguro que ésta no tiene todala funcionalidad que esperaríamos que tuviera. Porejemplo, si miramos la barra de botones de la apli-cación mostrada en la figura 1, podemos pensar queel botón “Guardar” (el que tiene el icono del dis-quete) sirve para guardar las modificaciones que rea-licemos. En este caso, ese botón sirve para que losdatos se almacenen físicamente en la base de datos;es decir, trabajamos con los datos en modo desco-nectado, y cuando ya queremos que se guarden en labase de datos, es cuando tendremos que pulsar enese botón. Sabiendo esto, nos podemos llegar a plan-tear dos preguntas, la primera de las cuales sería: siese botón sólo sirve para guardar los datos en la basede datos, ¿cada vez que añadimos un nuevo registrotenemos que conectarnos para guardarlo?
La respuesta es no, ese botón solo hay que pul-sarlo cuando ya hayamos terminado de añadir todoslos datos que tengamos que añadir. Entonces es cuan-do entra en juego la segunda pregunta: ya que si esoes así, ¿cómo se guardan cada uno de los datos queintroducimos en modo desconectado? La respuestaes: automáticamente, sí, ¡no tenemos que hacer nadapara que se guarden!
Si el lector ha leído el artículo anterior de la serie(dotNetManía nº 25), recordará que una de las cosas
Acceso asistido a datos con ADO.NET 2.0 y Visual Studio 2005
Como ya adelantamos en el artículo anterior, en éste veremos cómo utilizarlos asistentes de Visual Studio 2005 relacionados con el acceso a datos. En par-ticular, veremos los pasos necesarios para crear formularios tanto para intro-ducir datos como para mostrar el resultado de la llamada a un procedimientoalmacenado de SQL Server 2005.
<< ¿Asistentes? ¡Sí, gracias!
dnm.inicio.fundamentos
Guillermo “Guille” Som
dnm.incio.taller
Guillermo “Guille” Somes Microsoft MVP de Visual Basic
desde 1997. Es redactor dedotNetManía,miembro de Ineta
Speakers Bureau Latin America,mentor de Solid Quality LearningIberoamérica y autor del libroManual Imprescindible de Visual
Basic .NET.http://www.elguille.info
dotN
etM
anía
<<
43
dotN
etM
anía
<<
44
dnm.inicio.taller<<
que allí comentaba era que a mí particu-larmente no me gusta este tipo de auto-matizaciones; por lo tanto, tantas admi-raciones por mi parte hay que tomárse-las con calma. Y no es porque el que estascosas se hagan de forma automática, esdecir, sin participación del programador,esté mal. No, lo que ocurre es que si sonautomáticas, no controlamos lo que pasa,o al menos las cosas pasan sin que noso-tros en un principio nos enteremos deque están pasando. Y esto, sinceramen-te, para una aplicación creada para salirdel paso está muy bien, pero si lo quequeremos hacer es algo más, digamos,profesional, no deberían bastarnos talesautomatizaciones.
Veamos uno de los problemas quepueden surgir con este tipo de automa-tizaciones.
Supongamos que el lector tiene la cos-tumbre de crear sus tablas con un índiceautonumérico; es decir, queremos man-tener un campo en la tabla cuyo valor segenere automáticamente para cada nue-vo registro que creemos. Ese tipo de cam-po tiene la cualidad de que sus valores sonúnicos; es decir, no puede haber dos regis-tros en la tabla con el mismo valor.
Utilizando el asistente de acceso adatos, creamos un formulario como elde la figura 1. Es posible que queramossaber qué código es el que se ejecutacuando el usuario pulsa en “Guardar”;lo lógico en estos casos es que hagamosdoble clic en el botón correspondientede la barra de botones para que VisualStudio nos muestre el código, que seríacomo el que podemos ver en el fuente1. No es necesario que describamos elcódigo ahora; lo que interesa es que pul-sando en ese botón veremos el códigoque se utilizará.
Como somos curiosos, es posibleque también nos interese ver el códigoque hay detrás del botón “Nuevo” (elque se ejecuta al pulsar en el botón conel icono de la cruz). Como no vemos elcódigo en el fichero del formulario,hacemos lo mismo de antes: nos vamosal formulario en modo de diseño, hace-mos doble clic y... no se nos muestranada. Bueno, sí, el método pero vacío,tal como lo vemos en el fuente 2.
Y como vemos que está en blanco,podríamos pensar que hay que rellenarlode código. Para ello, nos armamos devalor y buscamos la forma de hacer queeso funcione como queremos. En esabúsqueda encontramos que en la tablaPrueba del DataSet autogenerado existeun método llamado AddPruebaRow condos sobrecargas, una en la que se pue-den especificar los datos individuales decada una de las columnas de la tabla. Portanto, podríamos pensar que si usamosel código mostrado en el fuente 3, yatenemos la forma de añadir un nuevoregistro a la tabla.
Ahora que estamos seguros de queya tenemos el código para añadir nue-vos registros que el asistente “seolvidó” de añadir, ejecutamos la apli-cación (porque nuestra curiosidad noshizo examinar el código antes de pro-bar si ya funcionaba). Pulsamos en el
botón de añadir, y todo bien, al menosaparentemente, ya que se muestran losdatos que hemos indicado en los argu-mentos del método AddPruebaRow.Rellenamos los campos que estánvacíos, pulsamos en el botón“Guardar”, y aparentemente todo vabien. Pero si nos fijamos bien en lafigura 1, seguramente detectaremosalgo que no es normal; ahora veremosde qué se trata.
Si ahora volvemos a pulsar en elbotón “Nuevo” para crear un nuevoregistro y posteriormente pulsamos enel botón de guardar... esta vez la cosa noirá tan bien como antes. Lo que ocu-rrirá es que recibiremos el error quevemos en la figura 2, indicándonos que
Fuente 1. El código del método de guardar los datos
private void pruebaBindingNavigatorSaveItem_Click(object sender, EventArgs e){
this.Validate();this.pruebaBindingSource.EndEdit();this.pruebaTableAdapter.Update(this.pruebaGuilleCSDataSet.Prueba);
}
Fuente 2. El método vacío de añadir nuevo registro
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e){}
Fuente 3. El método "supuestamente" para añadir nuevos registros
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e){
pruebaGuilleCSDataSet.Prueba.AddPruebaRow("nuevo", "", DateTime.Now , "");}
Figura 1.Guardando en la base dedatos los datos introducidos
Dejemos que trabajen losasistentes y así nos evitaremos algunos
problemas
dotN
etM
anía
<<
45
dnm.inicio.taller<<
el ID debe ser único y que ya existe un registro conese mismo ID (3).
¿Qué es lo que está ocurriendo? Pues muy claro,que estamos duplicando código, y por tanto estamoscreando dos registros cada vez que pulsamos en elbotón “Nuevo”. Si nos fijamos en la figura 1, vere-mos que en la caja de texto que hay en la barra debotones se muestra el número 2 cuando en realidadsólo habíamos creado un registro. La primera vez,cuando la base de datos estaba vacía, no había pro-blemas, ya que se crean dos registros, pero al no exis-tir ninguno, esa duplicidad la gestiona bien, pero siya tenemos registros, sí que recibiremos ese error.
¿Qué debemos sacar en claro de todo esto? Quesi usamos el asistente, dejemos al asistente hacer sutrabajo y adaptémonos a lo que ha hecho. Si lo quebuscamos es escribir nosotros el código, entonces lomejor es no usar el asistente y escribir todo el códigoprácticamente de forma manual. De cómo escribirnuestro código “a mano” nos ocuparemos en el pró-ximo artículo; en éste nos vamos a centrar en los asis-tentes, pero... dejemos que trabajen ellos y así nos evi-taremos algunos problemas.
Asistentes para introducir datos y crearconsultas
A continuación, vamos a usar el asistente de acce-so a datos de Visual Studio 2005 para crear una aplica-ción como la que hemos estado comentando. Despuéscrearemos un procedimiento almacenado (stored proce-dure) de SQL Server en el que se requiere un paráme-tro de fecha, y usaremos el asistente para que cree unformulario en el que podamos realizar consultas basán-
donos en ese procedimiento almacenado. Empecemospor el formulario de introducción de datos.
Crear un formulario de acceso a datos de formaasistida
Para seguir los pasos que vamos a indicar ahora, nece-sitaremos tener una base de datos llamada PruebaGuilleen la instancia local de SQLEXPRESS. Esa base de datostendrá una tabla llamada Prueba, y la creación de la basede datos y la tabla la podemos efectuar por medio de lautilidad aquí descrita y que puede descargar con el mate-rial de apoyo de este artículo.
Lo primero que haremos es crear un nuevo pro-yecto del tipo “Formulario de Windows”. Una vezque tengamos el formulario en modo de diseño, selec-cionamos del menú “Datos” la opción “Agregar nue-vo origen de datos”. Esto hará que se muestre el asis-tente de acceso a datos.
Empezaremos por indicarle al asistente el origen delos datos que queremos usar. Se nos dará a elegir entretres opciones: “Base de datos”, “Servicio Web” y“Objeto”; en nuestro caso, será una base de datos.
El siguiente paso es elegir una de las conexionesque pudiéramos tener o bien crear una nueva (figura3). Nosotros elegiremos una nueva, lo que resultará enuna nueva ventana en la que podremos indicar la basede datos que queremos usar. En nuestro caso, será unabase de datos de SQL Server. Si en el origen de datosno tuviésemos a la vista Microsoft SQL Server(SqlClient), tendremos que pulsar en el botón “Cambiar”
y aparecerá una nueva ventana en laque podremos indicar el tipo de basede datos a usar. Si normalmente vamosa usar conexiones de SQL Server,podemos marcar la opción “Utilizarsiempre esta selección”, lo que haráque de forma predeterminada semuestre la ventana de conexión parael tipo de base de datos que hayamosseleccionado, pero en cualquier
Figura 2. Error al crear un registro con un ID que ya existe
Para utilizar la base de datos queestamos usando en este artículo (u otrasbases de datos con una tabla que tengaesa misma estructura),en el código queacompaña a este artículo se adjunta unapequeña utilidad que nos permite cre-ar tanto la base de datos como la tablay el procedimiento almacenado usados
en los ejemplos. Esa base de datos lapodemos crear en cualquiera de lasinstancias de SQL Server que tenga-mos instaladas en nuestro equipo. Sisólo disponemos de SQL Server 2005Express Edition, la instancia tendrá elformato nombreEquipo\SQLEXPRESS o(local)\SQLEXPRESS.
Una utilidad para crear la base de datos y tabla de ejemplo
El asistente nos genera una aplicación con solo unos pocos clics de
ratón,pero casi seguro que ésta no tiene toda la funcionalidad que
esperaríamos que tuviera
momento podremos seleccionar otro tiposimplemente pulsando en el botón“Cambiar”.
Una vez que tenemos seleccionadoel origen de datos, que en nuestro casoserá de SQL Server, tenemos que indi-car la instancia de SQL Server en laque está la base de datos, y una vezhecho esto, podemos seleccionar labase de datos a usar. Para comprobarque todo funciona, podemos pulsar enel botón “Probar conexión” para estarseguros de que todo va bien. El nom-bre de la conexión lo genera el asistentede forma automática, tal como vemosen la figura 3.
El siguiente paso es guardar la cade-na de conexión para conectarse a la basede datos; ese nombre sí lo podemosespecificar, y se almacenará en la confi-guración de la aplicación.
A continuación, seleccionamos lafuente de datos; en este caso será de latabla Prueba, y podemos seleccionar loscampos que en realidad nos interesen,ya que no es imprescindible seleccio-narlos todos, como es nuestro caso(figura 4).
Una vez que hemos hecho la selec-ción de la tabla (o tablas, si tuviésemosmás), pulsamos en “Finalizar”. Y vere-mos que ahora tendremos una nuevaventana acoplada con el cuadro deherramientas y el explorador de servi-dores. En esa nueva ventana tendremoslos orígenes de datos que hayamos agre-gado en nuestro proyecto.
Lo siguiente será usar ese origende datos. Para ello, seleccionamos latabla a usar y la arrastramos hasta elformulario. De forma predetermina-da, se creará un DataGridView para tra-bajar con esos datos, pero si lo que nosinteresa es obtener cajas de texto paracada uno de los campos de la tabla taly como hemos visto anteriormente,tendremos que pulsar en la lista des-plegable que hay junto al nombre dela tabla y seleccionar “Detalles” (figu-ra 5). Una vez hecho ese cambio,arrastramos la tabla al formulario yveremos que se añaden los controlescorrespondientes a cada uno de loscampos (o columnas) que selecciona-mos anteriormente, además de la barrade botones para la navegación entrelos registros y la creación y elimina-ción de registros. El aspecto del for-mulario será el que se muestra en lafigura 6.
Si queremos cambiar el aspecto delos controles, podemos hacerlo sinmayor problema. Por ejemplo, podría-mos hacer MultiLine la caja de texto parael “Comentario” y cambiarle el tamaño.También podemos anclar los controlespara que se ajusten al nuevo tamaño delformulario, etc.
Si ahora ejecutamos el programa(sin añadir ni una sola línea de códi-go como hicimos antes), veremos que
todo funciona bien, y podremos empe-zar a añadir nuevos datos a la tabla(figura 7).
El único código que existe es el delDataSet “tipado” que se ha creado,además de un poco de código en el pro-pio formulario, que es el que se encar-ga de llenar los datos al cargarse el for-mulario (evento Form_Load) y el códigodel botón “Guardar”; el resto de la fun-cionalidad es totalmente transparentepara nosotros.
dotN
etM
anía
<<
46
dnm.inicio.taller<<
Figura 3. Seleccionar una conexiónexistente o crear una nueva
Figura 4. Selección de la tabla o tablasa usar con esta conexión
Figura 5. Selección de la forma en la que se mostrarán los datos
Figura 6. El asistente añade las eti-quetas y controles adecuados
Figura 7. Sin escribir nada, la aplicaciónestará totalmente operativa
Crear un formulario de consulta conel asistente
Para finalizar este artículo, vamos autilizar el asistente para crear un nuevoDataSet, el cual usaremos para accedera un procedimiento almacenado de labase de datos. Ese procedimiento alma-cenado tiene el código mostrado en elfuente 4. Como podemos ver, recibe unparámetro que es la fecha a partir de laque queremos mostrar los datos que ten-gamos en la tabla Prueba.
Los pasos que tendremos que darserán casi los mismos que hemos vistoanteriormente; al menos hasta llegar ala selección de la conexión, donde pode-mos usar la que ya tenemos o bien cre-ar una nueva. En nuestro caso, selec-cionaremos de la lista desplegable lacadena de conexión que ya tenemos, talcomo vimos en la figura 3.
Y finalmente, tal como vemos en lafigura 8, seleccionamos el procedi-miento almacenado y pulsamos en“Finalizar”.
La información a mostrar estaráen otro formulario; por tanto, debe-mos añadir un nuevo formulario al
proyecto y ese será el queusemos para arrastrar elorigen de datos al formula-
rio. En este caso, lodejaremos comoDataGridView (elvalor predetermi-nado), y el aspectodel formulario seráel mostrado en lafigura 9.
Si este DataGridView sólo lo queremos usar para mos-trar los datos, sin permitir que semodifiquen los registros existentes nique se añadan nuevos, debemos selec-cionar las opciones correspondientesen las propiedades del control, quecon Visual Studio 2005 son más fáci-
les de asignar.Si nos fijamos en la mencionada
figura, veremos que hay una casilla enla que escribiremos la fecha que quere-mos buscar y al pulsar en el botón “Fill”(cuyo texto podemos cambiar) se relle-nará el DataGridView con los datoscorrespondientes.
Por último, para que este nuevo for-mulario se pueda mostrar, podemos aña-dir un nuevo botón a la barra de boto-nes del formulario de inicio, para que al
pulsarlo se lance el formulario de datos.El código para ello es el que podemosver en el fuente 5.
Conclusiones
Como hemos podido observar, el usode los asistentes de acceso a datos nospermite crear aplicaciones de una formabastante rápida y prácticamente sin nece-sidad de escribir ni una sola línea de códi-
go. De hecho, hemos vis-to que por culpa de laduplicidad de código,podemos hacer que elresultado final no sea elesperado.
En próximos artícu-los de esta sección segui-remos con el tratamien-to de datos usandoADO.NET 2.0, pero
prácticamente nos dedicaremos a vermás código y menos capturas de asis-tentes. En el siguiente, veremos cómohacer lo que acabamos de hacer en esteartículo, pero todo a base de código“puro y duro”, que es lo que a algunosnos gusta, aunque para ello tengamosque trabajar más. Como veremos, noserá tan complicado; al menos una vezque sepamos los pasos que tenemos quedar y las clases de ADO.NET 2.0 quetenemos que usar.
dotN
etM
anía
<<
47
dnm.inicio.taller<<
NOTA
Al utilizar el asistente para la conexión adatos, se habrá creado un DataSet “tipado” quees el que se usará para toda la gestión de esosdatos. Y es precisamente el que se utiliza a lahora de arrastrar el origen de datos al formula-rio. El nombre que le da el asistente de VisualStudio 2005 está formado por el nombre de labase de datos y la palabra “DataSet”; en nues-tro ejemplo, se llama pruebaGuilleDataSet. Siañadimos nuevos orígenes de datos desde la mis-ma base de datos, la nomenclatura será la mis-ma, pero con un número al final del nombre.
][Fuente 4. El procedimiento almacenado que
usaremos para la consulta
ALTER PROCEDURE [dbo].[StoredProcedure1]@Param1 datetimeASSELECT * FROM PruebaWHERE FechaAlta >= @Param1
Figura 8. Selección del procedimientoalmacenado a utilizar
Figura 9. El DataGridView quemostrará los datos del
procedimiento almacenado
NOTA
Si al mostrar la ventana con los orígenes dedatos no se muestran los dos DataSet, debemospulsar en el botón “Actualizar” para que serefresque la información de la ventana. ][
Fuente 5. El código para mostrar el formulario de consultas
private void tsbConsulta_Click(object sender, EventArgs e){
Form2 f2 = new Form2();f2.Show();
}
Iron Speed Designer“Generador de aplicaciones Web soltero
busca base de datos para relación esporádica”
En la era del desarrollo fugaz y las tareas repetitivas CRUD (Create,Restore,Update,Delete), Iron Speed nos ofrece su particular visión centrada en ASP.NET.Aunque amuchos ni siquiera les sonará este nombre, lo cierto es que son muchos los desa-rrolladores, empresas y organizaciones gubernamentales que lo utilizan.
<< aún está comenzando adespegar, quizás porque el entorno está completamen-te en inglés, y hasta hace poco apenas existían recursosen nuestro idioma, o tal vez porque de las primeras ver-siones existentes a la última aparecida, la 3.2.4, existenmuchas diferencias y es ahora realmente cuando la ideade ISD parece estar dando sus frutos.
ISD es una herramienta visual que genera apli-caciones Web ASP.NET preparadas para trabajarcon bases de datos; además, localizadas en el idio-ma que prefieras gracias a los ficheros de recursosaportados por los profesionales que utilizan ISD.Mediante un asistente le proporcionas la base dedatos Access, Oracle, SQL Server o MSDE, lee elesquema para crear campos, tipos, valores inicia-les y relaciones, y te genera la capa de acceso adatos y las páginas Web necesarias para interac-tuar con ella, esto es: páginas para visualizar tablas,realizar búsquedas en ellas, introducir, modificary mostrar registros. La herramienta genera todolo que necesitas para manipular la información delas tablas de la base de datos que hayas selecciona-do, en código .NET, C# o VB.NET a elegir, .NETFramework 1.1 ó 2.0, y todo, por supuesto, modi-ficable al 100%.
Versiones y característicasExisten dos versiones, la profesional y la empre-
sarial. Aquí solamente enumeraré sus característicaspor falta de espacio.
En cuanto a las páginas Web generadas, ambas ver-siones ofrecen 11 temas de diseño, páginas de mostrary editar tabla, de añadir, editar y mostrar registro, pági-nas maestro-detalle, formularios de entrada, exporta-ción de datos a formato .CSV y páginas de identifica-ción y cierre de sesión. La versión empresarial pone anuestra disposición 13 temas de diseño más y cumpli-miento de la sección 508 de accesibilidad.
En lo relativo a la capa de presentación, en cuanto acomponentes, se ofrecen paneles básicos de datos, menúsde navegación, selectores de fecha y listados de selec-ción, totales de columnas calculadas y validación básicade campos con 10 formatos diferentes. La versión empre-sarial presenta adicionalmente paneles avanzados de datosy validación avanzada de campos con 10 formatos adi-cionales. En cuanto al filtrado, ordenación y navegación,ambas versiones presentan componentes para el filtra-do y ordenación, paginación de tablas, búsquedas com-pletas de texto, controles de navegación jerarquizados y
Fco. Javier Rodríguez
dnm.laboratorio.net
Eso sí, en el mercado español
Francisco Javier RodríguezMesa es analista programador,MCP,MCAD,MCSD en .NET,
MVP de Iron Speed Designer ycreador de la comunidad en
español de ISD encomunidadISD.com. Puede visitar
su página Web enwww.fjrodriguez.com.
ISD es una herramienta visual que genera aplicaciones Web
ASP.NET preparadas para trabajar con bases de datos
seguridad basada en roles. En el área de localización einternacionalización, brinda soporte internacional deidiomas, idiomas de lectura de derecha a izquierda y fun-ciones de formateo de fechas, números y moneda.
Para la capa de acceso a datos, el producto ofrececonsultas multi-tabla, generación SQL en línea, admi-nistración de transacciones, soporte de claves ajenas,soporte de bases de datos de sólo lectura y recursospara la escalabilidad. La versión empresarial tiene otrosatractivos adicionales en este apartado, debido al sopor-te de vistas, generación de procedimientos almacena-dos, manejo de concurrencia, claves ajenas y prima-rias virtuales y soporte para aplicaciones multi-basede datos.
Ambas versiones permiten la generación de apli-caciones en C# o VB.NET, aunque la versión empre-sarial presenta adicionalmente un creador de instala-dores MSI. Y soportan Access, SQL Server en cual-quiera de sus versiones, MSDE y Oracle.
Clases baseEl secreto de ISD es explotar al máximo la heren-
cia para, por un lado, dar funcionalidad a la aplica-ción, y por otro, permitir la modificación del códigofuente generado sin perder esos cambios al regenerarla aplicación con ISD. Ello aporta una gran flexibili-dad a las aplicaciones generadas.
EntornoEl entorno te da la sensación de estar modifican-
do una página Web, y en el fondo esto es así porqueel corazón de ISD es un editor HTML. No olvide-mos que los archivos que procesa ISD para conseguirlos .ASPX son archivos HTML. Puedes modificar elHTML directamente o de forma visual en el editor(figura 1).
Barra de herramientas
En la barra de herramientas se encuentran con-troles de paneles de tabla y registro, filtrados y orde-
nación, paneles y controles básicos que puedes arras-trar directamente a una nueva página o a las que hayacreado ISD.
Explorador de aplicaciones
En esta ventana puedes ver todas las páginas quetiene la aplicación, para cambiar de una a otra páginacon un clic; las clases base, la capa de negocio, la basede datos para ver el esquema de las tablas y/o modi-ficarlo y los procedimientos almacenados.
Pestañas superiores
• Design: la vista para modificar visualmente la página.• Preview: Una previsualización de la página.• Html: el código HTML a partir del cual se gene-
rará el .ASPX. Totalmente modificable.• Aspx: de sólo lectura, el código .ASPX generado.• Code: el código code-behind de la página que está en
la vista diseño.• Files: una relación de los archivos de layout
(HTML) usados por la página para el menú, dis-posición, etc.
Asistentes y personalizaciones de código
Existen numerosos asistentes para hacerte aún másfácil modificar la aplicación generada. Algunos de losmás importantes son:
• Asistente de Aplicaciones (figura 2).
Aparte de ser el primer asistente que utiliza-remos, también podemos volver a él siempreque queramos para cambiar las característi-cas visuales y no visuales de la aplicacióngenerada. Desde aquí se seleccionará la car-peta y directorio virtual, versión de .NETFramework, lenguaje de programación, idio-
dotN
etM
anía
<<
49
dnm.laboratorio.net<<
Figura 1
Figura 2
ma de los botones y elementos visuales, temade diseño, base de datos y tablas de las quegenerar las páginas Web.
• Asistente de seguridad basada en roles (figura 3).
Tan sencillo como crear tres tablas: una de usua-rios, otra de roles y otra de usuarios-roles. Lasseleccionas en este asistente y ya tienes una apli-cación securizada, en la que puedes definir elacceso por roles tanto a páginas como a contro-les individuales.
• Asistente de panel de tabla (figura 4).
Nos servirá para seleccionar los campos que mos-traremos en la tabla, personalizar la consulta SQL,indicar los botones, campos sobre los que reali-zar búsquedas, columna por las que queremos darposibilidad a ordenar y filtrar, orden inicial de losregistros y la totalización de columnas.
• Asistente de menú (figura 5). Mediante este asis-tente podemos cambiar el orden de los elemen-
tos del menú seleccionado, la dirección a la queapuntan, eliminarlos o añadir nuevos.
• Asistente de personalización de código (figura 6).Las personalizaciones de código se van reco-pilando y añadiendo en cada nueva versión aeste asistente para facilitar a los usuarios suinserción. No tienes más que seleccionar lafuncionalidad que quieres añadir, sustituir
dotN
etM
anía
<<
50
dnm.laboratorio.net<<
Figura 3
Figura 4
Figura 5
Figura 6
parámetros si se requiere y finalizar. Existenmás personalizaciones en la página de IronSpeed.
• Página de propiedades (figura 7).
En esta página puedes ver los valores de las pro-piedades de todos los elementos que componen lapágina y modificarlos. Entre otros, aquí están lostextos a mostrar, valores iniciales, enlaces de datos,consultas, seguridad, atributos y eventos.
Futuro
Iron Speed pretende añadir más personalizacio-nes de código y mejorar las existentes, incorporar con-troles AJAX, mejorar la estabilidad y el rendimientodel entorno, y facilitar la inclusión de controles de ter-ceros, ya que aunque ahora mismo se pueden utilizar,ello requiere de ciertos pasos que no son triviales paraalguien que empiece con ISD.
Aplicaciones de ejemplo
Puedes descargar varias aplicaciones de ejemplo ytutoriales de la página Web de Iron Speed, lo que tepermitirá aprender más rápidamente a trabajar con elsistema.
¿Y si me quedo atascado?
Si con el soporte técnico propio de Iron Speed nohas tenido bastante o ya te ha caducado, y la ayuda sete ha quedado pequeña, tienes a tu disposición un foroen inglés en el que los usuarios comparten sus expe-riencias. También existe la página de la comunidadISD, en español, con contenidos traducidos.
ISD Page Security Inject
Una de las carencias que tiene Iron Speed Designerconsiste en no poder realizar un mismo cambio sobrevarias páginas a la vez. Esto es especialmente frustran-
te a la hora de securizar las páginas con la seguridadbasada en roles. Ir página por página puede ser algodesesperante. Por esta razón, creé esta aplicación quepermite asignar roles de acceso a varias páginas a la vezy que puedes descargar de la página de la comunidad.
Integración con Visual Studio
Aunque la aplicación funciona perfectamente sinVisual Studio 2003 ni 2005, sí que es conveniente uti-lizarlo conjuntamente con él. ¿Por qué? Bueno, seecha en falta la ayuda Intellisense para no perderseentre las clases y métodos, y si no te apetece estar vien-do la documentación de las clases base para saber dón-de está o cómo se llama el método que buscas, nece-sitarás Visual Studio.
ConclusionesISD es una herramienta muy útil que te puede aho-
rrar muchísimo tiempo. Incluso alguien sin conocimien-tos de programación podría usarla para generar una apli-cación Web de n capas en cuestión de minutos e inclu-so modificar ciertos detalles visuales. Eso sí, los progra-madores seguimos haciendo falta para añadirle caracte-rísticas avanzadas como la integración de controles deterceros o la creación de funciones específicas en códi-go. Yo lo veo como un framework a medida para tu apli-cación, y aunque te facilite las cosas, es más que conve-niente tener conocimientos de ASP.NET para aprove-charlo al máximo. Incluso puedes usar las librerías quegenera ISD para utilizarlas en aplicaciones Windows,aunque esta no fuera su finalidad inicial.
Como ocurre con toda aplicación, existe una cur-va de aprendizaje asociada al uso de esta herramien-ta. La gran flexibilidad de ISD hace que sea un pro-grama con muchas posibilidades, y esto hace que ten-gas que leer la documentación y estudiarte cómo fun-cionan las clases base para saber qué pueden ofrecer-te fuera de lo que son las modificaciones visuales.
Te aconsejo que pruebes cualquiera de las dos ver-siones de forma gratuita durante 15 días, y puesto quelas aplicaciones generadas con una y otra versión soncompatibles entre sí, decidas más adelante con cuálquedarte. Si ves que la funcionalidad de la versión pro-fesional cumple los requisitos de la aplicación que pre-tendes crear, o aún no has sacado todo el provecho deISD, quédate con esa. Siempre tendrás tiempo másadelante de actualizarte a la versión empresarial, quea pesar de no ser precisamente barata se rentabilizarápidamente con un buen uso.
dotN
etM
anía
<<
51
dnm.laboratorio.net<<
Figura 7
Referencias
Página de Iron Speed: http://www.ironspeed.com
Comunidad ISD: http://www.comunidadISD.com
preguntas relacionadas con laInterfaz de Usuario (IU). Veremos cómo añadir una ven-tana corporativa (splash window) a las aplicacionesWindows Forms, cómo suministrar un alto nivel de des-cripción para la API Ink (tinta) en Tablet PC y la locali-zación de mapas de sitios Web en ASP.NET.
Tengo una aplicación Windows Forms 1.1 que tar-da bastante en cargar. Me gustaría mostrar un gráfi-co a los usuarios hasta que la ventana principal estédisponible, al estilo de las aplicaciones Office. Si lomuestro en el evento Load del formulario, y despuéslo oculto al final de la carga, los usuarios tienen queesperar hasta que el gráfico se muestra. ¿Hay algunaopción para esto en Windows Forms 2.0?
El gráfico mostrado mientras la interfaz de usua-rio de la aplicación se construye y se produce la ini-cialización adecuada se denomina splash screen (venta-na corporativa). Se utiliza para mostrar informaciónmientras se produce la carga de la aplicación. Antesde .NET y hasta la versión 1.x esto se dejaba en manosde los programadores. En Windows Forms 2.0, y espe-cialmente si el lenguaje utilizado es Visual Basic, pode-mos aprovechar algunas características recién incor-poradas para hacer de esto un juego de niños.
En concreto, VB.NET suministra una ventanacorporativa predeterminada, en forma de plantilla,que puede añadirse a cualquier proyecto WindowsForms. Primero se añade este formulario y luego sepersonaliza con los datos de cada compañía, logos cre-ados ex profeso y etiquetas descriptivas, para mostrarinformación del estado de la inicialización.
Una vez construida la ventana, llamamos al dise-ñador de proyectos y la establecemos como ventanacorporativa de la aplicación. La figura 1 muestra unade estas páginas en una aplicación simple.
El formulario de ventana corporativa también seexpone por programación a través de la propiedadMy.Application.SplashScreen. No se requiere nadamás para que la aplicación muestre dicha ventana enel proceso de carga y se oculte automáticamente cuan-do el proceso de inicialización concluya.
Es interesante, sin embargo, echar un vistazo a loque sucede internamente. Las aplicaciones WindowsForms escritas en Visual Basic están sujetas a lo quese denomina Modelo de Aplicaciones Visual Basic. Elmodelo representa una interfaz de programación cons-truida alrededor del viejo entorno de ejecución deVisual Basic. Por razones de compatibilidad, estas apli-caciones todavía se ejecutan en una especie de entor-no protegido o máquina virtual interna que exponeun conjunto de servicios de aplicación. En particular,el modelo incluye eventos que marcan algunas partesesenciales del ciclo de vida de la aplicación, tales comola inicialización, cierre o excepciones no controladas.Además, el modelo suministra características que losprogramadores suelen incluir en el proceso de cargade una aplicación. Por ejemplo, aplicaciones de ins-
VB.NET suministra una ventanacorporativa predeterminada, enforma de plantilla, que puede añadirse a cualquier proyecto
Windows Forms
Cuando la IU se viste de gala
Dino Esposito
dnm.todotnet.qa
<< Este mes tenemos tres
“”
Dino Esposito es mentor de Solid Quality
Learning y autor de “ProgrammingMicrosoft ASP.NET 2.0 CoreReference” y “Programming
ASP.NET 2.0 Applications AdvancedTopics”, ambos de Microsoft
Press.Afincado en Italia,Dino esun ponente habitual en los
eventos de la industria a nivelmundial.Visita su blog en:
http://weblogs.asp.net/despos.Puede enviarle sus consultas [email protected]
Figura 1.Adición de una ventana corporativa a una sencilla aplicación Visual Basic en
.NET Framework 2.0
tancia única y ventanas corporativas. De acuerdo coneste modelo una aplicación Windows Forms operacomo una instancia de una clase que hereda deWindowsFormsApplicationBase. La instancia es devuel-ta mediante la propiedad My.Application.
El código fuente autogenerado para la aplicaciónse encuentra en la clase application.designer.vb,oculta bajo el nodo application.myapp en el explo-rador de soluciones de Visual Studio 2005.Sobrescribiendo los miembros protegidos de esaclase, el usuario puede personalizar la forma en quese muestra la ventana corporativa. Por ejemplo, elmétodo OnCreateSplashScreen está escrito comosigue:
La ventana se muestra durante un número míni-mo de segundos, o hasta que el proceso de carga hayaconcluido. Puede controlarse este tiempo por progra-mación a través de la propiedad MinimumSplashScreenDisplayTime. La propiedad acepta un enteroque indica el número de milisegundos para la ven-tana. Esta es mostrada y ocultada dentro del méto-do Run del objeto My.Application que –a su vez- esllamado automáticamente desde el método SubMain() de la aplicación. Al final, la ventana es mos-trada mucho antes de que se instancie el formula-rio principal y tenga lugar el evento Form_Load. Elsoporte de ventanas corporativas no está disponi-ble de forma nativa en aplicaciones escritas en otroslenguajes, tales como C#.
Me gustaría ser capaz de explicar esta pregunta unpoco más. Pero la oscuridad a su alrededor es dema-siado densa, por lo menos para mí. Al mismo tiempotengo mucho interés y curiosidad en la plataformaTablet PC en este momento. Así que dicho simple-mente, ¿qué es Ink?
Tan rimbombante como pueda parecer, el TabletPC es la evolución del ordenador portátil. En tér-minos técnicos, el Tablet PC es un ordenador queejecuta Windows XP Tablet PC Edition como susistema operativo. La característica principal es susoporte interno de entradas de información median-te interfaces humanas directas desde el ratón y elteclado. Este soporte incluye medios muy específi-cos, tales como lápices ópticos y voz. Con el sopor-te extendido que ofrece para interfaces humanas, elTablet PC abre un nuevo mundo de posibilidades ala informática móvil.
La entrada mediante lápiz óptico, en particular,implica reconocimiento de escritura. Hay muchas ven-tajas en la utilización de escritura manual en los orde-
nadores, y algunas de ellas pueden no parecer obviasal principio. Por ejemplo, la capacidad de tomar notasmanuscritas añade rapidez y eficiencia a las activida-des cotidianas. Una nota manuscrita enviada porcorreo, puede, quizás, enfatizar la relación personalcon un cliente. La escritura manual es la forma natu-ral de escribir, a la que renuncias cuando utilizas unPC y esto supone una vuelta a los orígenes. Así pues,¿qué es Ink?
Ink se refiere a la API de Tablet PC que permi-te introducir textos manuscritos y convertirlos atextos de ordenador. En Windows XP Tablet PCEdition 2005, el escenario Ink-to-Text se incorporacomo una experiencia natural y carente de esfuer-zos adicionales, minimizando cualquier barrera parasu adopción.
La API Ink requiere, no obstante, algún sopor-te especial de hardware. En concreto, hay un com-ponente conocido como digitizer, que se integra enla pantalla de un Tablet PC que reconoce y com-prende los movimientos del lápiz. Basándose en esosmovimientos, el digitizer hace corresponder un con-junto de trazos con un carácter digital. El controlInputPanel (una especie de TextBox) es capaz de rea-lizar esta conversión de Ink en texto. Sin ningúnesfuerzo especial por nuestra parte, el sistema escapaz desde el primer día de admitir entradas deusuario de esta clase. A la luz de esto, ¿todas las apli-caciones de Tablet PC están capacitadas para estesoporte? Todas las que utilizan este control lo haránautomáticamente, pero los desarrolladores puedenimplementar características adicionales para exten-der su funcionalidad o hacerlo más específico deuna solución.
Los mapas del sitio (siteMaps) son mi caracterís-tica favorita en ASP.NET, porque es exactamente loque estaba necesitando para mejorar mi aplicaciónsin escribir toneladas de código. Ahora que puedoenlazar el menú a un fichero externo (o base de datos)e incluso construir vistas basadas en roles, me doycuenta de que mi aplicación necesitaría localización.¿Cuál es la aproximación más recomendable paralocalizar un sitemap?
dotN
etM
anía
<<
53
dnm.todotnet.qa<<
Protected Overrides Sub OnCreateSplashScreen()SplashScreen = WindowsApplication1.MySplashScreen
End Sub
Ink se refiere a la API de Tablet PCque permite introducir textosmanuscritos y convertirlos a
textos de ordenador
“”
To
do
tNet.
qa@
do
tnetm
an
ia.c
om
To
do
tNet.
qa@
do
tnetm
an
ia.c
om
El proveedor predeterminado de SiteMap sopor-ta algunas características relacionadas con la localiza-ción. Se habilita este aspecto mediante un atributobooleano del nodo <siteMap>:
Entre las propiedades que pueden localizarse enun siteMap están el título, la descripción y todas laspropiedades personalizadas que podamos tener. Lalocalización consiste en enlazar propiedades con expre-siones que apuntan a recursos. Se puede enlazar explí-citamente el atributo a un recurso global, o asociarleimplícitamente con un valor que viene de una clavede recurso global. Lo que sigue es un ejemplo deexpresiones explícitas:
Una expresión explícita es una expresión$Resources que apunta a un fichero global .resx y extraede ahí un valor con nombre. Si el fichero contiene unaentrada llamada Default, el valor se leerá y asignaráal atributo. Si no está allí, se utilizará en su lugar unaexpresión implícita.
Estas expresiones implícitas toman valores de unfichero de recursos local (no global). El nodo locali-zable <siteMapNode> se asocia con una clave de recur-so y todas sus propiedades localizables se definen enel fichero .resx como entradas cuya nomenclaturasigue el siguiente patrón:
El siguiente fragmento de código muestra cómoutilizar expresiones implícitas.
En este caso, el fichero de recursos tiene el mis-mo nombre que el fichero .sitemap y dispone de laextensión .resx. En el caso predeterminado, seráweb.sitemap.resx. Este fichero se supone que con-tiene entradas con el nombre Home.Description yHome.Title. Si existen, esos valores serán usados paraleer los valores de los atributos Título y Descripción.En este caso, los valores establecidos en el fichero.sitemap para las mismas propiedades son conside-rados como valores por defecto que se utilizarán encaso de problemas con los ficheros de recursos delocalización.
Un fichero .resx contiene valores de recursos,tales como la cultura predeterminada. Para especi-ficar para una cultura y lenguaje específicos (porejemplo, español), debes cambiar la extensión de.resx a es.resx, asumiendo que es representa elidentificador de localización en español. Prefijossimilares existen para la mayoría de lenguas y cul-turas.
¿Y si queremos adaptar la estructura de navega-ción a una localización dada? Desgraciadamente, lapropiedad Url no puede localizarse en un siteMap dela misma forma que el título o la descripción. Si quie-res cambiar el URL o quizás la estructura del sitio,deberás crear un siteMap distinto para cada culturasoportada y registrarlos todos en el fichero de confi-guración:
Esencialmente, tenemos múltiples proveedoresdel mismo tipo – XmlSiteMapProvider – pero trabajan-do sobre distintos ficheros de mapas del sitio. Es pre-ciso retocar el fichero Web.Config de cada versión loca-lizada para que utilice el fichero .sitemap y el prove-edor adecuado en cada caso.
Finalmente, téngase en cuenta que si utilizamosun proveedor personalizado (por ejemplo, uno quealmacene datos en una base de datos), la responsabi-lidad de las características de localización recae ente-ramente en el programador.
dotN
etM
anía
<<
54
dnm.todotnet.qa<<
To
do
tNet.
qa@
do
tnetm
an
ia.c
om
To
do
tNet.
qa@
do
tnetm
an
ia.c
om
Traducido por Marino Posadas
<siteMap enableLocalization="true"><siteMapNode
url="~/default.aspx"title="$Resources:Resources,Default" />
:</siteMap>
[resourceKey].[Attribute]
<siteMap enableLocalization="true"><siteMapNode
resourceKey="Home"url="~/default.aspx"description=" ... "title=" ... " />
:</siteMap>
<siteMap defaultProvider="DefaultSiteMap"><providers>
<add name="DefaultSiteMap"type="System.Web.XmlSiteMapProvider"siteMapFile="default.sitemap" />
<add name="SpanishSiteMap"type="System.Web.XmlSiteMapProvider"siteMapFile="es.sitemap" />
<$VE;><add name="ItalianSiteMap"
type="System.Web.XmlSiteMapProvider"siteMapFile="it.sitemap" />
</providers></siteMap>
<siteMap enableLocalization="true">:
</siteMap>
dotN
etM
anía
<<
55
<<Microsoft ASP.NET Coding Strategies with the Microsoft ASP.NET TeamMatthew Gibbs y Rob Howard
Editorial: Microsoft PressISBN: 073561900XPáginas: 336Publicado: Noviembre, 2003Idioma: Inglés
No es habitual encontrarse con obras realizadas por el propio equipo de desarrollo de un pro-ducto, pero éste es el caso de la obra que comentamos aquí. Matthew Gibbs y Rob Howard seexplayan a gusto en un trabajo cuyos valores principales son los relacionados con la propia arqui-tectura y la comprensión más profunda de los entresijos de ASP.NET (lo hicieron para la ver-sión 1.x, pero la mayor parte es perfectamente válida también para la versión 2.0). Y lo mejor esque todas las explicaciones se basan en código fuente incluido, y explicado, si bien es una penaque no esté escrito mediante la técnica “code-behind”. Pero no es una galería de código gratis,que podemos cortar y pegar, sino un soporte a los conceptos teóricos. Quizá se echa de menosun poco más de longitud, aunque está claro que los autores escriben sólo de lo que conocen deprimera mano. Sobresale el capítulo de programación y manejo de las cachés.
MCAD/MCSD Self-Paced Training Kit: Implementing Security forApplications with Microsoft Visual Basic .NET and Microsoft Visual C# .NETTony Northrup
Editorial: Microsoft PressISBN: 0735621217Páginas: 640Publicado: 2005Idioma: Inglés
Se trata de una obra de “autoestudio”. Es parte importante de la preparación para los exámenesoficiales del MOC 70-330 y 70-340 (“Implementing Security for Applications…”) y hace un reco-rrido notable por todos los aspectos de la seguridad en programación sin dejar uno en el olvido.Cuenta con la aprobación de su editorial y puede considerarse el libro oficial al respecto. El úni-co pero (del que no tiene la culpa el autor) es que la edición sea de 2005 y no se recojan algunosde los aspectos nuevos en seguridad que ofrece la versión 2.0. Desde los principios que rigen eldesarrollo de aplicaciones seguras (Modelo de Amenazas, Estrategias SD3+C, etc.) hasta cómo seimplementa la seguridad en plataformas concretas, tales como ASP.NET, servicios Web o aplica-ciones de entorno de red, son recorridos por el autor con un mérito añadido (y una ventaja parael lector), y es que una buena parte de los ejemplos adopta la forma de “Hands-on-Lab”, esto es,el autor explica como llegar al resultado paso a paso, lo que la hace idónea para el propósito deautoestudio que apuntábamos al principio. Aunque uno no se vaya a examinar, es muy recomen-dable para aprender cómo hacer las cosas. Además, le acompañan 3 CD, con todo el contenidodel código y versiones de prueba de Visual Studio 2003 Professional y Windows Server 2003.
dnm.biblioteca.net<<
dnm.biblioteca.net
dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>>[ ]
dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >
PowerTask y WOL. El sitiohttp://simply-ware.com mantiene un parde curiosas utilidades, PowerTask,para programar tareas del ordenadorasociadas a un calendario y WOL, que
implementa una función de despertador de ordenadores,incluso a distancia. La descarga es directa y gratuita.
www.BullZip.com también dispone de un montón deutilidades interesantes, pero destacamos BullZip PDFPrinter, que permite escribir directamente a este for-mato desde casi cualquier programa de Windows. Y tam-bién es gratuito.
Microsoft publica por primera vez directivas de configura-ción de hardware para Windows Vista
Según ha apare-cido en varios anun-cios oficiales, lacompañía ha decidi-do publicar un con-junto de recomen-daciones de hard-ware de cara a la ins-talación de Win-dows Vista y su ren-
dimiento óptimo en un sistema. Estas guías de montaje paralos así llamados “Vista Capable PC”, han sido uno de lospuntos fuertes del evento WinHEC, celebrado el pasadomes de mayo. Aunque las propuestas básicas son muy modes-tas (procesador a 800MHz, 512MB de RAM y tarjeta com-
patible con DirectX 9.0), la recomendación real para buenrendimiento sube notablemente, aunque nada que no esperá-ramos (procesador a 1GHz, 1GB de RAM y 128MB de capa-cidad en la tarjeta gráfica, cuyo “chip” se recomienda quesea el más reciente posible, y –para una mejor experienciade usuario con AERO–, con soporte de Pixel Shader 2.0 yprofundidad de colores de 32 bits por píxel). En otras pala-bras, las características de las tarjetas pueden comprarse hoyen día. Así mismo, parece que la política de garantías al usua-rio se agranda mediante la garantía de funcionamiento demuchos más productos, dentro de su “HardwareCompatibility List” (lista de compatibilidad de hardware).Claro que otra historia será su adopción empresarial, queprobablemente no se vea plenamente integrada hasta que elsistema lleve algunos meses en funcionamiento, según afir-ma el analista Roger Kay, presidente de EndpointTechnologies Associates.
dotN
etM
anía
<<
58
dnm.desvan<<
Marino Posadas
ASP.NET 2.0 Internals . (http://msdn.microsoft.com/asp.net/reference/infras-tructure/default.aspx?pull=/library/en-us/dnvs05/html/internals.asp) muy jugoso artículo sobre losmecanismos interiores de funcionamiento de ASP.NET 2.0.Incluye varias secciones de ejemplo y abundantes gráficosexplicativos. Y ya que estamos con el tema, y también delmismo origen (MSDN), el enlace http://msdn.microsoft.com/asp.net/reference/migration/asp2mig/default.aspx, conduce auna entrada de 4 documentos explicativos de cómo seguirpaso a paso una migración a la nueva versión, desde cual-quiera de las anteriores. ¿Más del mismo autor? Lo hay. Yno peor que los anteriores. Un excelente artículo (largo),sobre Prácticas de Seguridad en ASP.NET 2.0 (en inglés, todos,eso sí), escrito por J.D. Meier, Alex Mackman, BlaineWastell, Prashant Bansode, Andy Wigley y KishoreGopalan, que ha merecido una calificación media de 9.
Documentos en la Red
Utilidades del mes
no
tici
as.
no
tici
as
Multi-Touch InteractionResearch, otro documentoimpresionante (vídeo) lo apor-ta esta vez la página VicDivecha's Tech Blog(ht tp : / /mblog . l i b .umich .edu/~rdivecha/archives/2006/02/the_world_of_sm.html) que
muestra un vídeo sobre las posibilidades de las nuevasinterfaces de usuario de alta interactividad. Quien másquien menos habrá visto algo parecido en la tele, pero ladiferencia es que esto es real (o así parece).
Sitios del mes
Sitio de “Geeks” en castella-no, principalmente manteni-
do por algunos MVP de desarrollo. Una agradable sorpre-sa la idea de varios MVP (Rodrigo Corral, Carlos Fouz, JorgeSerrano, Iván González, Pablo Abbate, J.M. Alarcón) de for-mar un foro de noticias especializado, donde se filtre la infor-mación hacia temas de desarrollo (http://geeks.ms/blogs).
ImageMap tiene montones de buen códi-go en CSS para probar y muestra losresultados en su propia página principal(h t t p : / / f r ankmanno . c om/ i d ea s / c s s -imagemap-redux).