Documentos de Académico
Documentos de Profesional
Documentos de Cultura
com
dotNetMana
dedicada a los profesionales de la plataforma .NET
Va libre a la creatividad
El evento CellPainting del control DataGridView
entrevista
Catherine Heller
Technical Evangelist
Microsoft Corporation
eventos
TechEd Europe 2007
Lanzamiento de Biztalk 2006 R2
CEUS 2007
Laboratorio
ILOG Diagrammer for .NET
TodotNet@QA
Silverlight. Presente y futuro
Opinin
Documentos o ejecutables
editorial
dotNetMana
Dedicada a los profesionales de la plataforma .NET
Vol. III Nmero 43 Diciembre 2007
Precio: 6,50
Editor
Paco Marn
(paco.marin@netalia.es)
Redactor jefe
Marino Posadas
(marino.posadas@netalia.es)
Editor tcnico
Octavio Hernndez
(octavio.hernandez@netalia.es)
Redaccin
Dino Esposito, Guillermo 'Guille' Som, Jos
Manuel Alarcn, Luis Miguel Blanco y Miguel
Katrib (Grupo Weboo)
Empresas Colaboradoras
Alhambra-Eidos
Krasis
Plain Concepts
Raona
Solid Quality Learning
Adems colaboran en este nmero
Alberto Poblacin, Daniel Seara, Javier
Roldn y Rodrigo Corral.
Corresponsal para Amrica Latina
Pablo Tilotta
Ilustraciones
Mascota (Clico): Yamil Hernndez
Portada: Javier Roldn
Fotografa
Roberto Mariscal
Atencin al suscriptor
Pilar Prez
(pilar.perez@netalia.es)
.netalia
c/ Thomas Edison, 4, 1406
Parque empresarial Rivas Futura
28521 - Rivas Vaciamadrid (Madrid)
www.dotnetmania.com
Imprime
Grficas MARTE
ISSN
1698-5451
Paco Marn
<< dotNetMana
Depsito Legal
M-3.075-2004
sumario 43
Documentos o ejecutables
10-11
La documentacin siempre es un aspecto que exige nuestra atencin en los proyectos de software. A
menudo tendemos a pensar que la mejor manera de lograr que nuestros proyectos avancen y poder
mostrar ese avance es realizando la documentacin adecuada, buscando el ciclo adecuado para esa
documentacin y estableciendo una serie de documentos como estndares. Incluso hay metodologas
bastante populares que se centran en definir qu documentos se deben generar, quin es el responsable de cada documento y por qu manos debe pasar cada uno de ellos. Nos olvidamos de que los
documentos no se pueden ejecutar? Nos olvidamos de que el propsito final de todo proceso de
desarrollo es conseguir software que funciona?
12-14
Catherine Heller es espaola (nacida en Madrid), de padre norteamericano, y con muchos aos de
estancia en los dos pases. En la actualidad, trabaja como evangelista en el grupo de divulgacin de
Windows Live, en Redmond, y anteriormente lo haba hecho en el de Visual Studio Tools for Office.
Eso fue antes de pasar en Microsoft Ibrica otra buena parte de su carrera
Eventos
16-19
20-26
27-35
36-39
40-42
Siguiendo con la idea de las generalizaciones en componentes expuesta en el nmero anterior, en este
artculo veremos algunos otros ejemplos que pueden resultarle interesantes.
43-49
La depuracin es una de esas cosas que todos hacemos, o deberamos hacer, y que a nadie le gusta
tener que hacer; no porque no sea necesaria, sino porque al final terminabas fatal de los nervios
cuando la depuracin la realizabas con versiones anteriores de Visual Studio para .NET; por suerte,
esto ya no es as con Visual Studio 2005. En esta serie de dos artculos mostraremos las principales
posibilidades que este ltimo entorno pone a nuestro alcance para facilitarnos la depuracin de
nuestros programas.
dnm.todotnet.qa
50-52
dnm.laboratorio.net
53-55
dnm.comunidad.net
56
dnm.biblioteca.net
57
dnm.desvan
58
<<dotNetMana
noticias
cin y compatibilidad e
integracin con proyectos Expression
Blend.
La prxima preview
de Silverlight s incluir
muchas nuevas caractersticas, as como signicativas mejoras.
Puede encontrar
tutoriales quickstart
que detallan cmo utilizar estas caractersticas aqu: http://silverlight.net/QuickStarts/Start.
Puede descargar el add-on desde:
http://www.microsoft.com/downloads/details.aspx?FamilyId=25144C27-
6514-4AD4-8BCB-E2E051416E03&
displaylang=en.
Ms informacin : http://weblogs.
asp.net/scottgu.
El modo integrado de Visual Studio Shell ofrece los fundamentos sobre los cuales los desarrolladores pueden integrar sus propias herramientas y lenguajes de programacin dentro de
Visual Studio. El shell de modo integrado no
contiene ningn lenguaje de programacin, por
lo que constituye la base perfecta para desplegar un entorno de desarrollo para un lenguaje
<<dotNetMana
Conjuntamente con la salida deVisual Studio 2008, Microsoft ha puesto a disposicin de los usuarios
el SDK de Visual Studio 2008, as como los redistribuibles del nuevo Visual Studio 2008 Shell.
<< dnm.directo.noticias
Microsoft SQL Server 2008 CTP de noviembre
<<dotNetMana
opinin
Rodrigo Corral
Documentos o ejecutables
La documentacin siempre es
un aspecto que exige nuestra
atencin en los proyectos de
software. A menudo
tendemos a pensar que la
mejor manera de lograr que
nuestros proyectos avancen y
poder mostrar ese avance es
realizando la documentacin
adecuada, buscando el ciclo
adecuado para esa documentacin y estableciendo una
serie de documentos como
estndares. Incluso hay metodologas bastante populares
que se centran en definir qu
documentos se deben
generar, quin es el responsable de cada documento y
por qu manos debe pasar
cada uno de ellos. Nos olvidamos de que los documentos no se pueden ejecutar?
Nos olvidamos de que el
propsito final de todo
proceso de desarrollo es
conseguir software que
funciona?
<< A menudo, de la documentacin que mantenemos durante el desarrollo solo un pequeo porcentaje tiene valor para el cliente. Es cierto que habitualmente hemos de entregar cierta documentacin, manuales de operacin, de administracin o de usuario; esta documentacin
tiene un claro valor. Este tipo de documentacin se debe tratar como
cualquier otro entregable. En el fondo, sta es la nica documentacin
que es realmente imprescindible, la que el destinatario del software
necesita, aquella por la que, hipotticamente, estara dispuesto a pagar.
Minimizar la documentacin que no aporta nada a nuestros clientes,
que solo sirve para soportar nuestro proceso de desarrollo, y sobre
todo el coste de mantenerla, debe ser uno de nuestros objetivos.
El avance de los proyectos de software es algo que siempre ha preocupado a todos los implicados en los mismos. Es algo sobre los que nuestros clientes centran su inters y algo que, como gestores de proyectos,
necesitamos comunicar. Tradicionalmente hemos abordado esta necesidad de mostrar el progreso mediante el uso de diferentes documentos o
artefactos. Todos los que hemos tenido que mantener actualizado el project del proyecto sabemos lo difcil que esto es. Es tan difcil, que rara vez
se hace con la disciplina que requiere, de tal modo que habitualmente este
tipo de aproximacin no proporciona los resultados esperados.
El enfoque tradicional de mostrar el avance de los proyectos mediante documentos es algo que no funciona bien. Nuestros clientes han descubierto que los documentos rara vez nos muestran el avance real de un
proyecto. Es muy posible haber trabajado mucho y tener una gran cantidad de documentacin sobre un proyecto y estar a aos luz de que quien
financia el proyecto pueda obtener valor. Quin no conoce algn proyecto en el que tras muchos meses de desarrollo lo nico que haba es un
montn de documentos? Los documentos por s mismos no aportan ningn
retorno de la inversin. No se puede hacer nada para obtener valor
para tu negocio solamente con la documentacin relacionada con un
proyecto de software. Solo el software que pueden ejecutar y utilizar es susceptible de crear valor para nuestros clientes. Solo el software que funciona debe ser la medida del progreso de los proyectos
de desarrollo. Asumir esto nos obliga a asumir que tendremos que entre-
<< dnm.opinin
<<dotNetMana
11
entrevista
Marino Posadas
entrevista a
Marino Posadas
es director de tecnologas de desarrollo para Espaa
y Portugal de Solid
Quality Learning.
Puedes leer su blog
en http://www.
elavefenix.net.
Catherine Heller
<< dnm.directo.entrevista
He seguido todo este tiempo como
evangelista, pero cambiando entre productos. Me pas dos aos enfocada en
Whidbey (concretamente en el rea de
Visual Studio Tools for Office), lo que
fue muy interesante, porque anteriormente haba sido especialista en servicios Web, en middle tier, en remoting,
COM+
Especialmente sabiendo que vienes de un background de C++
S, haba sido desarrolladora de C++
10 aos antes de venir a Microsoft
Fue muy interesante ver el desarrollo
desde el punto de vista del desarrollador de Office y la posibilidad de escribir cdigo para Office desde .NET en
C# y Visual Basic. Con Visual Studio
2005 en el mercado, me cambi a Windows Vista. En esa poca todo el mundo hablaba de Indigo y Avalon, pero yo
me puse a mirar las API nativas, que
realmente es lo que vena como parte
del sistema operativo. Fue un ao y
medio interesante, volviendo a mis orgenes de C++ y COM, pero tambin
analizando cmo se podan aprovechar
esas API nativas desde .NET, y los retos
para acceder a ellas. Ya en enero, cuando lanzamos Windows Vista, me cambi a un mundo totalmente diferente,
como es Windows Live.
Respecto a ese ao y medio de
anlisis de las API nativas de Vista,
<<dotNetMana
13
<<dotNetMana
<< dnm.directo.entrevista
14
light de plataforma. Queremos definir unos umbrales de uso muy generosos y permitir que por debajo de ese
umbral el uso sea gratuito. Y en algn
momento financiaremos eso a travs
de anuncios. Luego queremos tambin ofrecer un modelo para que por
encima de ese umbral se pueda pagar,
bien por usuario, o por transaccin,
o por minuto, dependiendo del servicio o por algn tipo de comparticin de ingresos por anuncios; esa es
la idea que tenemos detrs de estos
servicios.
Tambin estamos haciendo una
apuesta muy importante respecto a las
fotografas almacenadas en Windows
Live Spaces. Ahora mismo hay 4 mil
millones de fotografas almacenadas.
Baste pensar que los usuarios de
media suben unos 8 millones de fotografas todos los das en todo el mundo. Vemos dnde se est haciendo un
uso muy importante de Spaces: publicar y compartir fotografas. Lo bueno
que tiene Spaces es que se puede crear un space y limitar a que solo tu familia, tus amigos o quien t decidas acceda a l. Estamos invirtiendo mucho
para hacer que Spaces sea un sitio idneo para guardar fotografas, para crear experiencias de usuario como Windows Live Photo Gallery, que acabamos de sacar y que tiene una experiencia rica en el cliente para manipu-
si no lo tienes claro...
GR
d
La revista de la
eventos
Marino Posadas
Marino Posadas
es director de tecnologas de desarrollo para Espaa y
Portugal de Solid
Quality Learning.
Puedes leer su blog
en http://www.
elavefenix.net.
to que nunca. Se presenta un tema (normalmente el mismo que el ponente ha expuesto en una
sesin estndar), y se debate en profundidad discutiendo y aportando cada espectador sus miedos o experiencias en la implementacin. En la
foto adjunta, vemos a Francisco Gonzlez de
Solid Quality Mentors, nico ponente espaol
junto a Catherine Heller, atender al pblico al
final de su sesin interactiva.
Afortunadamente, los asistentes al evento recibiremos un post-conference DVD con todo el
contenido de las ponencias grabado en vdeo junto a las presentaciones PowerPoint y cdigo fuente. Por suerte, otra novedad de este TechEd con-
<< dnm.directo.eventos
<<dotNetMana
17
<< dnm.directo.eventos
<<dotNetMana
Lanzamiento de Biztalk
18
2006 R2
<< dnm.directo.eventos
cliente que se haya sentido defraudado por el resultado final, ni en cuanto a expectativas de rendimiento ni en cuanto a capacidad de integracin.
Lleg el momento de recobrar fuerzas con el
cctel programado para afrontar la recta final del
evento con las energas renovadas. Respecto a lo
acontecido por la tarde, poco tenemos que comentar: tres diferentes charlas, eminentemente tcnicas, en las que sin grandes pretensiones se nos
detall el funcionamiento de los adaptadores RFID
y EDI mejorados para esta ltima versin, y una
ltima charla que cerraba el da y que rezaba algo
as como Extendiendo SOA desde la Empresa al
Mundo (previsible, muy previsible).
Suriel Hilario
Project Manager de Raona
CEUS 2007
El pasado 30 de octubre, cerca de 320 personas asistieron a la tercera edicin de CEUS 2007, la III Conferencia de Usuarios de SharePoint, en Madrid. Esta
edicin sirve para consolidar dichas conferencias entre
la comunidad y confirma el xito de la plataforma de
moda de Microsoft. Prueba de ello fue el nmero de
asistentes, que super al del ao pasado, confirmando el inters de la plataforma SharePoint. El da se
dividi en dos formatos totalmente diferentes de presentaciones.
La maana estuvo presidida por presentaciones de
empresas usuarias de SharePoint, que junto al cliente
final, nos mostraron casos de xito con SharePoint; en
la presentacin daban a conocer a todo el aforo su experiencia, implementacin y sensaciones con el producto. Entre estas empresas se encontraban raona junto a
su cliente Criteria Caixa Corp, Getronics con Ancert
y K2, Renacimiento con el Ministerio de Presidencia
e Informtica el Corte Ingls con Caja Mediterrneo.
Todas estas presentaciones fueron de carcter prctico,
con la puesta en marcha del proyecto y las peculiaridades de cada uno. Enmedio, y despus del descanso, intervinieron distintos responsables de Microsoft, que nos
dieron algunos detalles del futuro de SharePoint, enfocado en las bsquedas, lo que anuncia la salida del nuevo SharePoint Search Server. Por parte de Microsoft,
contamos con la presencia de Rafael Snchez, jefe de
producto de SharePoint, y con Sarah Hammon, responsable de producto SharePoint en Europa.
Las sesiones de la tarde, en cambio, fueron sesiones mucho ms tcnicas, ms enfocadas hacia un
tema especfico. Se cont con un total de siete salas,
y en cada una de ellas tuvieron lugar tres presentaciones de unos 55 minutos cada una. Con este formato de presentaciones y con la disponibilidad de
salas, los asistentes se dividieron entre las sesiones
ms interesantes para cada uno de ellos. Se trataton temas muy diversos, desde migraciones de SharePoint 2003 y CMS 2001 a SharePoint 2007, hasta integraciones de BI, Microsoft Dynamics, Business Data Catalog, workflows con SharePoint Designer y definicin de arquitecturas de alta disponibilidad. Los ponentes de estas presentaciones pertenecan a las distintas empresas patrocinadoras del
evento y otros voluntarios, as como personal de
Microsoft. Todas las presentaciones estarn disponibles pblicamente en breve para las personas que
no puedieron asistir al evento.
Entre las novedades, la nueva versin de Microsoft Search Server 2008. Esta versin del nuevo buscador para SharePoint ya se encuentra liberada en su
versin release candidate para que cualquiera de los
usuarios pueda descargarla y probarla.
Sergio Holgado
Software Engineer de Raona
plataforma.net
Javier Roldn
Estos elementos, flexibles y de sencilla incorporacin a nuestros proyectos, eran el control InkEdit y el control InkPicture. El primero permita la
captura de trazos de tinta digital y su reconocimiento de manera automtica, todo ello sin escribir una sola lnea de cdigo. Por otro lado, el control InkPicture permita la captura automtica de
trazos de tinta digital; sin embargo, para el reconocimiento de los trazos como escritura era necesario un poco de programacin.
En el presente artculo iremos ms all y estudiaremos la manera de hacer que cualquier control
(como por ejemplo un Panel, un RichTextBox o un
ListBox, por solo poner unos ejemplos) sea capaz de
aceptar trazos de tinta digital y reconocerlos como
escritura manual. Asimismo, veremos los principales mtodos existentes para mejorar la efectividad del
reconocimiento, tales como el uso de los factoids (cadenas predefinidas que proporcionan al reconocedor
informacin sobre el tipo de texto a reconocer) y
wordlists (listas predefinidas de palabras).
Para finalizar, analizaremos el uso de lo que se
conoce como gestures, gestos especiales no reconocidos como palabras y que permiten la ejecucin de acciones a medida.
damos. Al igual que el control InkPicture, la clase InkOverlay no proporciona por defecto mtodos automticos para el reconocimiento de la escritura manual; sin embargo, del mismo modo podremos suplir esta ausencia mediante la clase Recognizers y un poco de programacin.
Pasemos por tanto a ver cmo usar la clase
InkOverlay. Para ello, crearemos un nuevo formulario a imagen y semejanza del formulario usado en la primera parte de este artculo, con la diferencia de que sustituiremos el control InkPicture
por un simple Panel. Para aquellos que no hayan
podido leer esa primera parte, el formulario se
compone bsicamente de un control Panel sobre
el que escribiremos trazos de tinta digital, un TextBox en el que mostraremos el resultado de inten-
La clase InkOverlay
La clase InkOverlay nos permite aadir caractersticas de tinta digital a cualquier control que deci-
<< dnm.plataforma.net
this.inkOverlay = new
InkOverlay(this.panelEscritura);
this.inkOverlay.Enabled = true;
Como podemos observar, en la primera lnea de cdigo simplemente creamos una instancia de la clase InkOverlay, a la que le pasamos en el constructor el control con el que queremos asociarlo. En la segunda lnea activamos
dicha instancia.
Si ejecutamos la aplicacin de nuevo, observaremos que hemos convertido el Panel en un control capaz de
recibir trazos de tinta digital; pero que
(al igual que ocurra con el control
InkPicture) ste no es capaz de reconocerlos como texto de manera
automtica. Utilizando el mismo cdigo que el usado en el artculo anterior
para el control InkPicture, pero sustituyendo la referencia a la clase InkPicture por la clase InkOverlay, haremos
posible que el texto manuscrito sobre
el control Panel sea reconocido y mos-
using
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Text;
System.Windows.Forms;
Microsoft.Ink;
namespace InkOverlayTest
{
public partial class FormInkOverlay : Form
{
private InkOverlay inkOverlay;
public FormInkOverlay()
{
InitializeComponent();
}
private void FormInkOverlay_Load(object sender, EventArgs e)
{
this.inkOverlay = new InkOverlay(this.panelEscritura);
this.inkOverlay.Enabled = true;
}
private void buttonEscribir_Click(object sender, EventArgs e)
{
this.inkOverlay.EditingMode = InkOverlayEditingMode.Ink;
}
private void buttonBorrarTrazo_Click(object sender, EventArgs e)
{
this.inkOverlay.EraserMode = InkOverlayEraserMode.StrokeErase;
this.inkOverlay.EditingMode = InkOverlayEditingMode.Delete;
}
private void buttonBorrarPunto_Click(object sender, EventArgs e)
{
this.inkOverlay.EraserMode = InkOverlayEraserMode.PointErase;
this.inkOverlay.EditingMode = InkOverlayEditingMode.Delete;
}
private void buttonSeleccionar_Click(object sender, EventArgs e)
{
this.inkOverlay.EditingMode = InkOverlayEditingMode.Select;
}
private void buttonReconocimiento_Click(object sender, EventArgs e)
{
Recognizers reconocedores = new Recognizers();
if (reconocedores.Count != 0)
{
Recognizer reconocedor = reconocedores.GetDefaultRecognizer();
RecognizerContext contextoReconocedor =
reconocedor.CreateRecognizerContext();
<<dotNetMana
21
<< dnm.plataforma.net
RecognitionResult resultadoReconocedor;
RecognitionStatus estatusReconocimiento;
contextoReconocedor.Strokes = inkOverlay.Ink.Strokes;
if (contextoReconocedor.Strokes.Count > 0)
{
resultadoReconocedor =
contextoReconocedor.Recognize(out estatusReconocimiento);
if (estatusReconocimiento == RecognitionStatus.NoError &&
resultadoReconocedor != null)
{
String resultado = resultadoReconocedor.TopString;
if (resultado != null && resultado.Length > 0)
{
this.textBoxTextoReconocido.Text = resultado;
}
}
}
}
else
{
MessageBox.Show(No existen reconocedores instalados);
}
}
}
contextoReconocedor.Factoid =
NUMBER;
<<dotNetMana
22
Mejorando el
reconocimiento
A estas alturas, si ha seguido de manera prctica el artculo, con total seguridad ya habr probado la sorprendente
eficacia del reconocedor implementado en el Microsoft Windows XP Tablet
PC Edition 2005 Recognizer Pack. Sin
embargo, existen situaciones en las que
es muy difcil para cualquier reconocedor automtico de texto averiguar qu
es lo que el usuario exactamente ha querido escribir.
Pensemos, por solo poner un par de
ejemplos, en aquellos casos en los que
es necesario que la aplicacin reconozca letras sueltas, o palabras sin ningn
sentido en cualquier idioma, como
nombres de usuario o contraseas. Para
poder enfrentarnos con xito a este tipo
de casusticas, el Microsoft Windows
XP Tablet PC Edition Software Development Kit pone a nuestra disposicin
Factoids
<< dnm.plataforma.net
minar el formato de cada factoid en funcin del idioma que estemos utilizando. Asimismo, debemos tener en cuenta que no todos los factoids existen en
todos los idiomas, por lo que es recomendable tener muy claro en qu idioma estamos trabajando y usar los factoids que correspondan.
En la tabla 1 se presentan los principales factoids, divididos en dos grandes grupos: dependientes e independientes de idioma. No se han incluido,
por encontrase fuera del alcance de este
artculo, los factoids de idiomas orientales (japons, chino y coreano).
Wordlists
Existen situaciones en las que el uso
de factoids es del todo inadecuado, y sin
embargo el reconocimiento por defecto sigue siendo deficiente. Pensemos
por ejemplo aquellos casos en los que
la aplicacin deba reconocer palabras
sin sentido que combinen letras y
nmeros, como por ejemplo nombres
de usuario y contraseas.
Si volvemos al ejemplo inicial e
intentamos reconocer por ejemplo la
cadena ss5lo10, pero adems no
haciendo distincin alguna mientras
Dgito simple.
Web
Default
None
SystemDictionary
Wordlist
Currency
Date
Number
OneChar
Un carcter ANSI.
Percent
Un nmero seguido del smbolo %. Existir un espacio entre el nmero y el smbolo de porcentaje en funcin del idioma.
PostalCode
Telephone
Time
UpperChar
<<dotNetMana
Sin embargo, debemos usar con cuidado la combinacin de la propiedad Factoid y el modo de reconocimiento Coerce, ya que tal y como hemos comentado,
el modo Coerce fuerza a reconocer nicamente aquellas cadenas de texto que
concuerden exactamente con la definicin
del factoid. As por ejemplo, el factoid Email
en modo Coerce solo reconocer cuentas
de correo electrnico completas; es decir,
que contengan el carcter @ y un dominio
totalmente cualificado (por ejemplo
javier.roldan@gmail.com), no permitiendo el reconocimiento de textos que no
cumplan estrictamente estos requerimientos, como por ejemplo aliases (JavierRoldan) o cuentas de correo sin dominios
totalmente cualificados, comunes en algunas implementaciones de mensajera interna (javier.roldan@midominio).
Es importante sealar que mientras
algunos factoids, como por ejemplo Email
y Web, son idnticos en cualquier idioma, otros, como por ejemplo Telephone y PostalCode dependen del idioma
utilizado. Es fundamental por tanto exa-
23
<< dnm.plataforma.net
Gestures
escribimos entre el 5 y la s, el 1 y la
l y el 0 y la o, parece imposible que
ninguna aplicacin (o incluso persona)
pueda reconocer ese texto (figura 5).
Figura 6. Reconocimiento
mediante wordlists
<<dotNetMana
contextoReconocedor.Factoid =
Factoid.WordList;
WordList wordList =
new WordList();
wordList.Add(ss5lo10);
contextoReconocedor.WordList =
wordList;
contextoReconocedor.RecognitionFlags=
RecognitionModes.Coerce;
24
Podremos comprobar que la aplicacin es capaz de reconocer los trazos introducidos sin mayor problema
(figura 6).
Teniendo en cuenta que es posible
aadir en tiempo de ejecucin tantas
palabras como deseemos a la propiedad
WordList, esto convierte su utilizacin en
prcticamente obligada en todos aquellos casos en los que sea factible su uso.
if (contextoReconocedor.Strokes.Count > 0)
{
resultadoReconocedor =
contextoReconocedor.Recognize(out estatusReconocimiento);
if (estatusReconocimiento == RecognitionStatus.NoError &&
resultadoReconocedor != null)
{
String resultado = resultadoReconocedor.TopString;
if (resultado != null && resultado.Length > 0)
{
this.textBoxTextoReconocido.Text = resultado;
}
}
}
}
else
{
MessageBox.Show(No existen reconocedores instalados);
}
}
<< dnm.plataforma.net
Digit
Dgito simple.
Tap
Clic de ratn.
DoubleTap
RightTap
Drag
RightDrag
HoldEnter
HoldLeave
No implementado.
HoverEnter
HoverLeave
this.inkOverlay = new
InkOverlay(this.panelEscritura);
this.inkOverlay.CollectionMode =
CollectionMode.InkAndGesture;
this.inkOverlay.SetGestureStatus(ApplicationGesture.ChevronDown, true);
this.inkOverlay.SetGestureStatus(ApplicationGesture.ChevronUp, true);
this.inkOverlay.SetGestureStatus(ApplicationGesture.Check, true);
this.inkOverlay.SetGestureStatus(
ApplicationGesture.AllGestures,
true);
this.inkOverlay.Enabled = true;
plemente muestra en el cuadro de texto el texto asociado al gesture reconocido, se muestra a continuacin:
<<dotNetMana
this.inkOverlay.Gesture += new
InkCollectorGestureEventHandler(
inkOverlay_Gesture);
25
<< dnm.plataforma.net
using
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Text;
System.Windows.Forms;
Microsoft.Ink;
namespace InkGestureTest
{
public partial class FormGestures : Form
{
private InkOverlay inkOverlay;
public FormGestures()
{
InitializeComponent();
}
private void FormGestures_Load(object sender, EventArgs e)
{
this.inkOverlay = new InkOverlay(this.panelEscritura);
this.inkOverlay.CollectionMode = CollectionMode.InkAndGesture;
this.inkOverlay.SetGestureStatus(ApplicationGesture.AllGestures, true);
this.inkOverlay.Gesture += new InkCollectorGestureEventHandler(inkOverlay_Gesture);
this.inkOverlay.Enabled = true;
}
<<dotNetMana
Conclusin
26
plataforma.net
El evento CellPainting
del control DataGridView
Va libre a la creatividad
Cuando presentamos a nuestros usuarios un conjunto de datos mediante el
control DataGridView, podemos mejorar la apariencia visual del mismo recurriendo al uso de estilos. No obstante, la mera utilizacin de estilos resulta
escasa si nuestras pretensiones pasan por lograr efectos avanzados y un mayor
control sobre el proceso de dibujo de las celdas. Es por ello que el empleo
combinado del evento CellPainting, perteneciente a este control, junto al conjunto de clases de GDI+ (la API de programacin grfica de .NET Framework),
se va a convertir en un poderoso recurso a nuestro alcance, que nos permitir aplicar ese toque especial al dibujo de las celdas, para que luzcan con
todo su esplendor. Porque ellas lo valen.
FormattedValue
CellStyle
Estilo de la celda.
Handled
Propiedad booleana que permite informar al control si la operacin de dibujo ha sido realizada manualmente mediante el cdigo suministrado por el
programador, o deber ser el control quien realice este proceso.
Tabla 1. Propiedades de la clase DataGridViewCellPaintingEventArgs
<<dotNetMana
<< dnm.plataforma.net
28
// obtencin de datos
SqlConnection cnConexion = new SqlConnection();
cnConexion.ConnectionString = Data Source=localhost; +
Initial Catalog=AdventureWorksDW; +
Integrated Security=True;
//....
string sSQL;
sSQL = SELECT ProductKey, SpanishProductName, ListPrice, EndDate, Color ;
sSQL += FROM DimProduct ;
sSQL += WHERE ListPrice IS NOT NULL;
SqlCommand cmdComando = new SqlCommand(sSQL, cnConexion);
SqlDataAdapter daAdaptador = new SqlDataAdapter(cmdComando);
DataSet dsAdvWorks = new DataSet();
daAdaptador.Fill(dsAdvWorks, DimProduct);
// establecer la fuente de datos para el DataGridView
this.dgvGrid.DataSource = dsAdvWorks;
this.dgvGrid.DataMember = DimProduct;
// cambiar el tipo de letra a las columnas
// que vamos a usar en el evento CellPainting
DataGridViewCellStyle styListPrice = new DataGridViewCellStyle();
styListPrice.Font = new Font(Comic Sans MS, 16, FontStyle.Bold);
styListPrice.Format = C;
this.dgvGrid.Columns[ListPrice].DefaultCellStyle = styListPrice;
DataGridViewCellStyle styColor = new DataGridViewCellStyle();
styColor.Font = new Font(Papyrus, 16, FontStyle.Bold);
this.dgvGrid.Columns[Color].DefaultCellStyle = styColor;
// establecer ajuste de altura automtico para las filas
this.dgvGrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
// establecer ajuste de anchura automtico para las columnas
this.dgvGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
// ocultar la primera columna del control
this.dgvGrid.Columns[ProductKey].Visible = false;
Listado 1
<< dnm.plataforma.net
private void dgvGrid_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
// comprobar que la fila y columna estn dentro del rango
// y que la columna corresponde a una de las que vamos
// a pintar
if (e.ColumnIndex > 0 && e.RowIndex >= 0 &&
(this.dgvGrid.Columns[e.ColumnIndex].Name == Color |
this.dgvGrid.Columns[e.ColumnIndex].Name == ListPrice))
{
// crear un array con las coordenadas
// sobre las que aplicaremos los colores con fundido
// basadas en la posicin y dimensin de la celda
Point[] aPuntos = new Point[] {
new Point(e.CellBounds.X,e.CellBounds.Y),
new Point(e.CellBounds.X, e.CellBounds.Y +
e.CellBounds.Height),
new Point(e.CellBounds.X + e.CellBounds.Width,
e.CellBounds.Y + e.CellBounds.Height),
new Point(e.CellBounds.X + e.CellBounds.Width,
e.CellBounds.Y)};
PathGradientBrush pgbBrush;
Color[] aColores;
//
//
//
if
{
aColores = new Color[] {
Color.LightYellow,
Color.DarkTurquoise,
Color.MediumSpringGreen,
Color.LightSteelBlue};
pgbBrush = new PathGradientBrush(aPuntos);
pgbBrush.CenterColor = Color.Lavender;
pgbBrush.SurroundColors = aColores;
DataGridViewCellPaintingEventArgs
necesarias para esta operacin: el objeto Graphics; la propiedad FormattedValue, ms recomendable que su homloga Value, fundamentalmente para
aquellos casos de columnas con valores numricos o de fecha formateados;
CellBounds, como superficie o rectngulo sobre la que dibujar el texto; y
finalmente los valores del estilo propiedad CellStyle, que contienen el
tipo de letra y su color.
Como ltima accin en el cdigo de
este evento, tenemos que asignar el
valor true a la propiedad DataGridViewCellPaintingEventArgs.Handled,
puesto que es necesario informar al
control de que nosotros hemos sido
}
else
{
aColores = new Color[] {
Color.BlanchedAlmond,
Color.LightSalmon,
Color.LightYellow,
Color.DarkOrange};
pgbBrush = new PathGradientBrush(aPuntos);
pgbBrush.CenterColor = Color.LawnGreen;
pgbBrush.SurroundColors = aColores;
}
// aplicar el objeto brush con el efecto de colores fundidos
// y dibujar un borde para el rectngulo de la celda
e.Graphics.FillRectangle(pgbBrush, e.CellBounds);
<<dotNetMana
do Graphics.DrawRectangle, aplicando
un color al borde sobre el rectngulo
de la celda.
Pero esto no es suficiente, ya que
solamente hemos dibujado el borde y
colores de fondo de la celda. An nos
queda el texto que representa el valor
de la celda, que obtenemos de la propiedad Value o FormattedValue, pertenecientes al parmetro DataGridViewCellPaintingEventArgs del evento. Sin
embargo, no podemos utilizar directamente esta propiedad; recordemos que
el evento CellPainting nos obliga a realizar manualmente todas las operaciones de dibujo, por lo que deberemos
convertir a modo grfico la cadena a
dibujar siguiendo estos pasos:
Tras comprobar que existe realmente un valor a dibujar, tenemos que calcular las dimensiones del texto (de
tipo Size) utilizando el mtodo esttico TextRenderer.MeasureText, al que
pasaremos como parmetro el valor
de la celda y el tipo de letra que usaremos para dibujarlo. Para este ltimo, emplearemos el objeto Font situado en el estilo de la columna correspondiente a la celda.
A continuacin, empleando el tambin
mtodo esttico TextRenderer.DrawText, ser cuando realmente dibujemos el texto, pasando como parmetro aquellas propiedades del objeto
29
<< dnm.plataforma.net
TextRenderer.DrawText(e.Graphics,
e.FormattedValue.ToString(),
e.CellStyle.Font,
e.CellBounds,
e.CellStyle.ForeColor,
TextFormatFlags.Top);
e.Graphics.DrawRectangle(
new Pen(Color.DarkMagenta, 3), e.CellBounds);
// si la celda tiene valor
if (e.Value != null)
{
// calcular el tamao del texto
Size szTexto;
szTexto = TextRenderer.MeasureText(
e.Value.ToString(), e.CellStyle.Font);
Listado 3
// dibujar el texto
TextRenderer.DrawText(e.Graphics,
e.FormattedValue.ToString(),
e.CellStyle.Font,
e.CellBounds,
e.CellStyle.ForeColor);
}
e.Handled = true;
}
}
Listado 2
los encargados de realizar la operacin de dibujo de la celda; de lo contrario, el control har caso omiso de
nuestro cdigo, realizando l solito las
operaciones de dibujo.
El listado 2 muestra el cdigo del
evento CellPainting que acabamos de
explicar en los prrafos anteriores.
La figura 1 muestra la rejilla resultante de la aplicacin de este proceso de
dibujo personalizado con CellPainting,
donde podemos observar las celdas que
hemos pintado tanto en estado normal
como seleccionado.
<<dotNetMana
Cambiando la alineacin
en el contenido de las celdas
30
<< dnm.plataforma.net
private void Form1_Load(object sender, EventArgs e)
{
//....
styListPrice.Tag = TextFormatFlags.Right |
TextFormatFlags.VerticalCenter;
//....
styColor.Tag = TextFormatFlags.Left |
TextFormatFlags.VerticalCenter;
//....
}
Listado 4
<<dotNetMana
32
Vamos a continuacin a introducir una nueva variante en este escenario de trabajo. Imaginemos que no utilizamos el ajuste automtico de anchura de columnas
para el control, por lo que borramos la lnea de cdigo que hace uso de la propiedad DataGridView.AutoSi-
TextRenderer.DrawText(e.Graphics,
e.FormattedValue.ToString(),
e.CellStyle.Font,
e.CellBounds,
e.CellStyle.ForeColor,
TextFormatFlags.HorizontalCenter |
TextFormatFlags.NoClipping);
Listado 5
<< dnm.plataforma.net
<<dotNetMana
33
<< dnm.plataforma.net
La figura 5 muestra el control en ejecucin, donde podemos observar la celda de cabecera con las operaciones que
acabamos de describir.
<<dotNetMana
34
Al realizar el dibujo
de una celda
mediante CellPainting,
la responsabilidad de
pintar hasta el ltimo
detalle recae sobre
el programador
this.dgvGrid.ColumnHeadersDefaultCellStyle = styCabecera;
// ampliar la anchura de la columna
// sobre la que vamos a dibujar la cabecera
this.dgvGrid.Columns[ProductKey].Width += 40;
}
// cada vez que hacemos clic en la cabecera
// guardamos el nombre de la columna pulsada
private void dgvGrid_ColumnHeaderMouseClick(object sender,
DataGridViewCellMouseEventArgs e)
{
sCabeceraPulsada = this.dgvGrid.Columns[e.ColumnIndex].Name;
}
private void dgvGrid_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
// comprobar si la cabecera a pintar es la que necesitamos
if (e.ColumnIndex >= 0 &&
e.RowIndex < 0 &&
this.dgvGrid.Columns[e.ColumnIndex].Name == ProductKey)
{
//....
// dibujar el ttulo de la cabecera
// alineado a la izquierda
TextRenderer.DrawText(e.Graphics,
e.FormattedValue.ToString(),
e.CellStyle.Font,
e.CellBounds,
e.CellStyle.ForeColor,
TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
// si la cabecera pulsada es la que necesitamos,
// en funcin del tipo de ordenacin,
// obtener la imagen del recurso incrustado en el proyecto
Bitmap bmpImagen = null;
if (sCabeceraPulsada == ProductKey)
{
switch (this.dgvGrid.SortOrder)
{
case SortOrder.Ascending:
bmpImagen =
<< dnm.plataforma.net
case SortOrder.Descending:
bmpImagen =
new Bitmap(GetType(), FlechaAbajo.png);
break;
}
}
// pintar la imagen en la celda de la cabecera
// si realmente se ha establecido un orden
if (bmpImagen != null)
{
e.Graphics.DrawImage(bmpImagen,
e.CellBounds.Right
(bmpImagen.Width + e.CellStyle.Padding.Left),
e.CellBounds.Y + e.CellStyle.Padding.Top);
}
e.Handled = true;
}
}
Listado 6
Acabando la pintura
Llegamos al punto final de este artculo, en el que hemos realizado un repaso del evento CellPainting del control
DataGridView, como medio para aplicar
ciertos efectos avanzados de presentacin sobre las celdas del control a fin de
lograr un resultado ms agradable a la
vista de nuestros usuarios.
Que ustedes lo disfruten.
<<dotNetMana
35
plataforma.net
Alberto Poblacin
Ms sobre seguridad
de acceso a cdigo
En una entrega anterior (dotNetMana n 41) presentamos los fundamentos de la Seguridad de acceso a cdigo (Code Access Security, CAS)
en .NET Framework, y describimos cmo el CLR determina los permisos del cdigo y cmo se pueden manipular desde las herramientas
administrativas los permisos concedidos a cada ensamblado. En esta
entrega veremos cmo se pueden solicitar, manipular y limitar estos
permisos desde dentro de nuestro cdigo.
using System.Security.Permissions;
...
[assembly:
UIPermission(SecurityAction.RequestMinimum,
Window=UIPermissionWindow.AllWindows)]
Estos atributos, que afectan a todo el ensamblado, se pueden introducir en cualquiera de los
fuentes que se compilan para formar dicho ensamblado; pero es costumbre, para facilitar su locali-
[assembly: RegistryPermission(
SecurityAction.RequestMinimum,
Name=FullTrust)]
<< dnm.plataforma.net
[assembly: FileIOPermission(
SecurityAction.RequestOptional,
Unrestricted=true)]
[assembly: RegistryPermission(
SecurityAction.RequestRefuse,
Unrestricted = true)]
[assembly: FileIOPermission(
SecurityAction.RequestOptional,
Unrestricted=false)]
Con esto indicamos que solicitamos como Opcional ningn permiso, con lo que ya no se aplica lo indicado en el prrafo anterior, y los nicos permisos concedidos son los que
solicitemos expresamente mediante
el resto de los atributos. De esta forma, el programa no recibe ningn
permiso superfluo.
Solicitud de permisos
(Demand)
Hemos visto que un ensamblado
puede solicitar y recibir una serie de
permisos. Los permisos que ha recibido el ensamblado entrarn en juego en el momento en que el cdigo
que se ejecuta realice una operacin
que requiera dichos permisos. Cmo
se determinan y se controlan estas
operaciones? Vemoslo, apoyndonos
en la figura 1.
Supongamos que tenemos un programa ejecutable, que en la figura
denominamos Ensamblado 1, que
conforme con las polticas del sistema
ha recibido permiso de ejecucin pero
no de escritura en disco. Este programa realiza una llamada a una DLL
Figura 1
Demand
Afirmar permisos
Assert
Restriccin de permisos
Deny
PermitOnly
RevertAssert
RevertDeny
RevertPermitOnly
RevertAll
Comparar permisos
IsSubsetOf
Combinacin de permisos
Union
Intersect
<<dotNetMana
37
<< dnm.plataforma.net
using System.Security.Permissions;
// ...
public void Escribir(string fichero)
{
FileIOPermission permiso = new FileIOPermission(
FileIOPermissionAccess.Write, fichero);
try
{
permiso.Demand();
// Aqu, si la solicitud tiene xito,
// usamos P/Invoke para llamar a la API
}
catch (SecurityException ex)
{
// Si falla el Demand(), se produce esta excepcin
}
}
<<dotNetMana
Listado 1
38
[FileIOPermission(
SecurityAction.Demand,
Write = C:\\Fichero)]
public class ClaseConPermiso
{...}
Afirmacin de permisos
(Assert)
Vayamos ms all y supongamos que
realmente s que deseamos realizar la
grabacin anterior. Por ejemplo, el
Ensamblado 2 podra contener unas
rutinas de registro en bitcora (logging)
que graben en un archivo una traza de
las operaciones realizadas, y deseamos
que esa traza quede grabada siempre
que un ejecutable llame a esta librera,
aunque el ejecutable en s no tenga permiso para escribir en disco. Esto se
logra mediante la operacin llamada
Assert, tal como muestra el ejemplo
del listado 2.
Volviendo al ejemplo de la figura 1,
y suponiendo que el Assert() se ha
introducido en el Ensamblado 2, cuando se produce el Demand() en el Ensamblado 3 y sube a la trama anterior de
la pila, se encuentra que en dicha trama se ha realizado una afirmacin del
permiso solicitado, y en consecuencia
se da dicho permiso por concedido,
teniendo xito el Demand() sin llegar a
subir hasta el Ensamblado 1.
Rechazo de permisos
(Deny)
La operacin Deny funciona del
modo contrario que Assert. Cuando
ejecutamos un Deny(), estamos forzando que se produzca una excepcin
cuando el cdigo ms abajo en la pila
realice un Demand() del permiso objeto del Deny, incluso aunque el ensam-
<< dnm.plataforma.net
blado llamante s que tenga el permiso en cuestin. El ejemplo del listado 3 rechaza el permiso de utilizar
reflexin sobre miembros no visibles
de un tipo.
[PermissionSet(
SecurityAction.LinkDemand,
Name = FullTrust)]
public void Metodo(...){...}
Listado 3
[assembly: AllowPartiallyTrustedCallers]
LinkDemand
La operacin LinkDemand opera de
forma similar al Demand que hemos
mencionado ms arriba, con la diferencia de que LinkDemand() solo comprueba el llamante inmediato, en lugar
de recorrer toda la pila comprobando
si la totalidad de los llamantes tienen el
permiso solicitado.
Por ejemplo, para comprobar que
el llamante tiene Full Trust:
El atributo AllowPartiallyTrustedCallers
Todo ensamblado que tiene un nombre fuerte (strong name) recibe implcitamente un LinkDemand del conjunto de permisos Full Trust. Esto
provoca el que dichos ensamblados
no puedan ser llamados desde programas que no tengan confianza completa. Si el programador ha tenido en
cuenta al desarrollar el ensamblado
las implicaciones de seguridad de los
entornos que tienen confianza parcial, puede declarar expresamente la
Conclusin
Cuando escribamos libreras que utilicen
llamadas a cdigo no gestionado, y sea
previsible que stas puedan ser llamadas
desde cdigo que no tenga confianza completa, es recomendable que introduzcamos dentro las peticiones de permisos (con
Demand) que sean oportunas de conformidad con las operaciones que realice
dicho cdigo no manejado, a fin de evitar
que los programas que llamen a nuestra
librera y no tengan confianza completa
puedan aprovecharse de ella para saltarse
las polticas de seguridad.
La librera de MSDN contiene la referencia completa de las clases que manejan la Seguridad de acceso a cdigo. Vanse estos enlaces:
http://msdn.microsoft.com/library/SPA/cpguide/html/cpconsecurecodingguidelines.asp
http://msdn2.microsoft.com/es-es/library/system.security(VS.80).aspx
<<dotNetMana
Documentacin
39
plataforma.net
Daniel Seara
Listado 1
Es muy til disponer de mtodos para recuperar y almacenar informacin privada del usuario para cada aplicacin. Para ello, es ms seguro
utilizar IsolatedStorage.
Y de una forma muy similar, implementamos
escrituras (listado 2).
<< dnm.plataforma.net
][
NOTA
Es importante tener en cuenta
que se pueden duplicar estas
funciones para que utilicen
arrays de bytes u objetos
MemoryStream para manipular
datos binarios.
Listado 3
[ ]
NOTA
Recursos
to sean textos como de formato binario. En muchas oportunidades necesitaremos de ellos y, cosa an ms com-
<<dotNetMana
NOTA
41
<< dnm.plataforma.net
<<dotNetMana
42
Sub LoadImageLists()
Dim myRes As Resources.ResourceSet = _
My.Resources.ResourceManager.GetResourceSet( _
System.Threading.Thread.CurrentThread.CurrentUICulture,_
False, _
True)
Dim myEnum As IDictionaryEnumerator = _
myRes.GetEnumerator()
Do While myEnum.MoveNext
If myEnum.Key.ToString.EndsWith(16) Then
img16.Images.Add( _
myEnum.Key.ToString.ToUpper.Replace(16, ), _
System.Drawing.Icon.FromHandle( _
CType(myEnum.Value, Drawing.Bitmap).GetHicon))
End If
Loop
End Sub
Listado 5
<< dnm.inicio
inicio
Depuracin en .NET
El depurador que lo depure... recibir ayuda del CLR
Guillermo Guille
Som
Es Microsoft MVP de
Visual Basic desde 1997.
Es redactor de dotNetMana, mentor de Solid
Quality Iberoamericana,
tutor de campusMVP,
miembro de Ineta Speakers Bureau Latin America, y autor de los libros
Manual Imprescindible
de Visual Basic .NET y
Visual Basic 2005.
http://www.elguille.info
<<dotNetMana
43
<< dnm.inicio
ejecucin de la aplicacin, hacer cambios en el cdigo fuente y seguir ejecutando sin tener que volver a
empezar de cero. Y los que habitualmente usbamos
Visual Basic 6.0 incluso vimos muchas mejoras, ya que
el entorno de Visual Studio 2005 nos permite hacer
ciertos cambios en el cdigo que no podamos hacer
con VB6. Pero no voy a seguir haciendo comparaciones con Visual Basic 6.0; me voy a centrar en qu
es lo que podemos hacer y tambin en lo que no podemos hacer (ya que no podemos hacer todo lo que se
nos podra antojar: debemos tener en cuenta que todo
el proceso se realiza en tiempo de ejecucin y durante ese tiempo, el CLR debe almacenar el estado de la
ejecucin, almacenar en la pila lo que est ejecutando y otras muchas comprobaciones ms, sobre todo
cuando se produce una excepcin y hay un bloque
try/catch de por medio). Pero no empecemos con las
pegas, veamos los beneficios y ya iremos encontrndonos con las cosas que podemos y no podemos hacer
en nuestro camino hacia la tarea tediosa, pero necesaria de conseguir que nuestras aplicaciones estn
libres de fallos.
Slo mi cdigo
Cuando estamos depurando y ejecutando paso a
paso la aplicacin (ahora veremos cmo), lo lgico es
que solo queramos inspeccionar nuestro cdigo, es
decir, el cdigo que nosotros hemos escrito. Esto lo
haremos marcando la opcin Habilitar Slo mi cdigo en las opciones de depuracin (Herramientas
> Opciones > Depuracin, ver figura 2). De esta
<<dotNetMana
Puntos de interrupcin
44
<< dnm.inicio
Aunque esto no es totalmente cierto, al menos si lo tomamos al pie de la letra; ya que podemos aadir un proyecto a nuestra solucin, indicar que no se generen los
smbolos de depuracin (normalmente creando el fichero con la extensin .pdb) e incluso generarlo en modo
optimizado y an as se considera que es parte de mi
cdigo. Bueno, en realidad no se considera como nuestro, pero el IDE de Visual Studio nos advierte de que
si realmente no queremos que sea nuestro, pues... que
lo indiquemos, tal como vemos en la figura 3.
El aviso mostrado en la figura 3 nos indica que
en nuestro proyecto tenemos cdigo que no est marcado para depurar o que est marcado para ser optimizado, pero en realidad ese aviso solo se mostrar
si no generamos los smbolos de depuracin. La seleccin de la casilla de optimizacin no afecta y no ser
causante de que se muestre ese mensaje.
<<dotNetMana
45
<< dnm.inicio
<<dotNetMana
46
<< dnm.inicio
NOTA
Las teclas de depuracin paso a paso cambian segn la configuracin de Visual Studio
Es importante resaltar que las teclas [F10] y [F11] son las predeterminadas para la configuracin del
entorno de desarrollo para Visual C#,Visual Web Developer o la conocida como Configuracin general
de desarrollo. Sin embargo si hemos seleccionado la configuracin del entorno de desarrollo para Visual
Basic, esas teclas sern [Mays]+[F8] y [F8], respectivamente.
Es importante saber que la configuracin del entorno no depende del lenguaje, es decir, si trabajamos
con proyectos de Visual Basic y de C# las teclas siempre sern las mismas, ya que es el tipo de configuracin
elegido el que asignar las teclas de depuracin no el lenguaje usado.
La tecla [F9] se usa siempre, independientemente de la configuracin seleccionada.
Como truco, comentar que yo (que normalmente uso Visual Basic para desarrollar) siempre suelo configurar el entorno de trabajo usando la configuracin general, de esa forma uso siempre las teclas [F10] y
[F11] para navegar por el cdigo.
<<dotNetMana
47
<< dnm.inicio
cin a lo mejor no es tan importante, pero lo de la declaracin s que lo es, ya que no nos dar ningn error de
duplicidad de declaracin. Esto es bastante til, ya que
nos permite deshacer todo lo que hemos hecho para
probar nuevamente a ver por qu ese cdigo no funciona como esperamos.
da, tal como vemos en la figura 7. En esa misma figura vemos en rojo los puntos de interrupcin.
En la figura 7 tambin podemos apreciar que los
dos puntos de interrupcin del mtodo Saludo tienen
una marca de advertencia y no estn en rojo en la barra
de la izquierda; esto es as porque ese mtodo est
marcado con el atributo DebuggerHidden.
La flecha amarilla indica qu es lo que se ejecutar
a continuacin, es decir, que el cdigo que se resalta
an no se ha ejecutado, y si necesitamos cambiar la
localizacin de la siguiente instruccin a ejecutar, podemos cambiarla moviendo esa flecha a otra posicin
dentro del cdigo. Por supuesto, no podemos mover
ese indicador a cualquier parte, solo donde est permitido; por ejemplo, si quisiramos cambiarlo a otro
mtodo, no nos lo permitira: el cursor cambiar a un
signo de prohibido, tal como vemos en la figura 8.
<<dotNetMana
48
Cuando cambiamos la siguiente instruccin a ejecutar a una lnea anterior a la que se est ejecutando
actualmente, todo el cdigo que ya se haya ejecutado
se volver a ejecutar. Esto es lgico, pero si en ese cdigo tenemos declaraciones de variables o instanciamos
algn objeto, esas declaraciones volvern a ejecutarse
o el objeto volver a instanciarse. Lo de la instancia-
<< dnm.inicio
Conclusiones
Con lo explicado en este artculo, tendremos una visin
general de parte de lo que la depuracin con Visual
Studio 2005 (o superior) nos ofrece, aunque an quedan cosas importantes de las que hablar. Pero eso ser
en el prximo nmero de dotNetMana, en el que
veremos cmo utilizar todo lo relacionado con editar
y continuar y otras cosas relacionadas con la depuracin y deteccin de errores, mientras tanto... que lo
depure bien!
<<dotNetMana
49
todonet@qa
todotNet.qa@dotnetmania.com
Dino Esposito
Dino Esposito
es mentor de Solid
Quality Learning. Es
ponente habitual en
los eventos de la
industria a nivel
mundial.Visite su
blog en: http://weblogs.
asp.net/despos.
(todotNet.QA@
dotnetmania.com)
Parece que la mayora de desarrolladores se centra en lo que Silverlight no puede hacer todava,
en lugar de hacerlo en lo que s puede hacerse con la versin 1.0 ya liberada. As que mi pregunta es lgica: cul es el propsito de Silverlight 1.0? Soporta una pequea porcin de WPF y no
dispone de utilidades para desarrolladores, tales como controles o libreras de ayuda.Yo incluso
me preguntara si es realmente utilizable nos puede dar su visin sobre esto?
Silverlight 1.0 no es producto para desarrolladores
Web. S que es, no obstante, un producto que juega un papel estratgico en la lucha y esperamos que
derrocamiento del ya vetusto Adobe Flash. Puedes
imaginrtelo como una cabeza de puente lanzada en
el campo de batalla para proporcionar beneficios en
un futuro, pero no precisamente en este momento.
Ms concretamente, la funcionalidad que Silverlight
puede ofrecer hoy versin 1.0, como hemos dicho
se limita a las capacidades multimedia y a mostrar
documentos WPF muy simples.
El fin ltimo es decirle al mundo que Microsoft
ha sacado un anti-Flash, que cuenta, al menos, con
algunas pocas ventajas sobre ste. Primero, la descarga de documentos WPF no es una caja negra para
buscadores como Google u otros. Segundo, puede
reproducir formatos de creacin pblica, incluyendo WMV, WMA, MP3 y cualquier formato codificado en VC-1, la forma de codificacin de la mayora
de las pelculas en DVD. Y, finalmente, puede programarse utilizando un lenguaje estndar, no propietario, como Javascript. Para reproducir una pelcula desde una pgina Web, ahora podemos olvidarnos de cualquier reproductor externo (como
exista una versin beta hasta primavera. Esta versin dispondr de una gran cantidad de potentes caractersticas
programables para capacitar la creacin de una autntica capa de presentacin basada en lenguajes administrados y objetos. Esta es la situacin actual.
Asumiendo que he comprendido bien el rol y las perspectivas de Silverlight, yo dira que
WPF y Silverlight podran eventualmente convertir las aplicaciones ASP.NET y AJAX en
obsoletas. Qu le parece esa prediccin?
No es algo tan descabellado. Sin embargo, yo creo firmemente que los dos mundos, Windows y Web, van a
permanecer separados durante la mayor parte del futuro predecible. Al mismo tiempo, eso s, la llegada de WPF
y Silverlight genera posibilidades de interaccin entre la
Web y Windows que ahora mismo son impracticables o
sencillamente imposibles.
Una vez que la prxima versin de
Silverlight est disponible, podrs desarrollar para la Web con la mayora de
las facilidades que tenemos hoy da en
el escritorio. Podras incluso llegar al
punto de utilizar el mismo documento WPF para alimentar aplicaciones
Web y Windows en un sistema multicapa. Tengamos en cuenta, no obstante, que esto no sucede gratis, pero es
un escenario que el uso de patrones de
diseo adecuados (p.e., el modelo Vista-Presentador) puede hacer posible.
No estoy seguro de que la llegada
de Silverlight vaya a revolucionar el
mundo del desarrollo Web en la plataforma Microsoft hasta el punto de
eliminar a ASP.NET. Como Adobe Flash, se puede usar
Silverlight de dos formas: como el entorno o contexto
entero de una aplicacin Web, o como un reproductor
de contenidos especiales en una pgina ASP.NET estndar. Segn mi criterio, es esta segunda opcin la que
ser ms ampliamente adoptada. En otras palabras,
todava veo la Web del futuro cercano hecha de pginas
HTML con algunas islas WPF en su interior.
Silverlight 1.1 (o cual sea su nombre/nmero final)
va a ser una plataforma mucho ms potente para la Web.
Basado en el conjunto de caractersticas conocido hoy,
con el aadido de un rico conjunto de etiquetas WPF,
Silverlight 1.1 incorporar un CLR muy ligero en el
navegador (en modo multiplataforma) para procesar lenguajes administrados (como C#, Visual Basic .NET, Javascript administrado o IronPython), una versin reducida
Probablemente, necesitaremos Silverlight para continuar con la exitosa programacin basada en ASP.NET
con controles de servidor y extensiones del lado del cliente. Si Microsoft puede llegar a ofrecer esto, mi prediccin es que la mayora de los desarrolladores adoptarn
Silverlight como una poderosa herramienta para construir aplicaciones Web todava ms potentes. Por otro
lado, estamos en esta situacin debido a una extraa conjuncin astral: casi todos los navegadores soportan un
mismo (y potente) conjunto de caractersticas programables. Para que WPF y Silverlight destronaran a
ASP.NET y AJAX, todos los desarrolladores de todas las
plataformas deberan estar de acuerdo. Tecnolgicamente
hablando, no hay nada que lo impida, pero, en la prctica, yo no apostara por ello. Aunque s veo un montn
de interaccin entre ambos tipos de aplicaciones.
<<dotNetMana
TodotNet.qa@dotnetmania.com TodotNet.qa@dotnetmania.com
<< dnm.todonet@qa
51
<<dotNetMana T o d o t N e t . q a @ d o t n e t m a n i a . c o m T o d o t N e t . q a @ d o t n e t m a n i a . c o m
<< dnm.todonet@qa
52
Intent insertar un documento XAML en una pgina ASP.NET y no sucedi nada incluso en
mquinas equipadas con la ltima versin de Silverlight. De qu forma puedo consumir
contenido XAML desde una pgina ASP.NET?
Silverlight no es una aplicacin preparada para consumir cualquier contenido XAML servido a un navegador.
Si apuntas tu navegador a una URL que proporciona un
stream XAML, no deberas esperar ningn comportamiento especial en el navegador. La manera de usar Silverlight es ligeramente diferente.
Lo primero, inyectas una etiqueta <OBJECT> en una
pgina Web que apunte al motor de Silverlight para la
plataforma del navegador. El motor de Silverlight est
actualmente disponible para plataformas Mac y Windows y est siendo desarrollado para sistemas Linux por
el grupo Mono, en el marco de un proyecto que se conoce como Moonlight.
El motor de Silverlight se define en un script llamado
Silverlight.js, que debes enlazar a la pgina. Este fichero es parte del SDK de Silverlight. Contiene objetos de
ayuda, que pueden ser instanciados e inicializados para
que todo funcione como se espera. En una pgina Web
ASP.NET AJAX, usaramos el siguiente cdigo:
<script type="text/javascript">
function pageLoad()
{
var parent = $get("host");
createSilverlightHost(parent);
}
</script>
En una pgina HTML, simplemente ejecutas el cdigo en el manejador del evento onLoad de esa pgina o
puedes situar un bloque <script> dentro de la etiqueta
<body>. La funcin CreateSilverlightHost() es una funcin definida por el usuario que inicializa la ventana Silverlight. Esta funcin debe ser vinculada a la pgina de
El parmetro indica el contenedor de la ventana Silverlight, donde el contenido Silverlight ser mostrado, en
la pgina. La ventana Silverlight recibe un ID que es SilverlightControl1 en el cdigo para poder comunicar con
el resto de la pgina va Javascript. Finalmente, se definen
el tamao y la apariencia de la ventana. El contenido XAML
se identifica mediante una URL. El fichero es descargado
y procesado en forma local en el navegador del cliente.
Como el XAML se referencia mediante URL, nada impide que una aplicacin ASP.NET genere dinmicamente el
contenido utilizando un manejador HTTP.
cadena de consulta. Su interfaz de usuario est enteramente basada en Silverlight, aunque en este momento contiene un montn de cdigo de script. As que,
despus de todo, deberas considerar Tafiti como una
representacin de las funciones que obtienes hoy de
Silverlight, pero no todava del cdigo que escribirs
cuando la versin siguiente est disponible.
Un sitio Web con tales caractersticas es http://www.mlb.com. Pero Dino seguramente no es aficionado al bisbol (N. del E. T.)
<< dnm.laboratorio.net
Octavio Hernndez
Laboratorio.net
Octavio Hernndez es
Development Advisor
de Plain Concepts,
editor tcnico de
dotNetMana y tutor
de campusMVP.
Es MVP de C# desde
2004, MCSD y MCT.
ILOG Diagrammer for .NET es un potente conjunto de herramientas, componentes y libreras para
el desarrollo de aplicaciones de edicin grfica,
visualizacin, supervisin y monitorizacin para la
plataforma .NET, que simplifican sensiblemente
tareas como crear diagramas que permitan establecer o mostrar la relacin entre objetos o monitorizar los parmetros de negocios o sistemas dinmicos de la ms diversa ndole. Las figuras 1 y 2
muestran ejemplos de tales actividades: mientras
que en la figura 1 se presenta una aplicacin que
permite crear y manipular grficamente diagramas
BPM (Business Process Management), en la figura 2
se muestra una aplicacin que simula la monitorizacin en tiempo real del comportamiento del
trfico en tneles subterrneos al estilo de los
recientemente inaugurados en Madrid. Estas dos
aplicaciones forman parte de los ejemplos que se
entregan con el producto.
Como complemento de las libreras que componen el SDK de ILOG Diagrammer for .NET, desarrollado al 100% en C#, la instalacin del producto
Studio (figura 3) se enriquece con un amplio conjunto de smbolos grficos pre-programados que estn a
nuestra disposicin desde el primer momento. Estos
smbolos no representan otra cosa que clases, por lo
que podemos aplicar sobre ellos los patrones familiares de desarrollo basados en el modelo PEM (Propie-
<<dotNetMana
Ficha tcnica
53
<< dnm.laboratorio.net
dades-Eventos-Mtodos). El resto ya seguramente lo imagina el lector: los smbolos de la librera de ILOG Diagrammer
siguen un modelo de arquitectura abierta, y el segundo tipo de proyectos antes
mencionado permite precisamente desarrollar nuevas libreras de smbolos para
reutilizar en nuestros propios proyectos
o distribuir a terceros.
Caractersticas principales
<<dotNetMana
54
<< dnm.laboratorio.net
Noticias
Infragistics (www.infragistics.com) acaba de sacar al mercado NetAdvantage for
.NET volumen 3, una nueva edicin de la popular suite de herramientas de interfaz
de usuario para Windows y la Web. Entre las novedades ms significativas de esta edicin estn la inclusin de nuevas metforas de navegacin asociadas a la experiencia
de usuario de Windows Vista y la adicin de nuevas posibilidades de exportacin a
XPS y PDF para permitir nuevos escenarios de comparticin de documentos y generacin de informes, en lo que respecta a NetAdvantage for ASP.NET. Asimismo, la
empresa ha presentado la CTP (Community Technology Preview) de Aikido, un nuevo
marco de trabajo para ASP.NET basado en AJAX.
Iron Speed (www.ironspeed.com) ha puesto a disposicin del pblico Iron Speed
Designer v. 5.0, una nueva versin de este potente generador de generacin automtica de aplicaciones Web, que incorpora una cantidad realmente impresionante de
novedades que harn el producto an ms til y productivo para sus usuarios.
Business Objects (www.businessobjects.com) acaba de anunciar Crystal Reports
2008, nueva versin (la duodcima) de la conocida herramienta de creacin y ejecucin de informes que permitir a los usuarios alcanzar una mayor productividad, condensar una mayor cantidad de informacin en un informe evitando as la proliferacin
de stos, aumentar la interactividad de los informes e integrar objetos de Flash, Flex
y Xcelsius para producir informes ms impactantes.
En el marco de esta seccin, dotNetMana describir en prximas ediciones las caractersticas
principales de estos productos.
Conclusin
En este artculo hemos descrito las principales posibilidades que ofrece ILOG
Diagrammer for .NET, un potente marco de trabajo en cdigo manejado para
el desarrollo de interfaces grficas interactivas para Windows y la Web. El alto
precio de salida del producto est sin
duda ms que justificado por la calidad y
las prestaciones que ofrece; invito al lector a descargar la versin de evaluacin
[1] y comprobarlas por s mismo.
Referencias
[ 1]
<<dotNetMana
de tipos de conectores: rectos, curvilneos, ortogonales, etc. para enlazar los nodos entre s. Adicionalmente, el producto incluye toda una
serie de servicios avanzados como la
deteccin de intersecciones entre
conectores o la interconexin entre
diferentes grafos.
Distribucin automtica de grafos.
ILOG Diagrammer for .NET ofrece un conjunto sofisticado de algoritmos para la distribucin automtica de los nodos y los conectores, que
a la vez que intentan satisfacer objetivos generales como la minimizacin
del rea de dibujo necesaria, la minimizacin de la cantidad de intersecciones entre conectores, entre otros,
permiten al usuario de una manera
rpida distribuir los nodos del grafo
en dependencia del tipo de diagrama
que desea crear. Entre los algoritmos
de distribucin disponibles estn:
Jerrquico. Generalmente utilizado
en aplicaciones de ingeniera elctrica (diagramas de circuitos), ingeniera industrial (diagramas de procesos), gestin de software (diagramas UML, diagramas de flujo).
Arbreo. Ideal para la representacin de diagramas organizativos,
diagramas de bases de datos o
mapas de sitios Web.
Guiado por fuerza (force directed).
Utilizado en diagramas de redes de
telecomunicaciones o redes semnticas, entre otras aplicaciones.
55
comunidad.net
European Silverlight Challenge
El concurso de desarrollo de Silverlight se ha ampliado a toda Europa, aumentando tambin los premios. INETA Europa (http://europe.ineta.org), en colaboracin con Microsoft, ha preparado esta competicin que ya ha empezado y que
finalizar el da 31 de enero de 2008.
La competicin se realizar en dos fases:
1. Competiciones Nacionales. Estas se realizarn de forma local en cada pas
bajo la supervisin y apoyo del equipo de INETA.
2. Competicin Europea (Gran Final). En ella participarn solo los participantes que hayan obtenido el primer premio con su aplicacin ganadora.
Si crees en tu talento, apntate y participa en la competicin European Silverlight Challenge y gana, adems del reconocimiento de la comunidad, fabulosos premios por un valor total de 160.000 (segn precio de mercado), incluyendo tickets para el MIX 2008 (con viaje y estancia incluidos), suscripciones
MSDN, etc.
El objetivo de la competicin es desarrollar una aplicacin, mdulo o componente .NET en la que su interfaz de usuario est desarrollada con la tecnologa Silverlight. Esta participacin deber acatar la licencia MS-PL para poder
ser distribuida y utilizada gratuitamente por grupos de usuarios de INETA o de
cualquier otra comunidad en sus sitios Web y comunidades tcnicas online.
Ms informacin en http://silverlightchallenge.eu. Para participar en la competicin espaola: http://desafiosilverlight.bcndev.net.
3 Aniversario GUSE.NET
Durante los das 23, 24 y 25 de noviembre se celebr el III Aniversario de
Gusenet, en Santa Pola (Alicante). Como
ya viene siendo habitual en este evento,
intentamos combinar las sesiones tcnicas con un poquito de ocio que adems
pueda ser compartido por nuestras parejas, con el objetivo de pasar un fin de semana completo, con diversas cenas, comidas,
visitas organizadas por la ciudad, etc.
Tuvimos una agenda interesante, en la que pudimos contar con excelentes ponentes,
y compuesta por dos sesiones sobre novedades que vamos a encontrar en Visual Studio 2008 y una mesa redonda sobre el pasado, presente y futuro del grupo, con aportaciones interesantes que empezaremos a poner en prctica en prximos eventos.
Centrndonos en las sesiones tcnicas, comenzamos con una charla de nuestro
amigo Guille, que nos habl de las novedades de VB9, consiguiendo, adems de
transmitir de forma muy clara dichas novedades, hacer una sesin muy amena, cargada de bromas y risas. Y cmo no, aprovech para vender algn libro, camisetas
cuyo importe ser donado a DotNetSolidario, y hacer algunos regalos.
A continuacin pudimos contar con David Salgado, de Microsoft Ibrica, quien
nos habl principalmente de AJAX, haciendo una sesin muy interesante y participativa, donde invit al pblico a hacerle todo tipo de preguntas, incluidas aquellas que no
iban directamente relacionadas con el tema en cuestin, consiguiendo as una excelente comunicacin con el pblico, que pudo resolver cualquier duda que plante.
Yo, Robot
Si desarrollas con tecnologa Microsoft, debes saber que no
solo puedes crear aplicaciones comerciales con Visual Studio, tambin puedes divertirte y mucho. En esta charla veremos algunas aplicaciones de Microsoft Robotics Studio y
LEGO Mindstorm, cmo trabajar con Visual Studio .NET
y un WiiMote, cmo controlar un helicptero utilizando
Visual Studio y alguna sorpresita ms.
El viernes 14 de diciembre tendr lugar en el saln de
actos del Hospital Juan Ramn Jimnez de Huelva el
evento "Yo, Robot".
Registro: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032358807&Culture=es-ES.
Como siempre, despus del evento colgaremos los
materiales disponibles en nuestra seccin de eventos
(http://www.onobanet.com/eventos/eventos.aspx).
biblioteca.net
Microsoft Expression Web Plain & Simple
Katherine Murray
Editorial: Microsoft Press
Pginas: 256
Publicado: octubre de 2007
ISBN: 978-0735625198
Idioma: ingls
Estamos trabajando con Expression Web desde su aparicin, y la impresin es positiva, as que una obra sobre este tema (una de las primeras) merece la pena citarse, especialmente cuando viene directamente de la casa.
Es una obra cortita, que se lee casi- del tirn, y decimos casi, porque merece la pena
perderse un poco en algunos de los ejercicios prcticos que presenta, para adquirir soltura con un producto que, una vez controlado, puede ser muy productivo. Que nadie
espere anlisis en profundidad, pero es una obra idnea para los que se estn iniciando
con las capacidades de la herramienta (que son bastantes). Cubre todas las tareas fundamentales para la creacin de sitios profesionales y se deja ver la experiencia de la autora
(a ms de la de usuario): tiene ms de 40 libros publicados. Su lectura resulta didctica y
divertida.
C# 3.0 y LINQ
Octavio Hernndez Leal
Editorial: Krasis Press
Pginas: 290
Publicado: noviembre de 2007
ISBN: 978-8493548919
Idioma: castellano
novedades
Es un placer comentar esta obra por varias razones (algunas personales): es una de las
primeras en su gnero que se publican en castellano; algunas partes de su contenido las
habr podido leer el lector en esta revista; y adems se trata del Editor Tcnico de dotNetMana. Una obra corta, pero, a diferencia de la anterior, intensa. Hay que decir tambin que, debido al formato de publicacin que utiliza Krasis con muy cuidada encuadernacin en carton, las casi 300 pginas del libro dan para bastante ms de lo que se
podra adivinar detrs de esa cifra.
Octavio Hernndez repasa en los primeros cuatro captulos las novedades aportadas por el lenguaje a partir de la versin 2.0 (especialmente los tipos genricos),
para pasar, a continuacin, a abordar los fundamentos de LINQ y su reflejo en el lenguaje C# 3.0 y su librera bsica de apoyo (LINQ to Objects). La ltima parte del
libro describe las posibilidades que ofrecen los principales proveedores de LINQ
contenidos en .NET 3.5, junto a abundantes ejemplos, probados hasta la ltima coma
(perdn, punto y coma).
desvn
Marino Posadas
<<dotNetMana
58
noticias.noticias.noticias
documentos en la red
Utiliza Captchas como
Webmaster? Si cree que son
seguros, no se pierda este artculo sobre las vulnerabilidades
de estos grficos que supuestamente permiten diferenciar la
percepcin humana de las acciones de los bots en la red. En el
artculo Has CAPTCHA Been "Broken"? (http://www.codinghorror.com/blog/archives/001001.html), Jeff Atwood (Coding
Horror) analiza las vulnerabilidades de estos mecanismos e
incluso indica la pgina Web de un hacker chino que consigue
romper la mayora de ellos.
SQL Server 2008 podr ser administrado mediante
PowerShell! Jeffrey Snover (Microsoft) anunciaba recientemente en el blog del equipo de desarrollo de Windows
PowerShell esta noticia que sin duda merece la pena leer
tanto si se est en el mundo de IT, como en el de desarrollo o se es un DBA. Para ms datos, visitar:
http://blogs.msdn.com/powershell/archive/2007/11/13/
sql-server-support-for-powershell.aspx.