DataGrid Desde Archivo XML

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 19

DataGrid desde archivo XML

El control DataGrid puede conectar con bases de datos, como se ha visto, pero tambin puede leer los datos desde un archivo XML, de texto plano y fcilmente accesible desde cualquier editor de texto o navegador de Internet, con las ventajas que so conlleva frente a formatos propietarios de bases de datos. Almacenar datos en formato XML tiene algunas ventajas destacadas:

no dependemos de etiquetas preestablecidas, como sucede con HTML, sino que podemos crear nuestras propias etiquetas y, si el archivo cumple el estndar XML, sern reconocidas. como el formato XML se basa en texto plano, se evita la necesidad de tener instalados los programas que entienden formatos espec ficos de bases de datos. XML es fcilmente portable entre almacenes de datos diferentes y distintas plataformas. al tratarse de texto plano, es capa! de penetrar los cortafuegos , evitando problemas de seguridad que aparecen al abrir paso a otros tipos de archivos capaces de causar da"os.

Ordenar el DataGrid Es posible configurar maneras diferentes de ordenar los registros del DataGrid , pero la ms sencilla de ellas es aprovechar propiedades y mtodos del propio control para que los t tulos de las columnas se convierten en hiperv nculos que, al ser pulsados, ordenen los registros en base al nombre del campo que muestra esa columna. #os pasos para conseguir ordenar el DataGrid al pulsar en el t tulo de la columna son poco complejos pero es necesario remarcarlos:

En la etiqueta asp:DataGrid hay que definir las claves AllowSorting= "True" y OnSortCommand="ordenarGrid". $asp:%ata&rid Allo'(orting)*+rue* ,n(ort-ommand)*ordenar&rid*.

En las columnas enla!adas con los campos de la tabla se define la propiedad SortExpression="valor" donde valor es una cadena con el nombre del campo. #a propiedad DataGridColumn.SortExpression obtiene o establece el nombre del campo o expresi/n que se va a pasar al mtodo OnSortCommand cuando se selecciona una columna para ordenarla. $asp:+emplate-olumn 0eader+ext)*1ombre* (ortExpression)*1ombre*. $0eader(tyle hori!ontalalign)*-enter*.$20eader(tyle. $3tem+emplate. $asp:+ext4ox id)*1ombre* runat)*server* text)5$67 -ontainer.%ata3tem8*1ombre*9 6.5 2. $23tem+emplate. $2asp:+emplate-olumn.

(i se habilita la ordenaci/n, se procesan los controles Lin !utton en la secci/n de encabe!ado de cada columna donde est establecida la propiedad SortExpression. #os controles Lin !utton aceptan pulsaciones como hiperv nculos.

-uando se hace clic en un control Lin !utton de una columna, se provoca el evento SortCommand. El valor de SortExpression de la columna seleccionada se pasa al controlador de eventos OnSortCommand como parte del objeto DataGridSortCommandEventArgs.

El mtodo ordenarGrid asociado al evento OnSortCommand ha de ser desarrollado en el c/digo Visual Basic. (ub ordenar&rid8sender As ,bject, e As %ata&rid(ort-ommandEventArgs9 5-rear un %ata:ie' para presentar los datos ordenados. 5%ata:ie' permite personali!ar las vistas de una tabla. 5%ata:ie' lee la tabla, ordena los registros con arreglo 5a la propiedad (ortExpression del objeto %ata&rid(ort-ommandEventArgs 5y los muestra con esa vista, despus se enla!a de nuevo el %ata&rid 5al origen de los datos %im dt As %ata+able ) 1e' %ata+able 5&enerar una instancia de %ata(et %im ds%atos; As %ata(et ) ds%atos89 dt ) ds%atos;.+ables8<9 %im dv As %ata:ie' ) 1e' %ata:ie'8dt9 dv.(ort ) e.(ortExpression =ejilla.%ata(ource ) dv =ejilla.%ata4ind89 End (ub

Modificar el DataGrid >ara que el usuario pueda modificar los datos del DataGrid mientras est conectado a ellos, tenemos ; maneras principales de hacerlo:

usar Bound olu!n que, por defecto, es el @nico tipo de columna capa! de cambiar a campos modificables. El otro tipo de columna usada para contener registros en el DataGrid es Te!plate olu!n, que mantiene su aspecto original. -on este mtodo se pierde control al interpretar los campos de la tabla 8ej: los cuadros de texto pueden ser mucho ms largos que la celda que los contiene9. usar cuadros de texto 8asp"TextBox 9 dentro de elementos #ditIte!Te!plate incluidos en columnas Te!plate olu!n. %e esta manera hay menos eventos que vigilar y se tiene mayor control sobre las caracter sticas del DataGrid .

En este ejercicio se ha elegido la segunda manera: $asp:+emplate-olumn 0eader+ext)*1ombre*. $0eader(tyle Aidth)*B<<px* 0ori!ontalAlign)*#eft*.$20eader(tyle. $3tem+emplate. $67 -ontainer.%ata3tem8*1ombre*9 6. $23tem+emplate. $Edit3tem+emplate. $asp:+ext4ox id)*txt1ombre* Aidth)*;CDpx* +ext)5$67 -ontainer.%ata3tem8*1ombre*96.5 runat)*server* 2. $2Edit3tem+emplate. $2asp:+emplate-olumn. #as columnas del DataGrid que contienen los enlaces a los mtodos de edici/n de registros son diferentes, en este ejercicio se han empleado asp:Lin !utton en las que se definen los comandos #dit, Delete, ancel y $pdate:

$asp:+emplate-olumn. $3tem+emplate. $asp:#inE4utton -ommand1ame)*Edit* +ext)*Editar* runat)*server* 3%)*btEdit* 2. $asp:#inE4utton -ommand1ame)*%elete* +ext)*4orrar* runat)*server* 3%)*bt%elete* 2. $23tem+emplate. $Edit3tem+emplate. $asp:#inE4utton -ommand1ame)*-ancel* +ext)*-ancelar* runat)*server* 3%)*bt-ancel* 2. $asp:#inE4utton -ommand1ame)*Fpdate* +ext)*Actuali!ar* runat)server* 3%)*btFpdate* 2. $2Edit3tem+emplate. $2asp:+emplate-olumn. El nombre de los mtodos que se ejecutarn en cada uno de estos comandos se define en la etiqueta asp:DataGrid $asp:%ata&rid ,n%elete-ommand)*cm%elete* ,n-ancel-ommand)*cm-ancel* ,nFpdate-ommand)*cmFpdate* ,nEdit-ommand)*cmEdit*. %espus hay que definir en el c/digo :isual 4asic cada uno de estos mtodos, como ejemplo, vemos el que activa el modo de edici/n "mEdit: 5>rocedimiento al pulsar el bot/n E%3+A= del control %ata&rid 5Este controlador para el evento cmEdit 8evento del tipo Edit-ommand9 5establece la propiedad Edit3tem3ndex en la fila seleccionada (ub cmEdit84y:al (ender As ,bject, 4y:al e As %ata&rid-ommandEventArgs9 5Editar el elemento cuyo ndice coincide con el de la fila elegida rejilla.Edit3tem3ndex ) -3nt8e.3tem.3tem3ndex9 5Enla!ar de nuevo los datos al control %ata&rid rejilla.%ata(ource ) ds%atos89 rejilla.%ata4ind89 End (ub , el que activa el modo de edici/n "mDelete : 5>rocedimiento al pulsar el bot/n 4,==A= (ub cm%elete8(ender As ,bject, e As %ata&rid-ommandEventArgs9 5&enerar una instancia de %ata(et %im ds%atos; As %ata(et ) ds%atos89 5Entero que contiene el ndice de la fila seleccionada %im fila As 3nteger ) -3nt8e.3tem.3tem3ndex9 5Eliminar la fila seleccionada ds%atos;.+ables8<9.=o's8fila9.%elete89 5Escribir el contenido del %ata(et en el archivo GH# ds%atos;.AriteGml8(erver.Hap>ath8*..2datos2agenda;.xml*99 5Iuitar el modo de edici/n a la fila seleccionada: 5Edit3tem3ndex igual a J? desactiva el modo de edici/n rejilla.Edit3tem3ndex ) J? 5Enla!ar de nuevo los datos al control %ata&rid rejilla.%ata(ource ) ds%atos89 rejilla.%ata4ind89 End (ub %ro&le!as de seguridad al generar la p'gina aspx (i al generar la pgina dinmica aspx aparece un error de compilaci/n relacionado con un mensaje del tipo: * Ex"eption Details: S#stem.$naut%ori&edA""essEx"eption: El a""eso a la ruta "ruta'al'ar"%ivo'xml" %a sido denegado. Asp .(ET no est) autori&ado a a""eder al re"urso ;

soli"itado...* posiblemente la carpeta en que se encuentra el archivo XML no tenga concedidos por 33( permisos de escritura 8se soluciona fcilmente configurando los permisos de II( con la herramienta %SystemRoot%\System32\Inetsrv\iis.msc y a"adiendo permisos de escritura a ese directorio haciendo clic con el bot/n derecho sobre l y entrando en la pesta"a Dire"torio*. (i con ello el error no desaparece, entonces lo ms probable sea que la carpeta que contiene el archivo XML no tenga, entre los grupos de usuarios que tienen permiso para acceder a ella, el grupo )o!&re*de*!'quina+,(% -)#T 8AS+.(ET ,a"%ine A""ount9 o, en caso de tenerlo, este grupo ,(% -)#T no tenga concedidos los permisos adecuados de modificaci/n y escritura, en cualquiera de los ; casos hay que entrar en la configuraci/n de seguridad de la carpeta 8clic con el bot/n derecho sobre la carpeta, elegir +ropiedades y seleccionar la pesta"a Seguridad para a"adir o modificar el grupo apropiado, remarcar la cuenta ,(% -)#T y marcar las casillas de verificaci/n deseadas9. >ara los usuarios de .indo/s X% Ho!e, conviene recordar que la pesta"a Seguridad de las carpetas y archivos s/lo est disponible si se entra en el sistema en modo seguro, para ello hay que pulsar 01 justo antes de que se inicie el arranque de Aindo's y elegir ,odo seguro en el men@ que se muesta en pantalla.

NOTA: >ara que el c/digo de la aplicaci/n sea ms legible, se ha separado en ; archivos, la pgina aspx contiene el c/digo HTML J ,sp-)#T y un archivo externo v& contiene el c/digo Visual Basic 8"-digo de apo#o9.

2!o pintar una ta&la en un 3ichTextBox con Visual Basic -)#T

Introducci2n #a interfa! que ofrece la versi/n .1E+ del control =ich+ext4ox est fundamentalmente orientada al texto. (i queremos dibujar las l neas de una tabla o queremos insertar una imagen tenemos que introducir c/digo =+K *a mano*. A continuaci/n mostrar una clase que genera un documento que contiene una tabla con su t tulo, pero antes crearemos un sencillo documento en formato =+K que nos servir de introducci/n. Este art culo es una muy somera introducci/n a la especificaci/n =+K. (i el lector desea profundi!ar en este inmenso mundo aqu tiene los enlaces a las versiones ?.D y ?.L. $n sencillo docu!ento 3T0 Introducci2n #a especificaci/n =+K define un conjunto de c/digos o *palabras de control* 8control 'ords9 que se insertan en documentos de texto. Estos c/digos, le dos por un lector =+K, son transformados en formato. El control =ich+ext4ox es un lector =+K. :eremos el m nimo c/digo indispensable para aplicar formato al =ich+ext4ox. Algunos de los rasgos que vamos a generar, como el color de fondo del texto o las mismas celdas de una tabla, son imposibles de obtener si no es introduciendo c/digo =+K a mano. #l c2digo o la pala&ra de control 4control /ord5 0e aqu , con un ejemplo, su sintaxis: 6trgaph789 6 trgaph 789 Hargen i!quierdo de una tabla ) ?M< t'ips 3nicio de la palabra de control (ecuencia de caracteres que forman la palabra de control >armetro

+oda palabra de control se compone de la barra 6 seguida de letras min@sculas de la a a la : y un parmetro escrito inmediatamente a continuaci/n, sin parntesis o corchetes. 1o todas las palabras de control necesitan parmetro. El fin de la palabra de control y el comien!o de una cadena de texto viene marcado por un espacio que forma parte de la palabra de control y por tanto no se imprime ni aparece en pantalla. >or ejemplo: 6int&l :en. %ame tu presencia6cell 6int&l marca el inicio de una fila de una tabla, y 6cell el final de una celda. >ues bien, el espacio que sigue a la palabra 6int&l le indica al lector que lo que viene a continuaci/n ha de ser considerado el texto de la celda, y as ser hasta que se tropiece con la barra 6, inicio de una palabra de control. #l enca&e:a!iento +odo documento =+K va encerrado en llaves ;< y se compone de encabe!amiento y documento propiamente dicho. El encabe!ado se compone de una l nea inicial y una serie de tablas. #a sintaxis de la l nea inicial es la siguiente: 8la letra ) may@scula representa un parmetro numrico. #os corchetes $. encierran una explicaci/n, no pertenecen al c/digo9 6rtf)$declaraci/n de la tabla de caracteres usada.6deff)$declaraci/n del lenguaje utili!ado. El parmetro de 6rtf identifica la versi/n de la especificaci/n =+K utili!ada. Aunque se utilice la @ltima versi/n que es la ?.M y es la que entiende Aord ;<<B, y mientras no se publique una versi/n ;.< y nuestro lector la entienda, este parmetro ha de ser 7. 1o nos vamos a molestar en descubrir el resto de los c/digos que componen esta l nea inicial porque se los vamos a preguntar al =ich+ext4ox y nos va a cantar la l nea entera. Antes, sin embargo, veremos las tablas, que tambin tenemos preguntas que hacerle al respecto.

%e las seis tablas que pueden definirse en el encabe!ado 8de fuentes, de archivos, de colores, de estilos, de listas y de marcas de revisi/n9 s/lo la de fuentes es obligatoria, y ha de ir la primera. +odas las dems, si aparecen, se colocarn en el orden en que las he enumerado. 1osotros s/lo necesitaremos la tabla de fuentes y la de colores. La ta&la de fuentes #a tabla de fuentes contiene las definiciones de todas las fuentes utili!adas en el documento. Fn cambio de tipo de letra dentro de un documento =+K no se se"ala con la inserci/n de la definici/n de la nueva fuente en el mismo texto, sino con una referencia a la posici/n que ocupa esa definici/n en la tabla de fuentes. 3gual sucede con los colores que veremos luego. 0e aqu un ejemplo de una tabla que contiene dos definiciones de fuentes: 8una est pintada de rojo y la otra de verde9 ;6fontt&l;6f96fnil6fcharset9 Verdana=<;6f76fnil6fcharset9 Microsoft (ans (erif=<< #a tabla entera se encierra entre llaves ;<. En primer lugar figura la palabra 6fontt&l, y despus, tambin encerradas entre llaves y terminadas por un punto y coma =, cada una de las definiciones de las fuentes utili!adas en el documento. -ada fuente se compone de al menos cuatro c/digos: ;6f96fnil6fcharset9 Verdana=< 6f) 6fnil 6fcharset) Verdana Ondice de la fuente en la tabla que servir para referenciarla desde el documento Kamilia. fnil es el valor por defecto. ,tras opciones son 6fro!an, fs/iss, 6f!odern, etc. +abla de caracteres para los que est definida la fuente. 1ombre de la fuente. 1o le precede la barra 6 sino un espacio

+odo lo que podemos descubrir por nosotros mismos es el ndice 6f) y el nombre de la fuente. El ndice de la tabla de caracteres de cada fuente est recogido en el archivo =+K%EK(.0. 1unca he visto ese archivo. P aunque lo viera: no sabemos qu tipos de letra tendr instalados el usuario de nuestro flamante =ich+ext4ox. 1o nos queda otra opci/n que someter al =ich+ext4ox a despiadado interrogatorio. #a propiedad -3tf del control =ich+ext4ox es la v a de entrada y salida del c/digo =+K le do y escrito por l y la condici/n de posibilidad de este art culo. +odo lo que tenemos que hacer es asignarle un peque"o texto y la fuente que queramos definir. leer su propiedad .=tf y discriminar lo que nos interese. Aqu est el c/digo que extrae la primera l nea del encabe!amiento: =ich+ext4ox?.-lear89 =ich+ext4ox?.+ext) *-ualquier +exto* =ich+ext4ox?.Kont ) Korm.%efaultKont %im t As (tring ) =ich+ext4ox?.=tf 5A la primera l nea le sigue obligatoriamente la tabla de fuentes %im ! As 3nteger ) t.3ndex,f8*QRfonttblQ*9 >rimera#inea ) t.(ubstring8<, !9 P aqu el que extrae la definici/n de una fuente: =ich+ext4ox?.-lear89 =ich+ext4ox?.+ext) *-ualquier +exto* =ich+ext4ox?.Kont ) Korm.%efaultKont %im t As (tring ) =ich+ext4ox?.=tf %im rr89 As (tring 5#oclai!o el nombre de la fuente y parto el texto en dos rr ) (plit8t, f.KontKamily.1ame9 5=astreo la llave i!quierda %im E? As 3nteger ) rr8<9.#ast3ndex,f8*Q*9 5y extraigo el fragmanto a partir de ella %im s? As (tring ) rr8<9.(ubstring8E?9 5=astreo la llave derecha %im E; As 3nteger ) rr8?9.3ndex,f8*S*9 5y extraigo el fragmanto hasta ella %im s; As (tring ) rr8?9.(ubstring8<, E; T ?9 5Fno las tres pie!as y ya tengo 5Q#a cadena completa entre llavesS %im s As (tring ) s? U f.KontKamily.1ame U s; 5sustituyo el ndice cero 5por el que ser correcto en mi documento %efinici/nKuente ) s.=eplace8*QRf<R*, *QRf* U 3ndice U *R*9

Es conveniente que el =ich+ext4ox al que interrogamos se mantenga lejos de la vista del usuario de nuestra aplicaci/n, que no es cosa de ir por ah ense"ando nuestras miserias. La ta&la de colores 3gual que la tabla de fuentes enumera todas las fuentes utili!adas en el documento, la de colores enumera todos los colores. Aqu tenis un ejemplo de una tabla que enumera los tres colores bsicos: Q Rcolortbl Rred;DDRgreen<Rblue<V Rred<Rgreen;DDRblue<V Rred<Rgreen<Rblue;DDV S #a palabra introductoria es 6colort&l. #as definiciones de los colores no van encerradas entre llaves ni numeradas. El documento se refiere a ellas por su posici/n en la tabla: la primera es la n@mero ?, la segunda la n@mero ;, etc. 1o necesito decir que no necesitamos la asistencia del =ich+ext4ox para generarlas. 1os basta una l nea de c/digo: >rivate Kunction %efinicion-olor84y:al c As -olor9 As (tring =eturn (tring.Kormat8*RredQ<SRgreenQ?SRblueQ;SV*, c.=, c.&, c.49 End Kunction Pa podemos comen!ar a escribir nuestro documento =+K: 8#a especificaci/n =+K, que yo sepa, no admite comentarios, sin embargo los incluir al estilo :isual 4asic9 5#lave de apertura de documento Q 5# nea inicial Rrtf?RansiRansicpg?;D;Rdeff<RdeflangB<W; 5+abla de fuentes Q Rfonttbl QRf<RfnilRfcharset< :erdanaVS QRf?RfnilRfcharset< Hicrosoft (ans (erifVS S 5+abla de colores Q Rcolortbl Rred;DDRgreen<Rblue<V Rred<Rgreen;DDRblue<V Rred<Rgreen<Rblue;DDV S P aqu termina nuestro encabe!amiento. >ara lo que vamos a hacer no necesitamos ms. #l docu!ento +odos los documentos que he generado con el =ich+ext4ox incluyen inmediatemente despus del encabe!ado la siguiente l nea: Rvie'EindNRuc? %ejo al vido lector que consulte su significado en la especificaci/n =+K. #a marca de prrafo es 6par. y se coloca al final del prrafo. >odemos ya escribir, por tanto, un documento =+K completo compuesto de un s/lo prrafo 8pinto el c/digo de a!ul y dejo el texto de negro9 8R5eC es el c/digo =+K que representa la e con tilde >. 1o merece la pena detenerse en este detalle, el =ich+ext4ox sabe c/mo representar tildes y dems caracteres especiales9: QRrtf?RansiRansicpg?;D;Rdeff< QRfonttblQRf<RfnilRfcharset< #ucida -onsoleVSS Rvie'EindNRuc? 4ueno es saber que los vasos nos sirven para beberV lo malo es que no sabemos para quR5eC sirve la sed. Antonio Hachado. -ampos de -astilla.RparS El output de este documento es simplemente una l nea de texto: 4ueno es saber que los vasos nos sirven para beberV lo malo es que no sabemos para qu sirve la sed. Antonio Hachado. -ampos de -astilla.

Al no llevar ninguna indicaci/n de formato, el texto toma el tipo de letra definido en primer lugar en la tabla de fuentes y los dems rasgos por defecto, que son aqullos que hayamos asignado previamente el =ich+ext4ox. A"adiremos poco a poco rasgos al texto para que tenga pinta de poes a En primer lugar introduciremos los saltos de l nea insertando c/digos 6par y tabularemos las l neas con c/digos 6ta&. Adems de tabular la l nea tambin podemos justificarla introduciendo c/digos 6ql 8justificaci/n a la i!quierda9 6qr 8a la derecha9 o 6qc 8l nea centrada9 al principio de la l nea. 1o los vamos a utili!ar aqu , lo dejaremos para que experimente el lector. Rtab 4ueno es saber que los vasosRparRtab nos sirven para beberVRparRtab lo malo es que no sabemosRparRtab para quR5eC sirve la sed.RparRtab Antonio Hachado. -ampos de -astillaRpar 8Hientras no var e el encabe!ado, no lo repito9 Output: 4ueno es saber que los vasos nos sirven para beberV lo malo es que no sabemos para qu sirve la sed. Antonio Hachado. -ampos de -astilla Fn c/digo 6par nace cuando pulsamos la tecla 3ntro, y cada fragmento de texto terminado por un c/digo 6par se considera un prrafo. A continuaci/n personali!aremos el tipo de letra. Actuali!aremos la tabla de fuentes e introduciremos en el texto referencias a las definiciones de la tabla mediante el c/digo 6f), donde ) es el ndice de la definici/n. -opio el documento entero: QRrtf?RansiRansicpg?;D;Rdeff<RdeflangB<W; QRfonttbl QRf<RfnilRfcharset< +ahomaVS QRf?RfnilRfcharset< -ourier 1e'VSS Rvie'EindNRuc? Rf<Rtab 4ueno es saber que los vasosRpar Rtab nos sirven para beberVRpar Rtab lo malo es que no sabemosRpar Rtab para quR5eC sirve la sed.Rpar RtabRf? Antonio Hachado. -ampos de -astillaRparS Output: 4ueno es saber que los vasos nos sirven para beberV lo malo es que no sabemos para qu sirve la sed. Antonio Hachado. -ampos de -astilla ,bserve mi paciente lector que una marca de formato en un prrafo se transmite a los siguientes. El tipo de letra de ndice cero se ha propagado por todos los prrafos hasta que ha trope!ado con el ndice ?. Esto es porque los prrafos heredan el formato del anterior. (i queremos evitar la herencia y for!ar a un prrafo a volver al formato por defecto, lo iniciaremos con la palabra de control 6pard. %e hecho, el primer prrafo despus del encabe!ado comien!a siempre con 6pard. #o reflejaremos en todos los ejemplos a partir de ahora. :eamos ahora el coloreado del texto: QRrtf?RansiRansicpg?;D;Rdeff<RdeflangB<W; QRfonttbl QRf<RfnilRfcharset< +ahomaVS QRf?RfnilRfcharset< -ourier 1e'VSS QRcolortbl VRred?MDRgreenC<Rblue;<VS Rvie'EindNRuc? RpardRcf?Rf<Rfs;NRtab 4ueno es saber que los vasosRpar Rtab nos sirven para beberVRpar Rtab lo malo es que no sabemosRpar Rtab para quR5eC sirve la sed.Rpar Rcf<Rf?Rtab Antonio Hachado. -ampos de -astillaRparS

Output:
M

4ueno es saber que los vasos nos sirven para beberV lo malo es que no sabemos para qu sirve la sed. Antonio Hachado. -ampos de -astilla %ijimos que el color no lleva ndice, sino que se referencia mediante su posici/n en la tabla comen!ando por el n@mero ?. >ues bien, el c/digo que inserta una marca de color es 6cf), donde ) indica la posici/n del color en la tabla. >ero si el primer color es el n@mero ?, Xpor qu el @ltimo prrafo lleva 6cf9Y >orque algunas palabras de control admiten el parmetro 9 que act@a como si fuera una eti.ueta de "ierre. 6cf9 fuer!a al texto que le sigue a pintarse con el color por defecto en ve! de heredar el color del prrafo anterior. >ronto veremos otras palabras de control que admiten parmetro 9. #a palabra de control 6fs) establece el tama"o de la fuente medido en *medios puntos*. As , el valor 6fs?@ indica un tama"o similar al que resultar a de la expresi/n Kont?.(i!e ) ?; En esta tabla presento otros c/digos muy habituales con su mar"a de "ierre incluida que a"aden formato al documento : =asgo 1egrita -ursiva (ubrayado +achado =esaltado Apertura 6& 6i 6ul 6striAe 6highlight) -ierre 6&9 6i9 6ul9 o 6ulnone 6striAe9 6highlight9

El parmetro ) de la palabra de control 6highlight) apunta a un color de la tabla de colores igual que cf). 6ul crea un subrayado continuo. El control =ich+ext4ox admite ms estilos de subrayado, as que relaciono los c/digos a continuaci/n 8no los he comprobado todos, qui! alguno no funcione9: -ontinuo %oble &rueso (/lo palabras ,ndulado 6ul 6uld& 6ulth 6ul/ 6ul/ave >unto =aya >unto =aya >unto >unto =aya Kin de subryado 6uld 6uldash 6uldashd 6uldashdd 6ulnone

=ecapitulemos todo lo que hemos aprendido y pongmoslo en acci/n:

La ta&la Fna tabla es una secuencia de filas, y una fila una secuencia de prrafos separados por marcas de celda. >or ello, la especificaci/n =+K no contiene ninguna palabra de control que inicie y termine una tabla. -on definir los rasgos de las celdas que forman una fila y los propios de la fila queda definida la tabla. Fna ve! caracteri!ada, no hay ms que repetir la fila introduciendo el texto correspondiente a cada celda para construir la tabla completa. As pues, primero indicaremos al =ich+ext4ox que vamos a iniciar una definici/n de fila insertando el c/digo 6tro/d. (i hemos escrito texto antes de este c/digo, conviene que lo cerremos con una marca de prrafo. 6tro/d va seguido de palabras de control que definen rasgos que afectan a la fila entera. 1osotros incluiremos s/lo dos 6t/ord6trgaphB96trqc 6trgaph) 6trqc Espacio entre celdas. >arecido al 0+H# cellspacing Zustificaci/n de la fila: 6trqc ) central, 6trqr: derecha, 6trql: i!quierda.

El control =ich+ext4ox no admite ms estilo de borde que el simple continuo, por consiguiente la palabra de control 6trgaph) parece determinar el margen i!quierdo del texto dentro de la celda ms que la distancia entre los bordes de celdas contiguas. 0ay que usarlo, de todos modos, con precauci/n, porque si exageramos su valor se reduce el espacio para el texto y la fila entera se descoloca. A continuaci/n debemos definir los bordes superior, i!quierdo, inferior y derecho de la fila: RtrbrdrtRbrdrsRbrdr'?< RtrbrdrlRbrdrsRbrdr'?< RtrbrdrbRbrdrsRbrdr'?< RtrbrdrrRbrdrsRbrdr'?< 6tr&rdr,, donde , representa la letra t 8top9, l 8left9, & 8bottom9 o r 8right9, representa el borde superior, i!quierdo, inferior y derecho, respectivamente. A continuaci/n figura el c/digo que determina el estilo del borde 86&rdrs para borde simple continuo9 y su anchura 8&rdr/) donde ) es la anchura en t'ips9 =esulta que el =ich+ext4ox s/lo admite el borde simple continuo de ?< t'ips, aunque le indiquemos otra cosa, de modo que, cualquiera que sea la tabla que dibujemos, estas cuatro l neas nunca var an, as que no voy a detenerme ms en ello. El lector encontrar todas las posibilidades que el =ich+ext4ox no admite 8o al menos yo no he conseguido que se dibujen9 en la especificaci/n =+K. C

%efinida la fila, definiremos cada una de las celdas: RclbrdrtRbrdrsRbrdr'?D RclbrdrlRbrdrsRbrdr'?D RclbrdrbRbrdrsRbrdr'?D RclbrdrrRbrdrsRbrdr'?D Rcellx?WC< Estas cinco l neas han de repetirse para cada una de las celdas. -omo pueden ver vuesas mercedes, la @nica diferencia son las dos primeras letras de la primera palabra de control de cada l nea: tr para la fila y cl para la celda. :ale para ellas lo mismo que acabo de decir: el control =ich+ext4ox no admite ms opciones. #a @ltima l nea 86cellx)9, sin embargo, s es @nica para cada celda, porque establece la posici/n de su borde derecho. (upongamos que queremos dibujar una fila colocada a ?M< t'ips del margen i!quierdo del =ich+ext4ox compuesta de cuatro celdas de ?D<<, B<<<, ?D<< y B<<< t'ips de anchura respectivamente. Entonces el parmetro de la palabra de control 6cellx) de cada una de ellas ser el siguiente: ?. ;. B. N. ?M< T ?D<< ) ?LM< ?LM< T B<<< ) NLM< NLM< T ?D<< ) L?M< L?M< T B<<< ) C?M<

Pa tenemos, [por fin\, suficiente informaci/n para dibujar las filas de la tabla. Aqu va una fila con un poema de Antonio Hachado compuesto de un solo verso: Rintbl 0oyRcell esRcell siempreRcell todav aRcellRro' 6int&l 6cell 6ro/ 3nicio de la fila Kin de celda Kin de la fila

%entro de la celda podemos introducir todas las marcas de formato que vimos para el prrafo. -on todo lo que hemos aprendido ya podemos escribir un documento =+K a mano. 0e aqu un ejemplo: 5 Encabe!amiento: l nia inicial QRrtf?RansiRansicpg?;D;Rdeff<RdeflangB<W; 5 +abla de fuentes QRfonttbl QRf<RfnilRfcharset< 4ooEman ,ld (tyleVS QRf?RfnilRfcharset< Hicrosoft (ans (erifVSS 5 +abla de colores QRcolortbl V Rred?BCRgreen<Rblue<V Rred;DDRgreen;?DRblue<VS 5 Kin del encabe!amiento 5 %ocumento: # nia inicial Rvie'EindNRuc? 5 +exto RpardRparRqcRcf?RbRf<Rfs;N #A 3HA&E1 =E(>E+A%A >,= E# 31-E1%3,Rpar >rimera estrofaRpar Rpar 5 +abla: l nea inicial Rtro'dRtrgaph<Rtrqc 5 4ordes de la fila RtrbrdrtRbrdrsRbrdr'?< RtrbrdrlRbrdrsRbrdr'?< RtrbrdrbRbrdrsRbrdr'?< RtrbrdrrRbrdrsRbrdr'?< 5 4ordes de la primera celda RclbrdrtRbrdr'?DRbrdrs RclbrdrlRbrdr'?DRbrdrs RclbrdrbRbrdr'?DRbrdrs RclbrdrrRbrdr'?DRbrdrs Rcellx;N;< 5 4ordes de la segunda celda RclbrdrtRbrdr'?DRbrdrs ?<

RclbrdrlRbrdr'?DRbrdrs RclbrdrbRbrdr'?DRbrdrs RclbrdrrRbrdr'?DRbrdrs RcellxNLM< 5 4ordes de la tercera celda RclbrdrtRbrdr'?DRbrdrs RclbrdrlRbrdr'?DRbrdrs RclbrdrbRbrdr'?DRbrdrs RclbrdrrRbrdr'?DRbrdrs RcellxLC;< 5 4ordes de la cuarta celda RclbrdrtRbrdr'?DRbrdrs RclbrdrlRbrdr'?DRbrdrs RclbrdrbRbrdr'?DRbrdrs RclbrdrrRbrdr'?DRbrdrs RcellxC?M< Rpard 5 Kin de la definici/n de fila 5 +ra!ado de la filas Rintbl Rhighlight;Rcf?RbRf?Rfs;N (an Higuel Rcell de la +umbaRcell es un grand Rcell monesterio, RcellRro' Rintbl el marRcell lo cerca todo,Rcell elli yaceRcell en medio,RcellRro' Rintbl el logarRcell periglosoRcell do sufrenRcell grand la!erioRcellRro' Rintbl los mongesRcell que ] viven Rcell en essiRcell cimiterioRcellRro' RpardRpar 5 Kin del tra!ado de las filas 5 ^ltimos prrafos RqcRhighlight< &on!alo de 4erceoRpar Rul Hilagros de 1uestra (e"oraRpar S 5 Kin de documento =+K

#l c2digo El programa que presento genera un documento =+K compuesto de una tabla precedida de su t tulo. -ontiene una clase #inea que almacena informaci/n sobre una determinada l nea del t tulo de la tabla, y una clase -elda que recibe informaci/n sobre una celda en particular. Fna clase %ocumento=+K recibe un array de objetos #inea que representa todas las l neas del t tulo de la tabla y un array de objetos -elda que representa todas las celdas de una fila. %ocumento=+K recopilar otra informaci/n sobre el documento, como el n@mero de filas de la tabla o el margen i!quierdo, ser entregada a una clase que he llamado =edactor, porque su misi/n es reda"tar el documento =+K a la lu! de la informaci/n contenida en %ocumento=+K. =ecibido el documento por el c/digo cliente, se lo entregar al =ich+ext4ox mediante la propiedad .=tf. Fna ve! que el =edactor dispone de toda la informaci/n encapsulada en un %ocumento=+K crea un (tringBuilder donde ir almacenando mediante su mtodo -,ppen4String5 todos los fragmentos del documento =+K seg@n los vaya generando. -ompletado el documento se lo entrega al c/digo cliente en una cadena mediante la funci/n -To(tring45. El =edactor admite una matri! de tipo (tring de tantas filas y tantas columnas como tenga la tabla con la intenci/n de insertar el contenido de la matri! en las celdas ordenadamente. A la hora de crear las celdas el =edactor les introduce un carcter, por ejemplo /, y cuando ha terminado de escribir el documento =+K completo lo fragmenta mediante la funci/n (plit a travs de ese carcter, y luego vuelve a reunir los tro!os intercalando ordenadamente los valores de la matri!: %im Kragmentos89 As (tring ) (plit8El(tringbuilder.+o(tring, *7*9 5El texto situado en el ndice < no entra en el bucle 5>orque es todo el c/digo previo a la tabla %im +exto=+K As (tring ) Kragmentos8<9 ??

%im -ontador As (hort Kor i As (hort ) < +o Hatri!.&etFpper4ound8<9 Kor j As (hort ) < +o Hatri!.&etFpper4ound8?9 ,n Error =esume 1ext 5Esto es como la funci/n Zoin89 5(/lo que en ve! de insertar el mismo texto 53nsertamos ordenadamente los valores de una matri! -ontador T) ? +exto=+K U) Hatri!8i, j9 U Kragmentos8u9 1ext 1ext =eturn +exto=+K -onseguir que las referencias a las tablas de fuentes fueran correctas lleg/ a complicarse ms de lo esperado. 0ay que llevar un registro de las definiciones presentes en la tabla y2o descubrir si la nueva definici/n est ya presente, si lo est, locali!ar su ndice, y si no lo est, a"adirla. 1o es que sea excesivamente complicado, de hecho ese es el proceso que sigo con la tabla de coloresV simplemente, no merece la pena. Es totalmente viable a"adir una definici/n a la tabla por cada marca de fuente insertada en el texto, aunque se repitan. =esulta que, si despus de entregar al =ich+ext4ox un documento =+K, le preguntamos por ese mismo documento, no nos lo devuelve igual que como se lo dimos. >arece que lo genera a partir del texto formateado generado por el documento =+K que le hemos entregado. P todas las definiciones repetidas en las tablas desaparecen. 1o obstante, es curioso que, si nos fijamos bien, descubriremos que el =ich+ext4ox tambin a"ade sus propias redundancias. 0agan vuesas mercedes la prueba si sienten curiosidad: el men@ +abla de mi aplicaci/n de ejemplo ofrece tres opciones: -onstruir =econstruir %econstruir =ich+ext4ox?.=tf ) %ocumento=+K : =ich+ext4ox;.+ext ) %ocumento=+K =ich+ext4ox;.+ext ) =ich+ext4ox?.=tf =ich+ext4ox?.=tf ) =ich+ext4ox;.+ext

&eneren una tabla y pulsen despus en =econstruir, y vern qu sorpresa. A continuaci/n copio el c/digo de la clase =edactor. %e las clases que constan s/lo de propiedades basta con su interfa!: >ublic Enum (ubrayado -ontinuo >unto =aya >unto=aya >unto>unto=aya %oble &rueso >alabras ,ndulado End Enum >ublic Enum Alineaci/n 3!quierda -entro %erecha End Enum >ublic Hust3nherit -lass Kormato >ublic >roperty Kuente89 As Kont >ublic >roperty -olor+exto89 As -olor >ublic >roperty (ubrayado89 As (ubrayado >ublic >roperty -olorKondo89 As -olor End -lass >ublic -lass #inea : 3nherits Kormato >ublic >roperty +exto89 As (tring >ublic >roperty Alineaci/n89 As Alineaci/n End -lass >ublic -lass -elda : 3nherits Kormato >ublic >roperty +exto89 As (tring >ublic >roperty Anchura89 As 3nteger End -lass >ublic -lass %ocumento=+K >ublic >roperty Kila89 As -elda89 >ublic >roperty Encabe!ado89 As #inea89 >ublic >roperty Hargen3!quierdo89 As 3nteger >ublic >roperty Anchura+otal89 As 3nteger >ublic >roperty 1umeroKilas89 As 3nteger End -lass 3mports (ystem.+ext >ublic -lass =edactor >rivate Alba"il As (tring4uilder ) 1e' (tring4uilder >rivate %oc=+K As %ocumento=+K >rivate 0idden=ich+ext4ox As =ich+ext4ox >rivate sem As 4oolean ?;

>rivate +xtt8,9 As (tring >ublic (ub 1e'84y:al tabla As %ocumento=+K, 4y:al =ich+ext4ox-ontrol As =ich+ext4ox9 %oc=+K ) tabla : 0idden=ich+ext4ox ) =ich+ext4ox-ontrol End (ub >ublic Kunction =+K89 As (tring 5>rimera l nea del encabe!ado 5QRrtf?RansiRansicpg?;D;Rdeff<RdeflangB<W;RdeflangfeB<W;RdeftabM<W 5QRfonttblQ 0idden=ich+ext4ox.Kont ) Korm.%efaultKont %im t As (tring ) 0idden=ich+ext4ox.=tf %im ! As 3nteger ) t.3ndex,f8*QRfonttblQ*9 Alba"il.Append8t.(ubstring8<, !99 5+abla de fuentes Alba"il.Append8*QRfonttbl*9 %im ff89 As (tring ) KuentesArray89 Kor i As (hort ) < +o ff.&etFpper4ound8<9 Alba"il.Append8ff8i99 1ext Alba"il.Append8*S*9 5+abla de colores Alba"il.Append8*QRcolortbl*9 %im cc89 As -olor ) -oloresArray89 Kor i As (hort ) < +o cc.&etFpper4ound8<9 Alba"il.Append8+o=+K8cc8i999 1ext Alba"il.Append8*S*9 5Kinal encabe!ado Alba"il.Append8*Rvie'EindNRuc?*9 5+ tulo %im lin As #inea Kor i As (hort ) < +o %oc=+K.Encabe!ado.&etFpper4ound8<9 lin ) %oc=+K.Encabe!ado8i9 53nicio de prrafo Alba"il.Append8*Rpard*9 5Alineaci/n (elect -ase lin.Alineaci/n -ase Alineaci/n.-entro Alba"il.Append8*Rqc*9 -ase Alineaci/n.%erecha Alba"il.Append8*Rqr*9 -ase Alineaci/n.3!quierda Alba"il.Append8*Rql*9 End (elect 5Ondice de los colores Alba"il.Append8*Rhighlight* U Array.3ndex,f8cc, lin.-olorKondo99 Alba"il.Append8*Rcf* U Array.3ndex,f8cc, lin.-olor+exto99 %im f As Kont ) lin.Kuente 5+achado 3f f.(triEeout ) +rue +hen Alba"il.Append8*RstriEe*9 Else Alba"il.Append8*RstriEe<*9 5(ubrayado Alba"il.Append8Harca(ubr8f.Fnderline, lin.(ubrayado99 51egrita 3f f.4old ) +rue +hen Alba"il.Append8*Rb*9 Else Alba"il.Append8*Rb<*9 5-ursiva 3f f.3talic ) +rue +hen Alba"il.Append8*Ri*9 Else Alba"il.Append8*Ri<*9 5Ondice de la fuente Alba"il.Append8*Rf* U i9 5+ama"o Alba"il.Append8*Rfs* U Hath.=ound8f.(i!e _ ;99 5+exto Alba"il.Append8* * U lin.+exto9 5Kinal de prrafo Alba"il.Append8*Rpar*9 ?B

1ext 5Kin del encabe!ado 5#a tabla 5-alcularemos las longitudes de cada celda 5y el margen i!quierdo 5proporcionales a la anchura total %im #ong-eldas8%oc=+K.Kila.&etFpper4ound8<99 As 3nteger Kor i As (hort ) < +o %oc=+K.Kila.&etFpper4ound8<9 #ong-eldas8i9 ) %oc=+K.Kila8i9.Anchura 1ext %im #ongitudes89 As 3nteger ) ` Hapeo#ongitudes8%oc=+K.Hargen3!quierdo, #ong-eldas, %oc=+K.Anchura+otal9 5Hargen i!quierdo Alba"il.Append8(tring.Kormat8*Rtro'dRtrqcRtrgaphQ<SRtrleft<*, #ongitudes8<999 54ordes de la tabla Alba"il.Append8*RtrbrdrtRbrdrsRbrdr'?<*9 Alba"il.Append8*RtrbrdrlRbrdrsRbrdr'?<*9 Alba"il.Append8*RtrbrdrbRbrdrsRbrdr'?<*9 Alba"il.Append8*RtrbrdrrRbrdrsRbrdr'?<*9 %im 4orde%erecho As 3nteger ) #ongitudes8<9 Kor i As (hort ) ? +o #ongitudes.&etFpper4ound8<9 54ordes de la celda Alba"il.Append8*RclbrdrtRbrdr'?DRbrdrs*9 Alba"il.Append8*RclbrdrlRbrdr'?DRbrdrs*9 Alba"il.Append8*RclbrdrbRbrdr'?DRbrdrs*9 Alba"il.Append8*RclbrdrrRbrdr'?DRbrdrs*9 5Anchura de la celda 4orde%erecho T) #ongitudes8i9 Alba"il.Append8*Rcellx* U 4orde%erecho9 1ext 53nicio de la tabla Alba"il.Append8*Rpard*9 5-omo todas las filas van a ser iguales 5>rimero creamos una y luego la fotocopiamos. %im cel As -elda %im -emento As (tring4uilder ) 1e' (tring4uilder 53nicio de fila -emento.Append8*Rintbl*9 %im cx, cy As (hort Kor i As (hort ) < +o %oc=+K.Kila.&etFpper4ound8<9 5-ada ciclo del bucle es una celda cel ) %oc=+K.Kila8i9 5Ondice de los colores -emento.Append8*Rhighlight* U Array.3ndex,f8cc, cel.-olorKondo99 -emento.Append8*Rcf* U Array.3ndex,f8cc, cel.-olor+exto99 %im f As Kont ) cel.Kuente 5+achado 3f f.(triEeout ) +rue +hen -emento.Append8*RstriEe*9 Else -emento.Append8*RstriEe<*9 5(ubrayado -emento.Append8Harca(ubr8f.Fnderline, cel.(ubrayado99 51egrita 3f f.4old ) +rue +hen -emento.Append8*Rb*9 Else -emento.Append8*Rb<*9 5-ursiva 3f f.3talic ) +rue +hen -emento.Append8*Ri*9 Else -emento.Append8*Ri<*9 5+ama"o -emento.Append8*Rfs* U Hath.=ound8f.(i!e _ ;99 -emento.Append8*Rf* U i T %oc=+K.Encabe!ado.&etFpper4ound8<9 T ?9 5+exto 3f sem ) Kalse +hen -emento.Append8* * U cel.+exto9 Else ?N

-emento.Append8* * U *77*9 End 3f 5Kinal de celda -emento.Append8*Rcell*9 1ext 5Kinal de la fila -emento.Append8*Rro'*9 5Ahora reproducimos las filas Kor i As (hort ) ? +o %oc=+K.1umeroKilas Alba"il.Append8-emento.+o(tring9 1ext 5^ltima l nea Alba"il.Append8*RpardRparS*9 5%atos tomados de la matri! 3f sem ) +rue +hen %im ss89 As (tring ) (plit8Alba"il.+o(tring, *77*9 %im st As (tring ) ss8<9 %im u As (hort Kor i As (hort ) < +o +xtt.&etFpper4ound8<9 Kor j As (hort ) < +o +xtt.&etFpper4ound8?9 ,n Error =esume 1ext u T) ? st U) +xtt8i, j9 U ss8u9 1ext 1ext =eturn st Else =eturn Alba"il.+o(tring End 3f End Kunction >ublic Arite,nly >roperty +exto89 As (tring8,9 (et84y:al :alue As (tring8,99 sem ) +rue +xtt ) :alue End (et End >roperty >rivate Kunction +o=+K84y:al f As Kont, 4y:al 3ndice As (hort9 As (tring 5convierte una fuente en su definici/n 0idden=ich+ext4ox.Kont ) f %im t As (tring ) 0idden=ich+ext4ox.=tf %im rr89 As (tring 5#oclai!o el nombre de la fuente y parto el texto en dos rr ) (plit8t, f.KontKamily.1ame9 5=astreo la llave i!quierda %im E? As 3nteger ) rr8<9.#ast3ndex,f8*Q*9 5y extraigo el fragmanto a partir de ella %im s? As (tring ) rr8<9.(ubstring8E?9 5=astreo la llave derecha %im E; As 3nteger ) rr8?9.3ndex,f8*S*9 5y extraigo el fragmanto hasta ella %im s; As (tring ) rr8?9.(ubstring8<, E; T ?9 5Fno las tres pie!as y ya tengo 5Q#a cadena completa entre llavesS %im s As (tring ) s? U f.KontKamily.1ame U s; 5sustituyo el ndice cero 5por el que ser correcto en mi documento =eturn s.=eplace8*QRf<R*, *QRf* U 3ndice U *R*9 End Kunction >rivate Kunction +o=+K84y:al c As -olor9 As (tring 5Rred<Rgreen;DDRblue;DDV =eturn (tring.Kormat8*RredQ<SRgreenQ?SRblueQ;SV*, c.=, c.&, c.49 End Kunction >rivate Kunction KuentesArray89 As (tring89 ?D

%im lineas89 As #inea ) %oc=+K.Encabe!ado %im celdas89 As -elda ) %oc=+K.Kila 5creamos un array en el que quepan todas las fuentes %im rtff8lineas.&etFpper4ound8<9 T celdas.&etFpper4ound8<9 T ?9 As (tring 5&eneramos y almacenamos las definiciones de fuentes 5de los prrafos del t tulo Kor i As (hort ) < +o lineas.&etFpper4ound8<9 rtff8i9 ) +o=+K8lineas8i9.Kuente, i9 1ext 5#o mismo con las fuentes de las celdas Kor i As (hort ) lineas.&etFpper4ound8<9 T ? +o rtff.&etFpper4ound8<9 rtff8i9 ) +o=+K8celdas8i J lineas.&etFpper4ound8<9 J ?9.Kuente, i9 1ext =eturn rtff End Kunction >rivate Kunction -oloresArray89 As -olor89 %im lineas89 As #inea ) %oc=+K.Encabe!ado %im celdas89 As -elda ) %oc=+K.Kila 5Esta funci/n genera el array de todos los colores 5presentes en el objeto %oc=+K 5pero no incluye ning@n color repetido %im rr As Array#ist ) 1e' Array#ist %im c As -olor Kor i As (hort ) < +o lineas.&etFpper4ound8<9 c ) lineas8i9.-olorKondo 3f Array.3ndex,f8rr.+oArray8&et+ype8-olor99, c9 ) J? +hen rr.Add8c9 c ) lineas8i9.-olor+exto 3f Array.3ndex,f8rr.+oArray8&et+ype8-olor99, c9 ) J? +hen rr.Add8c9 1ext Kor i As (hort ) < +o celdas.&etFpper4ound8<9 c ) celdas8i9.-olorKondo 3f Array.3ndex,f8rr.+oArray8&et+ype8-olor99, c9 ) J? +hen rr.Add8c9 c ) celdas8i9.-olor+exto 3f Array.3ndex,f8rr.+oArray8&et+ype8-olor99, c9 ) J? +hen rr.Add8c9 1ext =eturn rr.+oArray8&et+ype8-olor99 End Kunction >rivate Kunction Hapeo#ongitudes84y:al margen As 3nteger, 4y:al celdas As 3nteger89, 4y:al total As 3nteger9 As 3nteger89 %im suma As 3nteger Kor i As (hort ) < +o celdas.&etFpper4ound8<9 suma T) celdas8i9 1ext %im res8celdas.&etFpper4ound8<9 T ?9 As 3nteger 5Este mapeo calcula las longitudes proporcionalmente 5a la anchura total de la tabla 5margen res8<9 ) total _ margen R suma 5celdas Kor i As (hort ) < +o celdas.&etFpper4ound8<9 res8i T ?9 ) total _ celdas8i9 R suma 1ext =eturn res End Kunction >rivate Kunction Harca(ubr84y:al raya As 4oolean, 4y:al u As (ubrayado9 As (tring %im su As (tring ) *Rul* 3f raya ) +rue +hen (elect -ase u -ase (ubrayado.%oble : su U) *db* -ase (ubrayado.&rueso : su U) *th* -ase (ubrayado.,ndulado : su U) *'ave* -ase (ubrayado.>alabras : su U) *'* -ase (ubrayado.>unto : su U) *d* -ase (ubrayado.>unto>unto=aya : su U) *dashdd* -ase (ubrayado.>unto=aya : su U) *dashd* -ase (ubrayado.=aya : su U) *dash* End (elect =eturn su ?L

Else =eturn su U *<* End 3f End Kunction End -lass

#l c2digo de eCe!plo Adems del generador de tablas motivo de este art culo incluyo dos 0onus"ode: un generador de tablas de caracteres en la fuente que elijamos y un peque"o ejemplo que muestra c/mo exportar a una tabla =+K una tabla de una base de datos. Huestro una captura de la tabla de caracteres:

o!o colorear sentencias (DL con VB-)et 0echa" E9+)ov+?99@ 4?@ de )ovie!&re de ?99@5 ,utor" laudio Luque cluqueFpro!inente-co!-ar

Introducci2n" #a publicaci/n de este articulo surge luego de que por ra!ones laborales necesite hacer una herramienta de tra!abilidad que permita ver desde la capa de presentaci/n hasta las estructuras de las tablas intervinientes en cada etapa del desarrollo de un producto que reali!a la empresa donde trabajo. >ara lo cual necesitaba en un punto algo tan sencillo como mostrar el contenido de los stored procedures. El c/digo es bastante sencillo, espero que les sirva. o!o 0unciona%entro del mtodo *-olorear(I#*, se reali!a el proceso, comen!ando por colorear todo el texto del =ich+ext4ox en negro con fuente -ourier 1e' C. ?M

#uego invoca a un mtodo set+ext-olor, pasndole por parmetro la palabra a colorear y luego el color, por ejemplo: set+ext-olor8*select*, -olor.4lue9 4sicamente se utili!an B colores para palabras reservadas dentro de las sentencias (I#, estos son 4lue, Kucsia, &ray. El cuarto color es el =ed, usado para las palabras entre comillas *5* o ***. El Iuinto color es el &reen que se usa para cometarios, tanto cortos *JJ* como largos *2_````_2*. Es por ello que luego de colorear las palabras se invoca a los mtodos (et-onstant8-olor.=ed9 (et-omment8-olor.&reen9 (et-omment#ong8-olor.&reen9 (etText olor 4para las pala&ras reservadas5" >rivate (ub set+ext-olor84y:al p(tr As (tring, 4y:al p-olor As %ra'ing.-olor9 %im i As 3nteger %im posAnt As 3nteger posAnt ) J? =ich+ext4ox?.(election(tart ) < =ich+ext4ox?.(election#ength ) < Kor i ) < +o ?<<< 3f i ) < +hen =ich+ext4ox?.Kind8p(tr, <, =ich+ext4oxKinds.AholeAord9 Else =ich+ext4ox?.Kind8p(tr, =ich+ext4ox?.(election(tart T ?, =ich+ext4oxKinds.AholeAord9 End 3f 3f posAnt ) =ich+ext4ox?.(election(tart +hen Exit Kor End 3f =ich+ext4ox?.(electionKont ) 1e' Kont8*-ourier 1e'*, C, Kont(tyle.=egular9 =ich+ext4ox?.(election-olor ) p-olor posAnt ) =ich+ext4ox?.(election(tart 1ext End (ub (et onstant 4para las pala&ras entre co!illas5" >rivate (ub (et-onstant84y:al p-olor As %ra'ing.-olor9 %im i As 3nteger %im posAnt As 3nteger %im pos?, pos; As 3nteger posAnt ) J? =ich+ext4ox?.(election(tart ) < =ich+ext4ox?.(election#ength ) < Kor i ) < +o ?<<< 3f i ) < +hen =ich+ext4ox?.Kind8*5*, <, =ich+ext4oxKinds.1one9 Else =ich+ext4ox?.Kind8*5*, pos; T ?, =ich+ext4oxKinds.1one9 End 3f pos? ) =ich+ext4ox?.(election(tart =ich+ext4ox?.Kind8*5*, =ich+ext4ox?.(election(tart T ?, =ich+ext4oxKinds.1one9 pos; ) =ich+ext4ox?.(election(tart 3f posAnt ) pos? ,r =ich+ext4ox?.(elected+ext ) ** +hen Exit Kor End 3f ?W

=ich+ext4ox?.(election(tart ) pos? =ich+ext4ox?.(election#ength ) pos; J pos? T ? =ich+ext4ox?.(electionKont ) 1e' Kont8*-ourier 1e'*, C, Kont(tyle.=egular9 =ich+ext4ox?.(election-olor ) p-olor posAnt ) =ich+ext4ox?.(election(tart 1ext End (ub (et o!!ent4para los co!entarios cortos5" >rivate (ub (et-omment84y:al p-olor As %ra'ing.-olor9 %im str#ine As (tring %im strAords As (tring Kor Each str#ine 3n =ich+ext4ox?.#ines 3f 3n(tr8str#ine, *JJ*9 . < +hen strAords ) Hid8str#ine, 3n(tr8str#ine, *JJ*99 set+ext-olor8strAords, p-olor9 End 3f 1ext End (ub (et o!!ent4para los co!entarios cortos5" ,tra ve! texto normal. >rivate (ub (et-omment#ong84y:al p-olor As %ra'ing.-olor9 %im i As 3nteger %im posAnt As 3nteger %im pos?, pos; As 3nteger posAnt ) J? =ich+ext4ox?.(election(tart ) < =ich+ext4ox?.(election#ength ) < Kor i ) < +o ?<<< 3f i ) < +hen =ich+ext4ox?.Kind8*2_*, <, =ich+ext4oxKinds.1one9 Else =ich+ext4ox?.Kind8*2_*, pos; T ?, =ich+ext4oxKinds.1one9 End 3f pos? ) =ich+ext4ox?.(election(tart =ich+ext4ox?.Kind8*_2*, =ich+ext4ox?.(election(tart T ?, =ich+ext4oxKinds.1one9 pos; ) =ich+ext4ox?.(election(tart 3f posAnt ) pos? ,r =ich+ext4ox?.(elected+ext ) ** +hen Exit Kor End 3f =ich+ext4ox?.(election(tart ) pos? =ich+ext4ox?.(election#ength ) pos; J pos? T ? =ich+ext4ox?.(electionKont ) 1e' Kont8*-ourier 1e'*, C, Kont(tyle.=egular9 =ich+ext4ox?.(election-olor ) p-olor posAnt ) =ich+ext4ox?.(election(tart 1ext End (ub

?C

También podría gustarte