Word Desde Delphi

  • Upload
    jlan

  • View
    810

  • Download
    38

Embed Size (px)

Citation preview

El Rinconcito de Delphi Manejo de Word desde DelphiNstor [email protected] presente artculo ha sido cedido para su publicacin en El Rinconcito de Delphi. Es ilegal cualquier actuacin que vulnere los derechos del autor.Manejo de Word desde Delphi MicrosoItWordes,posiblemente,eleditordetextosmasutilizadoensistemas Windows. Pocos ordenadores no lo tienen, o tienen otro programa compatible. Por ello, puede resultar interesante que una aplicacion permita crear documentos para mostrar sus resultados o modiIicar documentos ya escritos. ConDelphi,yloscomponentesTWordApplicationysusderivados,podremos controlarestaaplicacionparaconseguirnuestrospropositos.Estearticuloestaescrito con Delphi 5, y Word 2000. Tambien deberia Iuncionar sin problemas con Word 97. En todoelarticuloseranecesarioutilizarelarchivoWord97.pas,quedebeincluirseenla clausula Uses de Delphi. Para usar este articulo con Delphi 6, se incluyen algunos comentarios con los cambios que haya que tener en cuenta. uses Windows, Messages, ... , Word97; DELPHI 6. El Uses a aadir es Word2000 Hola, mundo Empezaremos con el clasico 'Hola, mundo, como no podia ser menos. Creamos una aplicacion,unbotonyelcomponenteTWordDocument.Estecomponentetienepocas propiedades,peronohayquedejarseengaar,tienecientosdemetodos.Masadelante veremossuspropiedades;porahoraasignaremosckNewInstance`alapropiedad ConnectKind.DeestaIorma,abriraunanuevainstanciadeWordcadavezque ejecutemos la aplicacion. En el boton escribimos lo siguiente: procedure TForm1.Button1Click(Sender: TObject); begin WordDocument1.Activate; WordDocument1.Range.Text := 'Hola, mundo'; WordDocument1.Application.Visible := True; end; Yyaestahecho.Siejecutamosahora,apareceranuestroWordconesaspalabras. Veamosporquehaceesto.UnaaplicaciondeWordpuedetenerabiertovarios documentosalavez.Alactivarundocumentoestamoscreandounonuevo.Enla siguiente linea asignamos el texto en la propiedad Range`. En Word siempre se trabaja conrangos.Enestecaso,dadoquenohaynadaseleccionado,elrangoestodoel documento.Sihicieramosestoenundocumentoyaescrito,loborrariamosentero, dejando solo el texto de saludo. Paraterminar,ledecimosalaaplicacionquecontieneeldocumentoqueseavisible, mostrandonos el resultado. CuandotrabajamosconWord,laaplicacionestaocultapordeIecto,deIormaqueel usuarionovenadahastaqueselamostramos.Estoesasievitarqueelusuariovea comosevanaadiendolineasyIormatos,ysoloveaelresultado.Oparaquenovea nada: podemos grabar o imprimir el documento sin mostrar Word. Manejo de parraIos Veamos ahora como maneja Word el texto. Empezaremos con los parraIos. El documento entero lo divide en parraIos. Cada parraIo tiene (o no) un texto y acaba enunretornodecarro(ASCII13).ElsiguienteparraIoempiezaenlalineasiguiente. PodemoshacerreIerenciaaunparraIoconcreto(elnumero3;elultimo),oauno relativo (el quinto despues del primero). ConelcodigoanteriorhemoscreadounparraIoparatodoeldocumento,yaque hemos escrito un texto, sin ningun retorno de carro. Ahoracrearemos mas parraIos. El nuevoparraIoestarasituadoantesdelparraIoanterior,yaqueusaremoselmetodo 'InsertParagraphBeIore. Veamos algo de codigo, que situaremos despues del codigo del Hola mundo. procedure TForm1.Button1Click(Sender: TObject); begin ... WordDocument1.Range.InsertParagraphBefore; WordDocument1.Paragraphs.First.Range.Text := 'Prrafo insertado antes' + #13; end; Enlaprimeralinea,el'RangesereIiereatodoeldocumento,yaquenohaynada seleccionado. E insertamos un parraIo. Este sera el primero de todo el documento. En la segunda,alcontrarioquehastaahora,siseleccionamoselrangodetrabajo.Eneste caso,hacemosreIerenciaalprimerparraIodeldocumento.El'Rangeahoraapunta hacia este, y sera en este parraIo donde escribamos. Engeneral,'Rangeseutilizaparatrabajarcontodalazonadeldocumento seleccionada.Enelprimercodigo,noseleccionabamosnada,porloque'Range aIectaba a todo el documento. En esta ocasion, la primera linea tambien se reIiere a todo el documento, mientras que la segunda hace reIerencia solo al parraIo indicado. Este es el metodo de trabajo de Word: Seleccionar un rango y trabajar sobre el. Por supuesto, se puede hacer selecciones dentro de selecciones, hasta llegar a un rango de una sola letra. Para seleccionar un parraIo concreto, se utiliza la propiedad 'Items. Hay que tener en cuentaqueunparraIonotieneporquecontenertexto,soloacabarenunretornode carro. Esto signiIica que una linea en blanco sera considerada como un parraIo. WordDocument1.Paragraphs.Item(6).Range.Text := Prrafo sexto; Porsupuesto,sepuedenaadirparraIosantesydespuesdeunrangoseleccionado (InsertParagraphBefore e InsertParagraphAfter, respectivamente). Cuando se inserta antes, hay quetenerencuentaqueWordnoseparalosparraIosautomaticamente,porloquees necesario aadir el Ascii 13. Si no se aadiera el retorno, el texto insertado quedaria en elmismoparraIoseleccionado,alprincipio.OtrasolucionesaadirdosparraIos seguidos. Por ejemplo, el codigo siguiente hace el mismo eIecto que el anterior: procedure TForm1.Button1Click(Sender: TObject); begin ... WordDocument1.Range.InsertParagraphBefore; WordDocument1.Range.InsertParagraphBefore; WordDocument1.Paragraphs.First.Range.Text := 'Prrafo insertado antes; end; Por supuesto tambien se pueden borrar, basta con asignarle un texto nulo: WordDocument1.Paragraphs.First.Range.Text := ; UnaIormamasavanzadadeselecciondeparraIosesseleccionarlosenrelacioncon otro.Estaselecciontienemayorutilidadendocumentosqueyaestenescritosyen combinacion con otras Iormas de seleccion. Por ejemplo, seleccionar el parraIo anterior alquecontengalapalabraDelphi.ParaestoseseleccionaelparraIodepartiday despues, se indica el numero de parraIos hacia delante o hacia atras. procedure TForm1.Button2Click(Sender: TObject); var S : OleVariant; Begin S := 2; WD.Range.Paragraphs.Last.Previous (S).Range.Text := 'hhh'+CHR (13); //Prrafo previo (2 antes) End; Enelejemplo,seleccionaycambiaeltextodelsegundoparraIocontandodesdeel Iinal,sinolvidarelnecesarioretorno.Dadoquesepuedencombinarlibrementelas selecciones, se podria hacer lo siguiente: procedure TForm1.Button2Click(Sender: TObject); var S,D : OleVariant; Begin S := 2; D := 1; WD.Range.Paragraphs.Last.Previous(S).Next(D).Next(D).Range.Text:= 'hhh'+CHR (13); End; Enesteejemploseseleccionaelsiguientedelsiguientedel2anterioralultimo.Es decir: seleccionamos el ultimo. En este caso esto no tiene mucha utilidad, pero permite ver como se pueden hacer varias selecciones en cascada. Tambiensepuedeobservarquelosparametrossepasancomovariables,yestasson deltipoOleVariant.TodoslosparametrosquesepasenaWordserandeestetipo,u otrostipospropios(comopodriaserTParagraph).Tambiensepermite,cuandosean opcionales,dejarlosvacios('EmptyParam).Enestecaso,tomaransuvalorpor deIecto. No admite el paso de parametros constantes. Cambio de estilos Una vez escrito el texto, puede ser interesante darle algun Iormato. Para empezar, hay que seleccionar el texto a Iormatear. Para esto, creamos una variable donde almacenar el rango, y asi trabajar mas comodamente con ello. A continuacion, se ve como seleccionar un texto. En esta ocasion, el rango se mide en letras, correspondiendo la posicion 0 a la primera VarRango : Range; S,D : OleVariant; Begin S := 1; D := 3; Rango := WD.Range (S,D) end; Aquiseseleccionalasletras2,3y4deldocumento.Paraseleccionarletrasdeun parraIoconcreto,primeroseinicializalavariableRango,ydespuesseleindicael comienzo y el Iinal de la seleccion. VarRango : Range; Begin Rango := WordDocument1.Range; Rango.Start := WordDocument1.Paragraphs.Last.Range.Start+1; Rango.End_ := Rango.Start+3; end; Sepuedeutilizar'Range.Starty'Range.Endparaindicarlasposicionesdel parraIo. Aqui se seleccionan las letras 2, 3 y 4 del ultimo parraIo. Una vez seleccionado el texto, tenemos varias opciones. Todas se utilizan de la misma manera, por lo que veremos solamente como poner las negrillas: Rango.Bold := wdUnderlineSingle; Paralasnegrillassolohaydosvalores:'1y'0.Activadasydesactivadas, respectivamente.DelamismaIormaseusa'Italic(Cursiva).Lossubrayados ('Underline), en cambio, tienen 10 valores distintos, como se ve en la tabla TipoConstante Sin subrayadowdUnderlineNone Subrayado simplewdUnderlineSingle Subrayado por palabraswdUnderlineWords Subrayado doblewdUnderlineDouble PunteadowdUnderlineDotted Subrayado gruesowdUnderlineThick RayadowdUnderlineDash Raya y puntowdUnderlineDotDash Raya punto puntowdUnderlineDotDotDash OnduladowdUnderlineWavy Enrealidad,Wordtienedisponibles18tiposdesubrayados;sinembargo,enDelphi solopodemosusarestos.Otroslenguajes,comoVB,sitienenaccesoalos18.Esto tambienocurreconotrasopcionesyIuncionesdeWord,queseraninaccesiblesdesde nuestrosprogramas.AIortunadamente,noshandejadosuIicientesopcionescomopara hacer cualquier tipo de documento. Algunas de las opciones pueden no estar disponibles segun el idioma del MS Word instalado. Otro Iormato muy usado es la alineacion de los parraIos. Esto solo se puede hacer con parraIos, no con letras como haciamos antes. WordDocument1.Range.Paragraphs.Last.Range.Paragraphs.Alignment := wdAlignParagraphJustify; Seseleccionatodoeldocumento(WordDocument1.Range),deaqui,soloelultimo parraIo(Paragraphs.Last.Range)yseledalaalineacion(Paragraphs.Alignment: wdAlignParagraphJustiIy). Los valores dispopnibles son: EljustiIicadoesunamezcladealineadoizquierdayderecha,enelquelosdos margenes del texto aparecen ajustados al borde. Tambien podemos modiIicar el tamao, color, etc. del texto, con la propiedad 'Font. Se puede usar con parraIos o con Iragmentos, al igual que los otros estilos. WordDocument1.Range.Paragraphs.Last.Range.Font.Size := 12; Rango.Font.Name := Arial; Estassonlasdospropiedadesmasimportantes,eltamaoyeltipodeletra.Sino reconoceelnombredelaIuente,laasignara,peronolacambiara.Esdecir:enlas propiedades del texto aparecera el nombre que le hayamos dado, pero el texto tendra el mismo tipo que tuviera antes de la asignacion. Desde aqui tambien podemos cambiar las propiedades 'Bold, 'Italic y 'Underline. Para cambiar el color se usa 'ColorIndex, que permite asignar uno de los 17 colores por deIecto de Word. Con Delphi no podemos asignar otros. TipoConstante Alineado izquierdawdAlignParagraphLeIt Alineado derechawdAlignParagraphRight Alineado centrowdAlignParagraphCenterAlineado justiIicadowdAlignParagraphJustiIy Podemosasignarleauntextolapropiedad'Hidden,queocultaeltexto.Deesta Iormapodemoshacerdespareceruntextosinnecesidaddeborrarlo.Soloadmitedos valores : '0 (visible) y '1 (oculto). Al igual que 'subscript y 'superscript, los cuales hacen que el texto aparezca como subindice o como superindice. Ademas,cuandosetieneuntextoseleccionadosepuedeusar'InsertAItere 'InsertBeIore para aadir mas texto despues, o antes, del seleccionado. Rango. InsertAfter (Texto); Conlapropiedad'Font.Positionsepuededesplazareltextohaciaarribaohacia abajo. Esto hara que la base de las letras se desplace arriba, si es un numero positivo, o abajo, si negativo: WD.Range.Paragraphs.Last.Range.Font.Position := 3; Uso de Word Ahora que ya sabemos escribir en Word, conviene aprender a utilizar el propio Word. Ya sabemos abrirlo, activando un documento: WordDocument1.Activate; Y hacer visible la aplicacion: WordDocument1.Application.Visible := True; Sinembargo,estoultimotambiensepodriahacerconelobjetoTWordApplication. Enrealidad,TWordDocumentdesciendedeTWordApplication.Loquehaciamospara hacerlo visible era reIerirnos a este ultimo. Igualmente, se podria hacer de Iorma directa asi: WordApplication1.Visible := True; ColorConstante Automatico (negro)wdAuto NegrowdBlack AzulwdBlue TurquesawdTurquoise Verde brillantewdBrightGreen FucsiawdPink RojowdRed AmarillowdYellow BlancowdWhite Azul oscurowdDarkBlue Verde azuladowdTeal VerdewdGreen VioletawdViolet Rojo oscurowdDarkRed Amarillo oscurowdDarkYellow Gris 50wdGray50 Gris 25wdGray25 Esta nueva clase, como su nombre indica, es la que controla a Word. Paraempezar,paracerrarloseusaelmetodo'Close,quepuedeusarsesin parametros, con uno, con dos o con tres. El mas importante de ellos, sin embargo, es el primero,queindicasidebegrabarloscambios.Sinoseindica,Wordpreguntaraal usuario. var C : OleVariant; begin WordDocument1.Close; C := 1; WordDocument1.Close (C); end; Este parametro toma dos valores: 0 (No grabar) y 1 (grabar). Paragrabareldocumentosincerrarlo,elmetodoes'Savey'SaveAs.Laprimera graba el documento con el nombre y las opciones elegidas la ultima vez que se grabo. Si eldocumentoesnuevo,muestraelcuadrodedialogodegrabacion,quedaraunerror EOleExceptionencasodesercancelado.Lasegundanomuestraninguncuadro,pero hayqueindicarletodaslasopciones,quepuedenserdistintasalaselegidas anteriormente. La propiedad 'Saved, booleana, indica si el documento ha sido grabado. Esta es la lista de parametros de 'SaveAs: ParmetroDescripcinPor defecto FilenameNombre y ruta del documentoDoc1.doc FileIormatTipo de documento (ver mas abajo)0 LockCommentsImpide aadir comentariosFalse PasswordContrasea para abrir documento-NINGUNA- AddToRecentFilesAadeeldocumentoalalistade archivos recientes True WritePasswordContrasea para modiIicar el archivo-NINGUNA- ReadOnlyRecommendedRecomendaciondeaperturaenmodo Solo-Lectura False EmbedTrueTypeFontsGrabarIuentesTrueTypeconel documento True SaveNativePictureFormatGrabarlaversiondeWindowsdelos archivosgraIicos(sihayvarias versiones) True SaveFormsDataGrabar los datos de los Iormularios de Word con el archivo False SaveAsAOCELetterSihayIormularios,grabarcomocarta de tipo AOCE False Estos parametros son opcionales, por lo que se pueden dejar en blanco (asignandoles EmptyParam) o usar solo el que se desee y los anteriores. Si, por ejemplo, se quiere usar el 3, hay que especiIicar los parametros 1,2 y 3. Un ejemplo de grabacion: Var Si, No, Blanco, Nombre, Clave, Tipo : OleVariant; Begin Tipo := 0; Si := 1; No := 0; Blanco := ; Clave := Contrasea; Nombre := C:\Documento.doc; WordDocument1.SaveAs(Nombre,Tipo,EmptyParam,Clave,Si,Blanco,Si,Si, Si, No, No); End; Elcomando'SaveAsgrabaelarchivosininIormaralusuario.Sielarchivoya existiera, lo sobrescribiria sin mas. Los tipos de documento que hay son: ValorTipo 0Documento de Word estandar (.doc) 1Plantilla de documento (.dot) 2Texto plano (.txt) 3Texto con saltos de lineas (.txt) 4Texto compatible con MS-DOS (.txt) 5Texto compatible con MS-DOS con saltos de lineas (.txt) 6Archivo de texto enriquecido (.rtI) 7Texto unicode (.doc) Unavezgrabado,tambienconvienepoderabrirlo.Paraestoestaelmetodo'Open. Este,alcontrarioquelosanteriores,dependedelaclaseTWordApplication.Sus parametrostambiensonopcionales,exceptuandoelnombre,pudiendousarlosdela misma Iorma que los de 'SaveAs: ParmetroDescripcinPor defecto FilenameNombre del archivo-OBLIGATORIO- ConIirmConversionsIndicasideberiamostrarelcuadrode dialogo Convertir archivo, en caso de no conocer el Iormato de archivo False ReadOnlyParaabrirelarchivoenmodoSolo-Lectura False AddToRecentFilesAadeeldocumentoalalistade archivos recientes True PasswordDocumentContrasea para abrir el documento-NINGUNA- PasswordTemplateContraseaparaabrirlaplantillade documento, si esta estuviera protegida -NINGUNA- RevertSi el documento ya esta abierto, indica si deberiareabrirlo,descartandolos cambios que pudiera haber False WritePasswordDocumentContraseaparaguardarloscambiosal documento -NINGUNA- WritePasswordTemplateContrasea para guardar los cambios a la plantilla -NINGUNA- FormatElIormatodelarchivo(verFileIormat,0 de SaveAs) Un ejemplo de carga: Var Si, No, Blanco, Nombre, Clave, Tipo : OleVariant; Begin Tipo := 0; Si := 1; No := 0; Blanco := ''; Clave := 'Contrasea'; Nombre := 'C:\Documento.doc'; WordApplication1.Documents.Open(Nombre,No,No,No,Clave,Blanco,Si, Blanco, Blanco, Tipo); WordApplication1.Visible := True; end; Delphi 6. Todos los parametros son obligatorios, v ademas se aaden. Encodingque indica el tipo de caracteres a usar (defar en blanco) v Visible para hacer que la nueva ventana no se vea (0No visible, 1Jisible). LosdocumentoscargadoshayquetratarlosdeIormaespecial,yaquedebenusarse juntoalalistadedocumentosdeWord.NosepuedenusarconWordDocumentcomo hasta ahora. Esta Iorma de trabajo de describe mas abajo. ----------------------------------------------------------------------------

Crear un documento nuevo es mas Iacil: Var No, Blanco : OleVariant; Begin No := 0; Blanco := ''; WordApplication1.Documents.Add (Blanco, No); WordApplication1.Visible := True; end; El primer parametro indica el nombre de la plantilla que se va a usar. En blanco para no usar ninguna. El segundo indica que el documento sera una plantilla. Por deIecto, no. NOTA:AlgunasdelasopcionespordeIectosparalacargaygrabaciondelos archivos, pueden ser distintas de las que se muestran en la tabla, ya que el usuario puede conIigurar algunas desde las opciones de Word. Como detalle curioso, tenemos la opcion de quitar el nombre de 'MicrosoIt Word de labarradetitulodelprograma,pudiendorenombrarlocomodeseemos.Estose consigue con la propiedad 'WordApplication.Caption. WordnosoIreceunospocoseventos,quepodemosutilizarennuestraaplicacion. Estosson:OnQuit,cuandosecierralaaplicacion(oelultimodocumento); OnDocumentChange,cuandocambiaeldocumentoactivodelalistadedocumentos (crear,cerrar,cargaroactivarundocumento);yOnStartUp,cuandoseinicia.Siles asignamos un procedimiento, Word quedara a la espera de que termine, sin hacer nada hasta entonces. Como en otras ocasiones, nuestras opciones son limitadas. Estos eventos tambien los tenemos disponibles en el componente TWordApplication. type TForm1 = class(TForm) procedure Quit (Sender : TObject); end; implementation procedure TForm1.Quit (Sender : TObject); begin ShowMessage ('Cerrado'); end; procedure TForm1.Button1Click(Sender: TObject); begin WordApplication1.OnQuit := Quit; end; Enlosdocumentosindividualestenemosloseventos'OnClose,'OnNewy 'OnOpen. Impresion LaimpresiondedocumentossepuedehacerdedosIormas:desdeelobjeto WordApplication, que imprime todos los documentos abiertos, o desde WordDocument, queaIectasoloalactual.Elcomandodeimpresiones'PrintOut,ysusparametros permiten conIigurar la impresion igual que elcuadro de dialogo 'Imprimir. Estos son los parametros: ParmetroDescripcin BackgroundIndicasiWorddebeesperaraqueterminelaimpresion.True para que continue mientras se imprime. AppendSi el documento se imprime sobre un archivo, este indica si debe aadirlo al Iinal, en vez de sobrescribirlo (True Aadir) RangeEstablece que paginas se van a imprimir. Ver la tabla mas abajo. OutputFileNameNombre y ruta del archivo sobre el que se va a imprimir. Se usa junto al parametro PrintToFile FromPrimera pagina a imprimir, cuando Range wdPrintFromTo ToUltima pagina a imprimir, cuando Range wdPrintFromTo ItemLos elementos del documento que se imprimiran. Ver tabla. CopiesEl numero de copias, todas iguales, que deben imprimirse PagesPaginas que debe imprimir. Se separa por comas y guiones PageTypeQue tipo de paginas imprimira (segun sean pares o impares) PrintToFileObliga a imprimir sobre un archivo CollateSi hay varias copias, esto hara que se impriman primero todas las originales ActivePrinterMacGXEstosoloseutilizaenWord98,conordenadoresMacintosh. Debe dejarse en blanco ManualDuplexPrintImpresion a doble cara de Iorma manual (para impresoras que no dispongan de esta opcion) Algunosdelosparametrosnecesitanunaexplicacionmasdetallada.Rangeindica como se decide que paginas deben imprimirse. Los valores que puede tomar son: ConstanteEfectoValor wdPrintAllDocumentImprime todas las hojas del documento0 wdPrintSelectionImprime solo el texto seleccionado1 wdPrintCurrentPageImprime la pagina en la que se este trabajando2 wdPrintFromToIndicaunintervalodepaginas,juntoaFromy To 3 wdPrintRangeOIPagesUtilizaunrangodepaginas,establecidoen Pages 4 'Fromy'Todebendejarsevacioscuandonoseutilicen.Encasocontrario,dara un error de 'Parametro no valido El parametro 'Item sirve para imprimir otras inIormaciones del documento, en lugar deltextodelmismo(paraimprimireltextoyotroselementos,utilizarlasopcionesde impresion, que se detallan mas abajo): ConstanteElementosValor wdPrintDocumentContentEl texto del documento entero0 wdPrintPropertiesDescripcion del documento (Numero de palabras, titulo, tiempo de edicion...) 1 wdPrintCommentsImprime solo los comentarios del texto2 wdPrintStylesImprimeunalistadelosestilos utilizadoseneltexto,consus caracteristicas 3 'PagesPermiteindicarquepaginasimprimirdeIormamasexactaque'Fromy 'To,yaquepermitesaltarsealgunasdelashojasdeldocumento.Laspaginas individualesseindicanseparandolasconcomas,mientrasquelosgruposdepaginas, con guiones. Asi, '1, 3-5, 7' imprimira las paginas 1, 3,4,5 y 7. 'PageTypeindicasidebeimprimirlaspaginasparesoimpares.Sivale'0 imprimira todo, '1 para las impares y '2 para las pares. var Si, No, Pagin, Blanco, Elem, Rang : OleVariant; begin Rang := 4; Pagin := '1, 3-4'; Si := 1; No := 0; Blanco := ''; Elem := 0; WordApplication1.PrintOut(Si,No,Rang,Blanco,EmptyParam,EmptyParam, Elem, Si, Pagin); end; Esto imprimira las paginas 1, 3 y 4 del documento y seguira ejecutandose sin esperar a que termine. Apartedeestosparametros,hayotrasopcionesqueaIectanalaimpresion.En concreto,lasquepertenecenaltipo'Options,delaclase'WordApplication.Estas son las mas importantes: PropiedadEfecto PrintBackgroundEl mismo eIecto que el parametro 'Background. Si no se especiIica este, tomara su valor de 'Options PrintCommentsImprimetodosloscomentariosdeldocumento, comoen'ItemwdPrintComments,soloqueen este caso los aade al Iinal del texto. PrintDraItImprimeeldocumentoenbajacalidad(borrador). Algunas impresoras pueden no aceptar esta opcion PrintEvenPagesInAscendingOrderObligaaimprimirlaspaginasparesenorden ascendente (de ultima a primera) PrintHiddenTextImprime el texto que tenga el estilo Hidden PrintOddPagesInAscendingOrderObligaaimprimirlaspaginasimparesenorden ascendente (de ultima a primera) PrintPropertiesImprimelaspropiedadesdeldocumento,comoen 'ItemwdPrintProperties,soloqueenestecaso los aade al Iinal del texto. ------------------------------------------------------------- Listas de documentos Wordtambientienelaopciondetrabajarconvariosdocumentosalavez.Cuando Wordtienevariosdocumentosabiertos,utilizaunalistainternadedocumentosenla quesealmacenantodoslosquehay.DesdeDelphipodemosusarestalistacomoun array, accediendo a cada elemento con la propiedad 'Item. Para mayor comodidad, se puedeactivarunodelosdocumentos,deIormaquenohagaIaltareIerirseaelporsu indice. Parahaceresto,seactivaeldocumentodesdeTWordApplication,ydespuesse trabaja sobre el como hasta ahora. Cuando se aade un documento (se crea nuevo o se abre), el nuevo pasa a la posicion 1 de la lista de documentos, y los demas se desplazan unvalor(elqueeraprimeroseconvierteensegundo,elsegundoentercero,yasi sucesivamente). Abrir un documento o crearlo nuevo lo activara automaticamente. En el ejemplo siguiente se ve como trabajar con dos documentos: Var Si, No, Blanco, Nombre, Clave, Tipo, Dos : OleVariant; Begin Dos := 2; Tipo := 0; Si := 1; No := 0; Blanco := ''; Clave := 'Contrasea'; Nombre := 'C:\Documento.doc'; WordApplication1.Documents.Open(Nombre,No,No,No,Clave,Blanco,Si, Blanco, Blanco, Tipo).Activate; WordApplication1.Visible := True; WordApplication1.Documents.Add (Blanco, No).Activate; WordApplication1.ActiveDocument.Range(EmptyParam,EmptyParam).Text:= 'Hola'; WordApplication1.Documents.Item (Dos).Activate; WordApplication1.ActiveDocument.Range (EmptyParam, EmptyParam).Text := WordApplication1.ActiveDocument.Range (EmptyParam, EmptyParam).Text + 'Num2'; end; Despuesdeinicializarlasvariables,cargamosundocumento,queseconvierteenel primerodelalista.PodemosusarlodelaIormanormal.Acontinuacionaadimosun documento nuevo, y lo activamos, en la misma linea. En este momento, este pasa a ser el documento 1, y el que habiamos abierto es el segundo. Al nuevo le damos un texto de saludo.Ahoraactivamoselsegundo(elquehabiamoscargado)yleaadimoseltexto 'Num2. Hay que tener en cuenta que el rango de estos documentos necesitan un parametro de inicio y otro de Iin, aunque se pueden dejar vacios para seleccionar todo el documento, comohaciaanteriormente'Range.Siestoresultaincomodo,sepuedecrearuna variabledetipo'Range,asignarlatodoeldocumento,ytrabajarsobreella.Eneste caso,nosenotaraladiIerenciadetrabajarconundocumentooconlalistade documentos. Var Dos : OleVariant; Rango : Range; begin Dos := 2; WordApplication1.Documents.Item (Dos).Activate; Rango := WordApplication1.ActiveDocument.Range (EmptyParam, EmptyParam); Rango.Text := Rango.Text + 'Num2'; end; Estas lineas tienen el mismo eIecto que las dos ultimas del ejemplo anterior. Ademas, lapropiedad'Paragraphsestaincluidadentrode'Range,node'ActiveDocument, de Iorma que podremos trabajar sin problemas con nuestra variable. Adornos Wordincluyeunaseriedecaracteristicasquesepuedenconsiderarsimplesadornos, comoimagenesenlosbordesdelapagina,eIectosdetextoyotrossimilares.Aqui veremos algunos de ellos. Wordtieneunimpresionanteconjuntodeimagenesparalosmargenesdelapagina, llegandohasta164distintas.Novoyalistaraquitodos,soloindicarequeestan numerados desde el 0 hasta el 164, siendo el numero 0 la opcion por deIecto (sin borde). Paralosinteresados,enelarchivoWord97.pas(Delphi6.OenelWord2000.pas) puedenencontrarunalistadelasconstantesdebordes.Todasellasempiezanpor 'wdArt. Por ejemplo : 'wdArtApples o 'wdArtIceCreamCones. WordDocument1.Sections.First.Borders.Item(4).ArtStyle:= wdArtChristmasTree; WordDocument1.Sections.First.Borders.Item(3).ArtStyle:= wdArtChristmasTree; WordDocument1.Sections.First.Borders.Item(2).ArtStyle:= wdArtChristmasTree; WordDocument1.Sections.First.Borders.Item(1).ArtStyle:= wdArtChristmasTree; Conesto,ponemosloscuatrobordesalaprimerapaginadeldocumento.Loscuatro debenseriguales,encasocontrario,todosellostomaranelvalordelultimoborde asignado. Tambien se puede seleccionar solo algunos de ellos. TambiensepuedenaadirbordesaunparraIooaunaselecciondeltexto.Eneste caso, seran bordes sencillos, no las imagenes que hemos visto. WD.Paragraphs.Item(6).Borders.Enable:=0;//Quitar/Ponertodoslos bordes a un prrafo WD.Paragraphs.Last.Borders.Item(2).Visible := True;//Poner 1 borde Lapropiedad'Paragraphstieneasuvezlapropiedad'Borders.Aquipodemos asignarunbordeatodoelparraIo(Enable:1),quitarselo(Enable:0)oactivar/ desactivar uno a uno. La numeracion de los bordes es la siguiente: ValorBorde 1Arriba 2Izquierda 3Abajo 4Derecha De la misma Iorma se pueden poner bordes a un rango. De los bordes podemos conIigurar el grosor de las imagenes usadas ('ArtWidth), el colordelaslineas('ColorIndex),estilodelaslineas('LineStyle)ysuancho ('LineWidth). Ademas de su visibilidad. En cuanto al estilo, tenemos 23 opciones, de lascualeslistoalgunas.Ellistadocompleto,enelarchivoWord97(Delphi6.Oenel Word2000.pasB;

ConstanteTipo wdLineStyleNoneSin borde wdLineStyleSingleBorde normal; una linea wdLineStyleDotBorde punteado wdLineStyleDoubleDoble borde wdLineStyleThinThickLargeGapDoble borde, linea gruesa-Iina wdLineStyleEmboss3DEIecto 3D hacia Iuera wdLineStyleEngrave3DEIecto 3D hacia dentro wdLineStyleSingleWavyOndulado En bordes normales si se puede asignar un tipo distinto a cada elemento. EnparraIosyrangossepuedeutilizarel'Shading.Estoconsisteenponeruncolor deIondoaltexto.Comoeshabitual,podemoscambiarleelcolordeIondo('Shading. BackgroundPatternColorIndex),elcolordeprimerplano('Shading. ForegroundPatternColorIndex) y tambien la Iorma de aplicarlo ('Shading.Texture). ConstanteEstilo wdTextureAutoPor deIecto (wdTextureSolid) wdTextureSolidEl color de primer plano lo cubre todo wdTextureHorizontalRayas horizontales Iinas wdTextureVerticalRayas verticales Iinas wdTextureCrossA cuadros Iinos en horizontal wdTextureDiagonalCrossA cuadros Iinos diagonales wdTextureDiagonalDownDiagonales Iinas hacia abajo wdTextureDiagonalUpDiagonales Iinas hacia arriba wdTexture50Percent50 del color de primer plano Ademas, hay algunas variaciones a partir de estos. Las rayas, cuadros y diagonales se puedenhacergruesas,aadiendoles'Darkalnombredespuesde'Texture.Un ejemplo : 'wdTextureDarkVertical. Tambien se pueden usar otros porcentajes ademas delindicado.Losvaloresvariande2,5en2,5.Porejemplo,loscuatroprimerosson: 'wdTexture2pt5Percent,'wdTexture5Percent,'wdTexture7pt5Percent, 'wdTexture10Percent. De esta Iorma llega hasta 97,5 ('wdTexture97Pt5Percent). Elultimodelosadornossonlasanimaciones.EstasconsistenenunospocoseIectos queWordpuedeaadirasustextos.TambiendisponibleenparraIosyrangos,esta propiedad se llama 'Animation, y tiene las siguientes opciones: ConstanteAnimacin wdAnimationNoneNinguna. Texto normal. wdAnimationMarchingRedAntsUna hilera de rayas rojas se mueven alrededor del texto wdAnimationMarchingBlackAntsComo el anterior, pero en negro wdAnimationLasVegasLightsLucecitas que brillan alrededor del texto wdAnimationBlinkingBackgroundAlterna los colores de Iondo y de primer plano wdAnimationShimmerHace que el texto se vea borroso wdAnimationSparkleTextSuperpone cuadros multicolores al texto Todasellassemuevenoseenciendenyseapagan.Estacaracteristicasoloes compatible con el Iormato de Word, por lo que puede dar Iallos si se graba en Iormato .RTF Para cambiar el espaciado entre lineas existen los procedimientos 'Space2, 'Space1 y'Space15,quepertenecena'Paragraphs.Conestos,elespacioseraeldoble,el normal o 1,5 veces el normal. Todos los adornosy los estilos permanecen activos hasta que se desactivan, como es logico, por lo que si los aplicamos a un parraIo y despues seguimos escribiendo en otra parte,elnuevotextoutilizaralosadornosyestilosquehayamosasignado.Tendremos quedesactivarloscadavezqueseusen,oaplicarloscuandoesteeldocumento terminado. Tablas LastablasdeWordsemanejancomounanidamientodearrays.Unaarraycontiene todas las tablas, siendo cada una de estas un elemento. En cada tabla, dos arrays, de Iilas y de columnas. Y en cada uno, otro para las celdas. Todos los arrays se pueden usar de la misma Iorma: se pueden aplicar cursivas a toda una tabla, solo a una Iila o columna, una celda o a parte del texto de la celda. Crear una tabla es sencillo: WordDocument1.Tables.Add (WordDocument1.Paragraphs.Last.Range,3,4); DELPHI6.EnlalistadeparametroshavqueaadirDefaultTableBehaviorv AutoFitBehavior.Laprimeraindicasidebeautoafustarselasceldasalcontenido,la segundaindicacomohacerlo.Lasiguienteimagenmuestraunatablasinafuste,una conafustetipo0,detipo1vdetipo2).Comopuedeverse,eltipo0mantienelas proporciones entreceldas cuando es posible. Tipo 1 afusta segun elcontenido. Y el 2, afusta por contenido, cuando lo hav Tienetresparametros:Elrangoenelquevaaestarlatabla,numerodeIilasy numero de columnas. Si hayalgun texto en el rango indicado, sera reemplazado por la tabla. WordDocument1.Tables.Add (WordDocument1.Paragraphs.Last.Range,3,4); WordDocument1.Tables.Item(1).Rows.Item(1).Range.Bold := 1; WordDocument1.Tables.Item(1).Columns.Item(2).Cells.Item(3).Range.Text:= Texto; Aquicreounatabla,detresIilasycuatrocolumnas.Acontinuacion,seleccionola primeraIilayleapliconegrillas.Porultimo,accedoalaceldaterceradelasegunda columna de la primera tabla, y le cambio el texto. Otra Iorma de acceder a las celdas es: WD.Tables.Item(1).Cell(1,1).Range.Text := 'Texto'; Para cualquiera de las propiedades que contienen 'Item (de los documentos, bordes y tablas) se pueden contar sus elementos con la propiedad 'Count : 'Documents.Count, 'Tables.Count. Lastablasseborrancon'Tables.Item(x).Delete.ParalasIilasycolumnasesigual, mientrasqueparalasceldas,esnecesariounparametro('ShiItCells)queindicaque ocurre con el resto de celdas, ya que no puede quedar un hueco en la tabla. ConstanteEfecto wdDeleteCellsShiItLeItLas celdas de la misma Iila se desplazan a la izquierda wdDeleteCellsShiItUpLas celdas de la misma columna se desplazan hacia arriba wdDeleteCellsEntireRowSe borra toda la Iila wdDeleteCellsEntireColumnSe borra toda la columna Paracombinardosceldas,seseleccionaunadeellas,yseleindicahastadonde combinarse WordDocument1.Tables.Add (WordDocument1.Paragraphs.Last.Range,4,4); WordDocument1.Tables.Item(1).Columns.Item(2).Cells.Item(2).Merge (WordDocument1.Tables.Item(1).Columns.Item(3).Cells.Item(3) ); Aqui se crea una tabla de 4x4, y las celdas centrales estan unidas en una sola. Parasepararlas,elmetodo'Split,alqueseleindicaelnumerodenuevasIilasy columnas que debe crear. Lastablastambienadmitencambiosensusbordes,conlapropiedad'Bordersque vimos en la seccion Adornos. Elaltoyanchodelasceldas,Iilasycolumnassecontrolanconlaspropiedades 'Height y 'Width. Se pueden aplicar a todo el conjunto de Iilas, a una Iila, al conjunto de columnas, una columna, o a las celdas. WD.Tables.Item(1).Rows.Height := 61; //Todas las filas WD.Tables.Item(1).Columns.Item (1).Width := 61; //Una columna Siseledaunvalorexcesivamentepequeo,Wordloignorara.Seconsidera demasiado pequeo cuando no cabe el texto de una celda en la misma. Si los cambios se producen en el conjunto de celdas, aIectara a la tabla completa. Por deIecto, Word crea las tablas ocupando todo el ancho de la hoja, con el alto necesario para que quepa una linea de texto en cada celda. Todas las celdas tienen las mismas dimensiones. Buscar palabras Una caracteristica importante cuando utilicemos un documento ya creado es la opcion debuscarpalabrasenelmismo,loquepermitemodiIicarlodelaIormaadecuada,o comprobarsicontienelaspalabrasclavequeindicarianqueeseldocumentoque esperabamos. Para buscar se utiliza el objeto Find, que se encuentra dentro de Range. Se le indican losparametrosdebusqueda,yacontinuacion,seejecuta.EstomodiIicaraelrangode trabajo para ajustarlo al texto encontrado. Las propiedades mas importantes son: NombreDescripcin TextEl texto que debe buscar. FontEl tipo de Iuente que debe tener el texto ForwardIndicaladirecciondelabusqueda.TrueHaciaabajo.False Hacia arriba MatchCasePara que haga distincion entre las mayusculas y las minusculas MatchDiacriticsPara que haga distincion entre las palabras acentuadas y las que no MatchWholeWordPara que busque palabras completas, en vez de Iragmentos solo MatchWildcardsUtilizaloscomodinesdebusqueda(Elasterisco|*|yel interrogante |?| ) FoundPara saber si ha encontrado algo WrapIndica lo que debe hacer si llega al Iinal del documento. Ver tabla ReplacementEspecial. Ver abajo La propiedad Wrap tiene tres posibles valores, segun lo que deseemos que haga Word si no ha encontrado nada cuando llega al Iinal del documento: ConstanteAccin wdFindAskPregunta si debe continuar wdFindContinueContinuar WdFindStopParar