34
Visual Basic - Guía del Estudiante Cap. 9 INTERFACE DE DOCUMENTOS MULTIPLES. (Multiple Document Interface MDI ) EL CONTROL RICH TEXT BOX INTERFACE DE DOCUMENTOS MULTIPLES. Lo que se va a explicar en este capítulo le será bastante familiar aunque nunca haya reparado en ello. Posiblemente haya utilizado un procesador de texto en el que está escribiendo una carta, y antes de terminar de escribir esa carta, comienza a escribir otro documento, y posiblemente otro, y tenga los tres documentos en la pantalla al mismo tiempo, bien en ventanas escalonadas, (cascada), bien en ventanas en forma de mosaico, o simplemente tapando unas a otras completamente. Los tres documentos están en su procesador de textos, y puede actuar sobre uno u otro simplemente eligiendo el deseado mediante el mecanismo que le proporciona su procesador de textos. Este sistema no es ni mas ni menos que una interface de documentos múltiples. En programación, a este tipo de aplicaciones las denominamos MDI Para crear una aplicación MDI debe hacerse mediante un Formulario Padre al que se le añaden tantos Formularios Hijo como documentos tengamos. Al formulario padre le denominamos Formulario MDI, y a los formularios hijo en Visual Basic se les denomina formularios MDIChild. En esta Guía del Estudiante se usarán indistintamente una u otra denominación. La única diferencia entre un formulario normal y un formulario Hijo es que éste tiene la propiedad MDIChild a True. Para realizar una aplicación MDI, lo primero que hay que hacer es introducir en ella un formulario MDI. Para introducirlo, basta con hacer click en Insertar | Formulario MDI de la barra de menú. Solamente se puede tener un formulario MDI en una aplicación. Puede observar que una vez que ha introducido uno, la palabra Formulario MDI del submenú Insertar queda deshabilitada. Una vez que tiene un formulario MDI puede introducir tantos formularios hijo como desee. Para que un formulario sea formulario hijo basta con poner a True su propiedad MDIChild. En una aplicación MDI pueden coexistir formularios hijo y formularios normales. Propiedades de los formularios MDI Aparte de las propiedades de un formulario normal, un formulario MDI tiene las siguiente propiedades : LSB Visual Basic - Guía del estudiante Capítulo 9 Página 1

Capitulo 9 Visual Basic

Embed Size (px)

DESCRIPTION

Manual Visual Basic

Citation preview

Visual Basic - Guía del Estudiante Cap. 9

INTERFACE DE DOCUMENTOS MULTIPLES. (Multiple Document Interface MDI )EL CONTROL RICH TEXT BOX

INTERFACE DE DOCUMENTOS MULTIPLES.

Lo que se va a explicar en este capítulo le será bastante familiar aunque nunca haya reparado en ello. Posiblemente haya utilizado un procesador de texto en el que está escribiendo una carta, y antes de terminar de escribir esa carta, comienza a escribir otro documento, y posiblemente otro, y tenga los tres documentos en la pantalla al mismo tiempo, bien en ventanas escalonadas, (cascada), bien en ventanas en forma de mosaico, o simplemente tapando unas a otras completamente. Los tres documentos están en su procesador de textos, y puede actuar sobre uno u otro simplemente eligiendo el deseado mediante el mecanismo que le proporciona su procesador de textos. Este sistema no es ni mas ni menos que una interface de documentos múltiples. En programación, a este tipo de aplicaciones las denominamos MDI

Para crear una aplicación MDI debe hacerse mediante un Formulario Padre al que se le añaden tantos Formularios Hijo como documentos tengamos. Al formulario padre le denominamos Formulario MDI, y a los formularios hijo en Visual Basic se les denomina formularios MDIChild. En esta Guía del Estudiante se usarán indistintamente una u otra denominación.

La única diferencia entre un formulario normal y un formulario Hijo es que éste tiene la propiedad MDIChild a True.

Para realizar una aplicación MDI, lo primero que hay que hacer es introducir en ella un formulario MDI. Para introducirlo, basta con hacer click en Insertar | Formulario MDI de la barra de menú. Solamente se puede tener un formulario MDI en una aplicación. Puede observar que una vez que ha introducido uno, la palabra Formulario MDI del submenú Insertar queda deshabilitada.

Una vez que tiene un formulario MDI puede introducir tantos formularios hijo como desee. Para que un formulario sea formulario hijo basta con poner a True su propiedad MDIChild.

En una aplicación MDI pueden coexistir formularios hijo y formularios normales.

Propiedades de los formularios MDI

Aparte de las propiedades de un formulario normal, un formulario MDI tiene las siguiente propiedades :

AutoShowChildren. Muestra los formularios hijo nada mas cargarlos.

Esta propiedad puede verse si se carga un formulario hijo mediante la sentencia :

Load NombreFormularioHijo

Si la propiedad AutoShowChildren está a True, el formulario cargado se verá inmediatamente. Si está a False, será necesario ejecutar la sentencia NombreFormularioHijo.Show para presentarlo.

ActiveForm Mediante esta propiedad podemos conocer el formulario activo dentro de una aplicación de documentos múltiples. (El formulario activo es aquel que tiene el foco)

MiVariable = ActiveForm.caption

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 1

MiVariable contendrá el Caption (Barra de Titulo) del formulario activo.

ActiveForm.Backcolor = RGB (255,0,0)

pondrá el fondo del formulario activo de color rojo.

ScrollBars Hace que el Formulario MDI (padre) muestre barras de Scroll para presentar en toda su extensión a un formulario hijo, cuando las dimensiones de áste superan las de aquel.

Aparte de estas propiedades que diferencian un Formulario MDI de un Formulario normal, los Formularios MDI presentan otras particularidades.

Inserción de Controles Solamente podrán introducirse en un formulario MDI aquellos controles que tengan la propiedad Align. (Picture, Data, DBGrid) y solo permiten que se presenten con alineación a uno de los lados del Formulario (Top, Bottom, Left o Right)

El control Picture puede trabajar como contenedor de otros controles. Por lo tanto, para poder introducir cualquier control (TextBox, Label, CommandButton ...) será necesario introducir un control Picture, y sobre el, poner los controles que se necesiten.

Línea de Menú. Cuando existe la línea de Menú en un Formulario MDI y en el Formulario Hijo que introduzcamos en él, la línea de menú del Formulario MDI se sustituye por la línea de menú del Formulario Hijo introducido.

Barra de Título. La Barra de Título del Formulario MDI se conserva siempre. Pero si el Formulario Hijo insertado dentro de él está maximizado (ocupa toda la extensión del Formulario MDI), a la barra de título se le añadirá la barra de Título del Formulario Hijo entre paréntesis.

Para hacer que un Formulario sea un formulario hijo basta con ponerle su propiedad MDIChild a True.

Puede preparar los formularios hijo uno a uno e introducirlos dentro del formulario MDI según las necesidades de la aplicación. Este sería el caso de una aplicación con varias pantallas, todas ellas colocadas sobre una pantalla fija (Formulario MDI) del que se aprovecha quizás alguna parte como parte común de toda la aplicación (Menú, Título, Barra de herramientas montada sobre un Picture, etc.)

Puede también darse el caso de introducir un número indeterminado de ventanas iguales para realizar varias veces la misma función, pero sobre ventanas diferentes. (Caso del procesador de texto que tiene varias ventanas de texto, cada una con un documento. Lo que desconocemos a priori es el número de documentos que vamos a editar)

Para el primer caso, será necesario crear cada una de las ventanas, e introducirlas y quitarlas según pida la aplicación.

En segundo caso, bastará con crear un formulario hijo con todas las partes necesarias para su correcto funcionamiento, y luego, realizar tantas “fotocopias” de ese formulario como ventanas necesitemos. Lo que introducimos en la aplicación son precisamente esas “fotocopias”, pero no el original, que lo seguimos manteniendo intacto para volver a copiarlo si fuese necesario.

A esas “fotocopias” de un formulario las llamamos Instancias. Al original le llamaremos Clase.

En realidad una Clase es la definición de un objeto Visual Basic. Un objeto Visual Basic puede ser un Formulario, un control, un objeto de acceso a datos.

La Instancia es la réplica de una clase. Puede ser la réplica de un Formulario, de un control o de otro objeto. La Instancia lleva las mismas Propiedades que la clase. Se dice que hereda las propiedades. (Excepto la propiedad Visible, que siempre, por defecto, aparece a False).

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 2

Cuando se varía una propiedad de una Instancia, no se altera el valor de esa propiedad en la Clase ni en ninguna de las restantes Instancias.

Después de toda esta teoría, ¿podemos saber como se crea una Clase de un formulario ? O dicho de manera mas coloquial, ¿Cómo se crea un Formulario para poder hacer varias “fotocopias” de él ?

La respuesta es obligatoriamente mas sencilla que la teoría. Con el formulario vacío que tengamos en el proyecto (Insertemos un Formulario si fuese necesario) pongámosle todos los controles que deseemos. Le podemos poner un Menú y cambiar a nuestro antojo todas sus propiedades. Entre ellas, la propiedad MDIChild. Si vamos a introducir las Instancias de ese Formulario en un Formulario MDI esa propiedad debe estar a True, y por lo tanto sus Instancias saldrán igualmente con esa propiedad a True. Pongámosle un nombre y ya está creada la clase. Supongamos que ese nombre es FormularioHijo

Para crear ahora Instancias de ese Formulario podemos hacerlo de dos formas :

Declarar una variable tipo Objeto. No se asuste. Para declarar que una variable es un Formulario basta con declararla de la siguiente forma :

Dim MiVentana As Form

Esta variable debe declararla en sitio adecuado para su aplicación, y el ámbito de esa variable objeto será el mismo que para cualquier tipo de variable. (Vea Ambito de las Variables) La sentencia a utilizar para la declaración será Dim, Private, Public o Global tal como se explicó para las variables.

Una vez declarada como variable puede hacerla igual a un objeto existente que servirá de modelo (Una Clase) que estará definida por un nombre: (P.e. FormularioHijo)

Set MiVentana = New FormularioHjo

Podemos hacer las dos operaciones a un tiempo : declarar y crear la copia :

Dim MiVentana As New FormularioHijo Una vez creado la instancia del formulario debemos cargarlo en el Formulario Padre. Para cargarlo debemos emplear la sentencia Load MiVentana, con lo que quedará cargado en la memoria, pero, dependiendo de como está la propiedad AutoShowChildren del Formulario Padre se mostrará o no se mostrará. Para que se muestre, independientemente de como esté esa propiedad, basta con ejecutar MiVentana.Show. En realidad mediante el método Show un formulario no solamente se muestra, sino que también se carga en la memoria si no estuviese previamente cargado. Por lo tanto podíamos habernos ahorrado la instrucción anterior para cargarlo Load MiVentana

Es muy práctico poner un Caption distinto a cada formulario que se introduzca, caso de introducirse varios formularios hijo iguales. El Caption es una propiedad y por lo tanto todas las instancias heredan el Caption de la Clase. Sería prudente distinguir un formulario de otro mediante su Caption, es decir mediante su barra de título.

Para ello podemos crear un contador en el mismo procedimiento en el que creamos una nueva instancia, y poner el Caption de cada nuevo Formulario siguiendo un orden numeral.

Documento 1, Documento 2, Documento 3, etc.

Ese procedimiento quedará de la siguiente forma :

Static contador As IntegerDim MiVentana As New FormularioHijoMiVentana.Caption = “Documento “ & Str (contador)

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 3

MiVentana.Show

Referencias a los Formularios. ActiveForm y Me

Si queremos nombrar un Formulario Hijo dentro de una aplicación MDI el primer problema con el que nos encontramos es que todos los formularios hijo (Instancias de la misma Clase) tienen el mismo nombre. Por lo tanto no podemos nombrarlas con ese nombre, ya que la aplicación no sabría a cual de ellas nos referimos.

Si el código donde vamos a nombrar ese formulario está fuera de él (P.e. en el Formulario Padre) deberemos referirnos al formulario hijo mediante ActiveForm. ActiveForm nos va a indicar cual es el formulario que está actualmente activo. Un formulario está activo cuando estamos trabajando sobre él. En ese momento tiene el foco. Permanece activo desde que hacemos click con el ratón sobre cualquiera de sus partes, hasta que activamos otro formulario. Es sencillo reconocer cual es el formulario activo pues tiene su barra de título con el color vivo.

Cada vez que hacemos una operación sobre una parte de un formulario éste se pondrá activo. Por ejemplo, si el formulario es un documento de texto, y contiene el texto en un RichTextBox de nombre RTB1, si queremos hacer una operación con el texto desde un botón colocado en el formulario padre (poner en negrita el texto seleccionado), haríamos lo siguiente :

ActiveForm.RTB1.SelBold = True

ya que siempre estaremos seguro de que el Formulario Activo es aquel en el que acabamos de seleccionar el texto.

Si el botón donde hemos puesto el botón no es el formulario padre, sino el hijo, tenemos un problema similar. Su nombre será (con los ejemplos anteriores) MiVentana, y pueden existir varios formularios con ese nombre, tantos como documentos hayamos introducido. No podemos por tanto nombrarlo con su nombre, pues hay (o puede haber) varios. Tampoco lo podemos nombrar con ActiveForm, ya que esta propiedad corresponde al Formulario Padre. La solución es nombrarle mediante Me. Me siempre se refiere al formulario que contiene al procedimiento donde está esa palabra. Por lo tanto, si tenemos un botón en el formulario hijo con la instrucción :

Me.RTB1.SelBold = True

Me se refiere concretamente a ese formulario.

Colocación de los Formularios Hijo - Método ARRANGE

Mediante el método Arrange podemos distribuir los formularios hijo dentro del formulario padre. Pueden colocarse en cascada, mosaico horizontal, mosaico vertical o como iconos.

SintaxisNFMDI.Arrange distribución

donde

NFMDI = Nombre del Formulario MDI

distribución puede tomar los siguientes valores o constantes :

Constante Valor Descripción

vbCascade 0 Dispone todos los formularios MDI secundarios no minimizadosen cascada.

vbTileHorizontal 1 Dispone todos los formularios MDI secundarios no minimizados

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 4

en mosaico horizontal.vbTileVertical 2 Dispone todos los formularios MDI secundarios no minimizados

en mosaico vertical.VbArrangeIcons 3 Dispone los iconos de los formularios MDI minimizados.

Las ventanas o los iconos se pueden distribuir incluso si el objeto MDIForm está minimizado. Los resultados son visibles cuando el objeto MDIForm se maximiza.

Posición de los Formularios en el Eje Z - Método ZOrder

Cuando tenemos varios formularios hijo, unos ocultan a los otros. Mucho mas si los formularios están maximizados. Podemos colocar un formulario hijo en la parte frontal del montón de formularios (para que se vea completamente) o llevarle a la posición mas atrás mediante el Método ZOrder.

Sintaxis NFH.ZOrder posición

Donde NFH = Nombre del Formulario Hijo

posición puede se 0 ó 1. Si es 0 (o si se omite) el formulario se coloca en primer plano. Si es 1 el formulario se coloca en el fondo del eje Z.

ZOrder es un método que no solamente se puede emplear con formulario hijo, sino con cualquier instancia. Puede emplearlo también con cualquier control. Pero lea detenidamente la Ayuda de este método, ya que no todos los controles la admiten.

Mostrar los Formularios existentes mediante el Menú -- Propiedad WindowList

Al explicar el Editor de menús casi se pasó por alto una propiedad del menú : WindowList. Cuando se activa esta propiedad (Puede activarse para una sola palabra del menú. Si se pretende activar para mas de una dará un error), esa palabra que tiene activada la propiedad WindowList mostrará al hacer click sobre ella, en un menú desplegable, el Caption (Barra de Título) de todos los formularios hijo cargados en ese instante en la aplicación. Pueden estar incluso minimizados.

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 5

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 6

EL CONTROL RICH TEXT BOX

El control RichTextBox es una caja de texto con mas prestaciones que el TextBox. No está normalmente en la caja de herramientas, por lo que habrá que ir a Proyecto | Componentes y elegir Microsoft RichTextBox Control. El icono que presenta en la caja de herramientas es el siguiente :

Frente a la rigidez del TextBox, este control nos permite escribir un texto utilizando distintos tipos de fuentes en el mismo texto, e introducir mas de 65.536 caracteres, límite máximo del TextBox. Aparte de estas, tiene otras características respecto a la forma de guardar y leer el texto en un fichero, que le convierten en una herramienta muy útil para el diseño de aplicaciones en las que haya que introducir documentos de texto.

El RichTextBox puede utilizar indistintamente formato de texto Ascii (que le llamaremos Texto Plano) o formato RTF (RichTextFormat, que llamaremos Texto enriquecido) El formato de Texto enriquecido es un formato de intercambio entre procesadores de texto. Vea al final del capítulo una explicación más detallada de este formato de texto. De momento basta con decir que permite poner tipos distintos de letras, de tamaños, de colores, introducir gráficos, y toda una serie de ventajas que le van a permitir realizar procesadores de texto casi tan perfectos como los editores comerciales mas conocidos. Esto nos permite por ejemplo, guardar estrictamente las letras que componen el texto (Propiedad Text de RichTextBox) o guardar el texto, con sus letras y todos los adornos que queramos ponerles (Tipos distintos de fuente, negrita, cursiva, …). Esto lo logramos con la propiedad TextRTF del RichTextBox. Cuando hablamos de guardar, nos estamos refiriendo lógicamente a guardarlo en un fichero en el disco, y también a guardarlo en el portapapeles. Si tenemos un RichTextBox de nombre RTB (así le llamaremos en todos los ejemplos) con un texto tal como

Te creías muy listo Flanahan, pero tus vacas no pasarán por mis tierras

La propiedad Text contendrá los siguiente

RTB.Text = Te creías muy listo Flanahan, pero tus vacas no pasarán por mis tierras

La propiedad TextRTF contiene toda la información, pero eso sí, en formato RTF

RTB.TextRTF={\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswissMS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fswiss\fprq2Arial;}}{\colortbl\red0\green0\blue0;}\deflang1034\pard\li708\plain\f2\fs20 Te cre\'edas muy listo \plain\f2\fs20\b\i Flanahan\plain\f2\fs20 , pero tus \plain\f2\fs24 vacas\plain\f2\fs20 no pasar\'e1n por \plain\f2\fs20\ul mis tierras\plain\f2\fs20 \par \pard\plain\f0\fs17 \par }

(Puede que el texto anterior tenga alguna diferencia sobre el real, debido a que hubo que introducirle algún retorno de carro para poder presentarlo)

Veamos las propiedades de este control

Propiedades del RichTextBox

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 7

El RichTextBox tiene todas las propiedades del TextBox, y además otras que son las que le dan las características excepcionales a este control. Las tres siguientes propiedades son idénticas para ambos controles :

SelLenght Devuelve o establece el número de caracteres seleccionados. Los caracteresseleccionados son aquellos que se ponen en vídeo inverso cuando arrastramos con el ratón.

SelStart Devuelve o establece el número del carácter de comienzo del textoseleccionado.

SelText Devuelve o establece la cadena de caracteres seleccionados. Si no hay ningúncarácter seleccionado devuelve la cadena “” (cadena vacía)

En el ejemplo, el texto seleccionado es ejemplo nos permitirá, texto que hemos seleccionado con el ratón. Las propiedades anteriores tomarán estos valores para ese texto seleccionado :

SelLenght = 21 (Recuerde que el espacio también es un carácter)

SelStart = 5 (La e de ejemplo es la sexta letra, pero empieza a contar por la 0)

SelText = ejemplo nos permitirá

Recuerde que estas propiedades son tanto de lectura como de escritura. Es decir, puede seleccionar un texto con el ratón y analizar ese texto seleccionado, o seleccionar el texto dándole valores a estas propiedades.

Las diferencias entre uno y otro control comienzan ahora. En un RichTextBox, con un texto seleccionado, podemos cambiar el tipo de letra, su tamaño, su color, etc.

Tipos y tamaño de las fuentes. El RichTextBox tiene la propiedad Font, propiedad que podemos cambiar e tiempo de diseño o en tiempo de ejecución, y que se refiere a la globalidad del RTB. Debemos señalar que en el RTB, la propiedad Font es en sí un objeto más. Objeto que tiene sus propiedades (Name, Size, Bold, Italic, etc.) Esto ocurre con los controles modernos, dada la tendencia de VB de ser cada día más un lenguaje orientado a objetos. No ocurre lo mismo con otros controles ya conocidos (CommonDialog, por ejemplo) que deben mantenerse con la nomenclatura anterior por razones

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 8

de compatibilidad con versiones anteriores de VB. Veamos esto en el siguiente ejemplo, en el que se modifica la propiedad Font de RTB con el CommonDialog CD1

RTB.Font.Name = CD1.FontNameRTB.Font.Size = CD1.FontSizeRTB.Font.Bold = FalseRTB.Font.Italic = False

(Observe que en el RTB ponemos Font.Name y en el CD1 ponemos FontName)

Con la propiedad Font podemos escribir en el RTB usando la misma letra para todo el texto. Sin embargo verá que esta propiedad prácticamente no se va a usar, ya que el RTB tiene la gran ventaja que puede usar varios tipos de letra y tamaños dentro de un mismo texto. Puede usar también varios colores. Para poder cambiar de letra no usaremos Font.Name, sino SelFontName, (Fíjese que esta propiedad no lleva ningún punto intermedio) que cambia el tipo de letra en el texto que hayamos seleccionado, y si no hemos seleccionado ningún texto, y el cursor de escritura se encuentra al final del texto escrito, lo que hará será cambiar el tipo de letra a partir de ese punto.

Propiedades SelBold, SelItalic, SelStrikethru, SelUnderline

Estas propiedades son del tipo Booleano (True/False) y nos permitirán poner el texto seleccionado en Negrita, Cursiva, Tachada y Subrayada respectivamente.

Por ejemplo, RTB.SetBold = True pondrá el negrita el texto seleccionado.RTB.SelItalic = True pondrá en cursiva el texto seleccionado.RTB.SelStrikethru = True pondrá en tachado el texto seleccionado.RTB.SelUnderline = True pondrá en subrayado el texto seleccionado.

( RTB = Nombre del control RichTextBox )

Si el texto seleccionado está en la parte final del texto, o si el cursor de escritura está al final del escrito y no se ha seleccionado ningún texto, la propiedad elegida permanecerá vigente para la escritura que se realice a partir de ese punto.

SelFontName Esta propiedad devuelve o establece el nombre de la fuente en el texto seleccionado. P.e. RTB1.SelFontName = “Arial”

SelFontSize Devuelve o establece el tamaño de la fuente en el texto seleccionado.P.e. RTB1.SelFontSize = 10

SelColor Devuelve o establece el color del texto seleccionado. Para definir el color puede usarse cualquiera de los métodos explicados en un capítulo anterior. Los ejemplos siguientes cambiarán el texto seleccionado a color rojoRTB.SelColor = RGB (255,0,0) RTB.SelColor = 255RTB.SelColor = &HFF

Al igual que las otras propiedades, si el texto seleccionado está al final del texto, o si el cursor de escritura está al final del escrito, la propiedad elegida permanecerá vigente para la escritura que se realice a partir de ese punto.

Propiedades Text y TextRTF

Las vimos al principio. La propiedad Text contiene TODO el texto del RichTextBox en formato de texto plano. La propiedad TextRTF contiene TODO el texto del RichTextBox en formato de texto enriquecido.

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 9

Estas propiedades son de lectura y escritura, de forma que pueden tener estas dos sintaxis:

Escritura: RTB.Text = “Siempre nos quedará París”

Esta instrucción sustituye todo el contenido del RTB por el texto Siempre nos quedará París

Lectura: MiVariable = RTB.Text

MiVariable contendrá todo el contenido de RTB en formato de texto plano

La propiedad TextRTF es similar, pero con texto en formato enriquecido. Si la usamos como lectura:

MiVariable = RTB.TextRTF

MiVariable contendrá el texto, más los caracteres que definen el tipo de letra, tamaño, etc, como vimos al principio.

Si la usamos como escritura:

RTB.TextRTF = TuVariable

Si TuVariable contiene un texto en formato RTF, el contenido de RTB será justamente ese texto, con todas sus florituras de tipo de letra, tamaño, negrita, etc. Si TuVariable contuviese un texto en formato de texto plano, lo escribirá tal cual, con el tipo y tamaño de letra que tenga en su propiedad Font.

Propiedades SelText y SelRTF

Es conveniente no confundirlas con las anteriores. Aquellas contenían TODO el texto del RichTextBox. Estas, solo el texto que está seleccionado.

SelText Devuelve o establece el texto seleccionado en formato de texto plano. No está disponible en tiempo de diseño. Al ser una propiedad de lectura y escritura, nos permite:Escritura: añadir texto (que se colocará en la posición en la que esté el curso) o cambiar el texto seleccionado por otro. La instrucción

RTB.SelText = “Siempre nos quedará París”

Introducirá el texto anterior en la posición donde estuviera el cursor, o si teníamos texto seleccionado, cambiará el texto anterior por este.

Lectura: Teniendo un trozo de texto seleccionado,

MiVariable = RTB.SelText

MiVariable tomará el valor del texto que estuviese seleccionado en formato de texto plano.SelRTFDevuelve o establece el texto seleccionado en formato .RTF. Al igual que SelText es de lectura y escritura. No está disponible en tiempo de diseño.

Sintaxis (Escritura) RTB.SelRTF = MiVariable

Si el contenido de MiVariable está en formato RTF, sustituirá el texto que tuviésemos seleccionado por el contenido de MiVariable, y lo escribirá con todos los detalles de tipo de letra, tamaño, etc., que contuviese el formato RTF. Si no hubiésemos seleccionado previamente ningún texto, escribirá ese texto en el lugar donde estuviese colocado el cursor.

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 10

Si el contenido de MiVariable fuese un texto plano, escribirá ese texto, usando las mismas propiedades para la letra que tuviese el texto seleccionado previamente, o las del punto donde se encontrase el cursor. Sintaxis de Lectura) MiVariable = RTB.SelRTF

MiVariable contendrá el texto que estuviese seleccionado, en formato RTF.

Esta propiedad es equivalente a la propiedad SelText y funciona de forma idéntica, pero en este caso el texto reemplazado o devuelto mediante la propiedad SelRTF está en formato RTF. Esta propiedad devuelve una cadena de longitud cero ("") si no hay texto seleccionado en el control.

Alineación y márgenes del texto

El RichTextBox permite crear un margen desde el borde izquierdo hasta el comienzo de la escritura, (Propiedad SelIndent), y otro margen desde el borde derecho hasta el final de la línea (Propiedad SelRightIndent), o limitar el ancho de la línea (Propiedad RightMargin). También se puede poner una sangría a las líneas segunda y siguientes respecto a la primera línea del párrafo (Propiedad SelHangingIndent). Este tipo de sangría es la sangría francesa, sangría que no se suele usar (a lo mejor se usa en Francia). En realidad lo que se usa mucho es separar la primera línea del párrafo un poco más que el resto de las líneas. Esto puede conseguirse dando un valor negativo a la propiedad SelHangingIndent. Lo verá mas adelante.

La medida de estos márgenes y sangrías se realiza en las unidades de medida del formulario que contiene al RichTextBox. Veamos un ejemplo comentado de estas propiedades.

Margen izquierdo. Con la instrucción

RTB.SelIndent = Val(TBSangria)

Separa el párrafo correspondiente a la línea donde está en ese momento al cursor. (Que a partir de ahora la llamaremos Línea en curso) El espacio que separa ese párrafo del borde izquierdo del RichTextBox es un valor igual al que hayamos introducido en el TextBox TBSangría, medido en las unidades de medida del formulario que contiene a RTB. Recuerde, sólo hace la sangría con el párrafo que contiene la línea en curso.

Si queremos separar varios párrafos, debemos seleccionar esos párrafos antes de ejecutar la instrucción anterior. Para poner una separación desde el borde izquierdo de todas los párrafos del texto deberemos primero, seleccionar todo el texto, y luego ejecutar la instrucción anterior. Esto podemos lograrlo combinando estas tres instrucciones:

RTB.SelStart = 1RTB.SelLength = Len(RTB.Text)RTB.SelIndent = Val(TBSangria)

Margen derecho. Usaremos la propiedad SelRightIndent. Con la instrucción:

RTB.SelRightIndent = Val(TBMargenDcho)

Separamos el final del párrafo donde está la línea en curso una distancia igual al valor de TBMargenDcho. Esta propiedad es completamente equivalente a la anterior, esta referida al margen derecho y aquella al margen izquierdo. Es aplicable todo lo que se dijo para SelIndent.

Longitud máxima de la línea desde el borde izquierdo. Parece un poco largo la definición de esta propiedad. Se refiere a la propiedad RightMargin. Esta propiedad marca la distancia desde el borde izquierdo del RichTextBox hasta el límite máximo utilizable por el

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 11

texto. Este valor es el que se toma como fin de la zona utilizable por el texto, por lo tanto, ese punto será la referencia que utilice la propiedad SelRightIndent para determinar el punto a partir del cual creará el margen derecho. También será la referencia derecha cuando centremos un texto o lo alineemos a la derecha.

RTB.RightMargin = Val(TBAncho)

La instrucción anterior fija como distancia máxima que puede ocupar una línea de texto la cantidad introducida en TBAncho. Por supuesto, expresada como siempre en las unidades de medida del formulario. La línea puede ser mas ancha que el ancho del RichTextBox. En este caso la línea no cabe en el RTB, pero puede visualizar la línea completa usando baraas de scroll horizontales (Vea propiedad ScrollBars más adelante)

Sangría francesa. La sangría francesa consiste en separar la segunda línea y siguientes cierta medida a la derecha respecto a la primera línea. Algo así

Esta es la primera línea de este texto donde se explica lo que es una sangría francesaen realidad desconozco si en Francia usan este tipo de sangría, pero a míme gusta más la sangría española, siempre que esté bien fresquita.

Esto se logra mediante la propiedad SelHangingIndent y afecta únicamente al párrafo donde se encuentra la línea en curso.

Puede hacer lo que parece mas lógico, separar la primera línea un poco respecto a las demás, dando un valor negativo a la propiedad SelHangingIndent. Pero para que esto resulte, debe poner un valor al menos igual a la propiedad SelIndent. En el ejemplo siguiente, hacemos una sangría solamente a la primera línea del párrafo donde está la línea en curso:

RTB.SelIndent = Val(TBSangriaEsp)RTB.SelHangingIndent = -Val(TBSangriaEsp)

(Observe el signo menos en la segunda línea) El valor de la sangría de la primera línea será el contenido en TBSangriaEsp

Centrado, Alineación a la izquierda o a la derecha. El centrado de una línea o párrafo se logra mediante la propiedad SelAlignment Puede tomar los valores 0 (alineado a la izquierda), 1 (a la derecha) ó 2 (centrado) Siempre se refiere a la línea en curso o al párrafo que contiene la línea en curso. Si quiere alinear varios párrafos, debe seleccionarlos antes de ejecutar la instrucción de alineamiento.

RTB.SelAlignment = 0 ‘alinea a la izquierdaRTB.SelAlignment = 1 ‘alinea a la derechaRTB.SelAlignment = 2 ‘centra el texto

En la alineación se tiene en cuenta la propiedad RightMargin, es decir, si alinea a la derecha, lo hará tomando como parte mas derecha del escrito el valor de la propiedad RightMargin, no el borde lateral derecho del RTB. Lo mismo le ocurre con el centrado. Viñetas

El RichTextBox es, como decíamos al principio, un control que nos permite realizar editores de textos muy potentes. Incluso podemos poner viñetas

Una viñeta es un párrafo marcado con un punto en su comienzo, y que lleva una cierta sangría respecto al borde izquierdo del RichTextBox. Para poner una viñeta es necesario jugar con dos propiedades: SelBullet, propiedad Booleana que si la hacemos True convertimos el párrafo donde está la línea en curso en una viñeta. Si está en False, ese párrafo será un párrafo normal.

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 12

BulletIndent, propiedad a la que le pondremos un valor numérico igual a la separación que queremos poner en el texto de la viñeta.

Para que tenga efecto la propiedad BulletIndent, la propiedad SelBullet debe estar puesta a True. No tendrá efecto alguno si SelBullet = False. Por ejemplo, para poner una viñeta podemos poner

RTB.SelBullet = TrueRTB.BulletIndent = 500

Una vez puesta una viñeta en el RichTextBox, insertará otro cada vez que pulsemos ENTER. Para quitarlo, basta con ejecutar la sentencia

SelBullet = False

La propiedad BulletIndent es de lectura y escritura. La instrucción siguiente nos devuelve la separación de la viñeta donde tengamos el cursor. La propiedad BulletIndent devuelve 0 si la selección abarca múltiples párrafos con distintos ajustes de margen o si el párrafo no es una viñeta.

También podemos leer el valor de SelBullet. Devolverá

Null. La selección abarca más de un párrafo y contiene una mezcla de estilos de viñeta y no viñeta.True. Los párrafos de la selección tienen estilo de viñeta.False. La párrafos de la selección no tienen estilo de viñeta.

Tabulación del RichTextBox

Si queremos crear un editor de texto de la categoría de cualquiera de los comerciales, debemos poder tabular. Tabular significa crear unos hitos o marcas a una determinada distancia del borde izquierdo del papel, de forma que cada vez que pulsemos la tecla Tabulador el cursor de escritura se coloca al inicio del siguiente de esas marcas.

El primer problema es que si estamos escribiendo sobre el RichTextBox y pulsamos Tabulador, el foco se nos escapa hacia el siguiente control, según el orden de la propiedad TabIndex. Existe una solución, que es pulsar la combinación de las teclas Ctrl + Tab. Sin embargo esa posibilidad no es recomendable, dado que un usuario normal no está acostumbrado a realizar esa combinación para forzar una tabulación.

La solución está en poner la propiedad TabStop de todos los controles a False, cada vez que el RichTextBox toma el foco. Es decir, en su procedimiento GotFocus. De esta forma, al dar el tabulador ningún control se “querrá” quedar con el foco, y por lo tanto el foco seguirá en el RichTextBox. En estas condiciones el resultado es que el cursor de escritura pasará a la siguiente tabulación.

Vamos a ver como se puede poner la propiedad TabStop a False en todos los controles del formulario. Para ello vamos a explicar un nuevo objeto Visual Basic, el objeto Controls. Este objeto es una colección, y está formada por todos los controles del formulario. Como cualquier colección tendrá una propiedad, la propiedad Count que toma el valor igual al número de controles existentes en el formulario. Como cualquier cosa de VB formada por varios elementos, cada uno de ellos se distingue por su índice. Y este índice comienza por el 0 y termina por el n-1, siendo n = número de elementos de esa colección.

Para poner la propiedad TabStop a False en todos los controles de la colección Controls del formulario, basta con poner este código en el procedimiento GotFocus del RTB

Private Sub RTB_GotFocus()Dim I As Integer

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 13

‘Con la siguiente línea se evita el error producido en aquellos controles que no tienen la ‘propiedad TabStopOn Error Resume NextFor I = 0 To Me.Controls.Count - 1Controls(I).TabStop = FalseNext IEnd Sub

Podemos hacerlo de otra forma. Declaremos una variable tipo Objeto Control

Private Sub RTB_GotFocus()Dim Pepe As ControlOn Error Resume Next 'De esta forma se evita el error producido en aquellos controles que no tienen la propiedad TabStopFor Each Pepe In ControlsPepe.TabStop = FalseNextEnd Sub

Nota. Si va a la información del RichTextBox podrá ver un ejemplo de esto, con el siguiente código:For Each Control In Controls Control.TabStop = FalseNext ControlMilagros del Visual Basic: Así no funciona

Ya funciona perfectamente el tabulador en el RichTextBox. Pero cuando salgamos del RichTextBox, debemos volver a poner la propiedad TabStop de todos los controles a True. Para ello, en el procedimiento LostFocus del RTB pondremos el código anterior, poniendo True en vez de False en la propiedad TabStop.

Programar las medidas de las tabulaciones.

Propiedad SelTabCount

Establece el número de tabulaciones en un RTB. P.e., si queremos crear 5 tabulaciones

RTB.SelTabCount = 5

Propiedad SelTabs

Establece el valor numérico (separación desde el borde izquierdo) de las tabulaciones. Dado que pueden existir varias tabulaciones, deberemos distinguirlas entre ellas mediante un índice. El índice para la primera tabulación es el 0

RTB.SelTabs(0) = 1000RTB.SelTabs(1) = 2000RTB.SelTabs(2) = 3000RTB.SelTabs(3) = 4000 Con estas líneas determinaríamos la posición de tabulación deRTB.SelTabs(4) = 5000 los 5 tabuladores.

Antes de darle valor a la propiedad SelTabs deberemos haber creado los tabuladores mediante SelTabCount. Si pretende darle valor a un tabulador mayor que el número de tabuladores real (por ejemplo, si pone en el caso anterior RTB.SelTabs(5) = 5000) le dará un error.

Recuerde que los valores de los tabuladores debe darlos en las unidades de medida del formulario.

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 14

OTRAS PROPIEDADES

Propiedad SelCharOffset Nos permite crear subíndices y superíndices. La sintaxis es:

RTB.SelCharOffset = Número

Donde Número indica la separación del superíndice o subíndice en Twips. Si Número es positivo, obtendremos un superíndice, si es negativo, un subíndice.

Esta forma de escribir subíndices y superíndices se debe aplicar cada vez que queramos escribir uno de ellos, e inmediatamente, poner esa propiedad a 0, ya que si no lo hacemos así, escribiría como subíndice o superíndice el resto del texto. P.e. para poner un superíndice:

TamIni = RTB.SelFontSizeRTB.SelFontSize = TamIni - 4RTB.SelCharOffset = 40RTB.SetFocus

Para restaurar los valores anteriores

RTB.SelFontSize = TamIniRTB.SelCharOffset = 0RTB.SetFocus

Propiedad SelProtected

Es una propiedad Booleana, que nos permite proteger contra cualquier cambio a una parte del texto (o todo el texto) que contiene el RTB. Para proteger una parte del texto basta con seleccionarla y a continuación ejecutar la instrucción

RTB.SelProtected = True

Una vez protegida una parte del texto, esa parte no se puede variar. Puede desprotegerse, volviendo a seleccionarla y ejecutando la instrucción:

RTB.SelProtected = FalsePropiedad ScrollBars

Pone barras de desplazamiento al RichTextBox.Esta propiedad puede establecerse a 0 (None, ninguna), a 1 (Horizontal), 2 (Vertical) o 3 (Both, ambas). Cuando las barras de desplazamiento no son necesarias, bien porque hay pocas líneas, bien porque hay pocos caracteres por línea, las barras de desplazamiento están desactivadas.

Es frecuente pensar que las barras de desplazamiento horizontal no funcionan. Y eso ocurre porque siempre se ven desactivadas. En realidad lo que pasa es que solamente se activan cuando la línea de texto es mas ancha que el ancho del RichTextBox. Puede ocurrir eso cuando la propiedad RightMargin tiene un valor superior a la anchura del control, circunstancia que nos permite escribir saliéndonos del control, y es en solamente en ese caso en el que se activa la barra de scroll horizontal.

Las barras de desplazamiento pueden desactivarse mediante la propiedad DisableNoScroll.

Propiedad DisableNoScrollDevuelve o establece un valor que determina si están desactivadas las barras de desplazamiento en el control RichTextBox.

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 15

Sintaxis NombredelRichTextBox.DisableNoScroll = True / False

Si es False, las barras de desplazamiento aparecen normalmente. Si es True, las barras de desplazamiento aparecen atenuadas.

Propiedad AppearancePlano o tridimensional, como en el resto de los controles.

Propiedad AutoVerbMenuPropiedad Booleana que indica si se presenta un menú emergente cuando el usuario hace click con el botón derecho del ratón. El menú emergente muestra los comandos de Deshacer (Ctrl-Z) cortar (Ctrl-X), copiar (Ctrl-C), pegar (Ctrl-V) y Eliminar (Supr) Pero no es necesario escribir código en ninguna parte para que se realicen estas operaciones (Por una vez, VB nos regala unas operaciones. No es VB, es Windows directamente)

Sintaxis NombredelRichTextBox.AutoVerbMenu = True / False

Si esta propiedad está a True muestra el menú. False no lo muestra.

Propiedad BorderStyleSin borde o con borde (None o Fixed Single)

Propiedad EnabledPropiedad Booleana. Activa o desactiva el RichTextBox

FileName Esta propiedad devuelve o establece el nombre del fichero .RTF cargado en el RichTextBox. Si ejecutamos la línea de código :

RTB1.Filename =”C :\CursoVB\Mitexto.rtf” lo que ocurrirá es que nuestra aplicación cargará el fichero C :\CursoVB\Mitexto.rtf en el RichTextBox RTB1. Es decir, hace lo mismo que el Método LoadFile (Vea mas abajo).Sólo puede especificar los nombres de archivos de texto o archivos .RTF válidos para esta propiedad.Le recomendamos que para cargar un texto en un RTB use siempre el método LoadFile en vez de la propiedad Filename.

Si lo que hacemos con esta propiedad es consultar el fichero cargado en el RTB :

Variable = RTB1.Filename

obtendremos en Variable el nombre (y Path) del fichero que tenemos cargado en el RTB

HideSelectionDevuelve o establece un valor que determina si el texto seleccionado aparece resaltado cuando el RichTextBox pierde el enfoque. Esto es justamente lo que ocurre cuando seleccionamos un trozo de texto (Por ejemplo para pasar ese texto a negrita) y hacemos click sobre otro control (Por ejemplo, sobre un botón de comando para cambiar a Negrita) Si tenemos esta propiedad a False el texto seleccionado sigue seleccionado. Si está a True, el texto se deselecciona.

NOTA Le recomiendo que cuando tenga un control para cambiar el tipo de letra, hágalo sobre un control que no acepte el foco (Label, p.e.)

Sintaxis NombreRTB.HideSelection = True / False para establecer la propiedad

Variable = NombreRTB.HideSelection para leerla

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 16

Propiedad LockedIgual que le ocurre al TextBox, si ponemos esta propiedad a True impedimos que se pueda cambiar el texto existente en el RichTextBox mediante el teclado.

MaxLengthEsta propiedad marca el número máximo de caracteres que puede contener. Si se pone a 0 (Predeterminado) admite cualquier número de caracteres.

MousePointerIgual que para el resto de los controles.

MultilineIgual que para el TextBox. Si está a True (predeterminado) el RichTextBox puede contener varias líneas. Si está a False, una solo.

OLEDragModeOLEDropModeEstas dos propiedades son similares a la DragMode de otros controles. Se verán con mas detalle al estudiar el Drag & Drop.

METODOS DEL CONTROL RichTextBox

El control RichTextBox cuenta con unos métodos especiales para abrir un fichero y guardar el texto que contiene un poco especiales. Estos métodos (SaveFile y LoadFile) se pueden usar solamente cuando queremos guardar o leer el texto en formato .RTF. Con ellos no es necesario abrir el fichero (con Open Nombrefichero .....) ni cerrarlo, pero siempre para guardar o leer texto en formato RTF. Podemos leer o guardar el texto de un RichTextBox como texto plano (Como los ficheros ASCII .TXT). Para ello debemos utilizar los métodos Open Nombrefichero For Input / Output vistos en el capítulo de ficheros.

METODO SaveFileGuarda el contenido de un control RichTextBox en un archivo.

SintaxisNombredelRTB.SaveFile(nombre_ruta, tipo_archivo)

Donde nombre_ruta (Parámetro requerido) es una expresión de cadena que define la ruta de acceso y el nombre del archivo que va a recibir el contenido del control, y tipo_archivo es un entero o una constante que especifica el tipo de archivo cargado, como se describe a continuación :

0 rtfRTF El control RichTextBox guarda su contenido como un archivo .RTF.1 rtfText El control RichTextBox guarda su contenido como un archivo de texto.

El valor predeterminado es 0. Si no se pone este parámetro, toma el valor 0 por defecto.

EjemploRTB1.SaveFile “C :\CursoVB\mitexto.rtf”, 0

Guarda el contenido del RichTextBox RTB1 en un fichero llamado mitexto.rtf que está en el directorio CursoVB, con formato RTF

Aparte del método SaveFile, puede utilizar la función Print de Visual Basic y las propiedades TextRTF y SelRTF del control RichTextBox para escribir archivos .RTF. Por ejemplo, puede guardar el contenido de un control RichTextBox en un archivo .RTF de este modo:

Open "mitexto.rtf" For Output As 1

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 17

Print #1, RichTextBox1.TextRTFClose #1

METODO LoadFile

Carga un archivo .RTF o un archivo de texto en un control RichTextBox.

SintaxisNombreRTB.LoadFile nombre_ruta, tipo_archivo

Donde nombre_ruta (Parámetro requerido) es una expresión de cadena que define la ruta de acceso y el nombre del archivo que se va a cargar en el control, y tipo_archivo es un entero o una constante que especifica el tipo de archivo cargado, como se describe a continuación

0 rtfRTF El archivo cargado debe ser un archivo .RTF válido.1 rtfText El control RichTextBox carga cualquier archivo de texto.

Al cargar un archivo con el método LoadFile, el contenido del archivo cargado reemplaza a todo el contenido del control RichTextBox. Esto hace que cambien los valores de las propiedades Text y rtfText.

También puede usar la función Input de Visual Basic y las propiedades TextRTF y SelRTF del control RichTextBox para leer archivos .RTF. Por ejemplo, puede cargar el contenido de un archivo .RTF en el control RichTextBox de este modo:

Open "C :\CursoVB\mitexto.rtf" For Input As 1RichTextBox1.TextRTF = Input$(LOF(1), 1)Close #1

METODO Find

Busca una cadena específica en el texto de un control RichTextBox.

SintaxisVariable = NombreRTB.Find (cadena, inicio, fin, opciones)

Donde :cadena (Necesario) Una expresión de cadena que desea buscar en el control.inicio (Opcional) Un índice de caracteres de tipo Integer que determina dónde comienza

la búsqueda. Cada carácter del control tiene un índice entero que loidentifica de forma única. El primer carácter de texto del control tiene un índice 0.

fin (Opcional) Un índice de carácter de entero que determina dónde termina labúsqueda.

Opciones (Opcional) Una o más valores o constantes utilizadas para especificarcaracterísticas opcionales, como se describe a continuación.

Valor Constante Descripción

1 rtfWholeWord Determina si una coincidencia se basa en una palabra completa o en parte de una palabra.

4 rtfMatchCase Determina si una coincidencia se basa el uso de mayúsculas yminúsculas de la cadena especificada además del texto de la cadena.

8 rtfNoHighlight Determina si una coincidencia aparece resaltada en el control RichTextBox.

Puede combinar múltiples opciones si utiliza el operador Or.

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 18

Si se encuentra el texto buscado, el método Find resalta el texto especificado y devuelve un número con la posición del primer carácter resaltado. Si no se encuentra el texto especificado, el método Find devuelve –1. Si utiliza el método Find sin la opción rtfNoHighlight aunque la propiedad HideSelection sea True y el control RichTextBox no tenga el enfoque, el control seguirá resaltando el texto encontrado. Los usos posteriores del método Find sólo buscarán el texto resaltado hasta que se mueva el punto de inserción.

El comportamiento de búsqueda del método Find varía según la combinación de valores especificados para los argumentos inicio y fin. Esta tabla describe los comportamientos posibles:

Inicio Fin Comportamiento de búsqueda

Especificado Especificado Busca desde la ubicación inicial especificada hasta laubicación final especificada.

Especificado Omitido Busca desde la ubicación inicial especificada hasta el final deltexto del control.

Omitido Especificado Busca desde el punto de inserción actual hasta la ubicaciónfinal especificada.

Omitido Omitido Busca en la selección actual si el texto está seleccionado o entodo el contenido del control si no hay texto seleccionado.

METODO GetLineFromChar

Devuelve el número de la línea que contiene una posición de carácter especificado en un control RichTextBox.

Sintaxis Variable = NombreRTB.GetLineFromChar (pos_carácter)

Donde pos_carácter (Requerido) es un entero largo que especifica la posición del carácter cuya línea desea identificar. El índice del primer carácter del control RichTextBox es 0.

Utilice el método GetLineFromChar para averiguar qué línea del texto de un control RichTextBox contiene una determinada posición de carácter. Es posible que necesite hacerlo porque puede variar el número de caracteres de cada línea, lo que hace muy difícil averiguar qué línea del texto contiene un determinado carácter, identificado por su posición en el texto.

METODO SelPrint

Envía texto con formato de un control RichTextBox a un dispositivo de impresión.

Sintaxis NombreRTB.SelPrint(hdc)

Donde hdc es el contexto de dispositivo del dispositivo que va a utilizar para imprimir el contenido del control.

Si hay texto seleccionado en el control RichTextBox, el método SelPrint sólo enviará el texto seleccionado al dispositivo de destino. Si no hay texto seleccionado, se enviará el contenido completo del control RichTextBox al dispositivo.El método SelPrint no imprime texto desde el control RichTextBox. En su lugar, envía una copia del texto con formato a un dispositivo que pueda imprimirlo. Por ejemplo, puede enviar el texto al objeto Printer utilizando código como éste:

RichTextBox1.SelPrint(Printer.hDC)

Observe que la propiedad hDC del objeto Printer se utiliza para especificar el argumento de contexto de dispositivo del método SelPrint.

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 19

Nota Si utiliza el objeto Printer como destino del texto desde el control RichTextBox, deberá inicializar en primer lugar el contexto de dispositivo del objeto Printer. Esto es necesario, ya que Visual Basic no conoce el hDC del Printer hasta que se imprime algo. La información de Microsoft recomienda imprimir una cadena de longitud cero. (Ejecutar la instrucción Printer.Print “”) Sin embargo esa no es buena solución ya que da un error de impresora. Vale mas forzar la posición del papel, aunque no hiciese faltaPrinter.Orientation = 1

Mediante SelPrint nos podemos ahorrar la tediosa programación del Printer, pero tiene también inconvenientes: No controlamos el cambio de página, si tenemos papel preimpreso es muy difícil ajustarlo, etc.

METODO Span

Selecciona texto en un control RichTextBox basándose en un conjunto de caracteres especificado.

SintaxisNombreRTB.Span juego_caracteres, hacia_adelante, negado

donde :

juego_caracteres (Requerido) Una expresión de cadena que especifica el juego de caracteres que se va a buscar al ampliar la selección, basándose en el valor de negado.

hacia_adelante (Opcional) Una expresión booleana que determina en qué sentido se mueve el punto de inserción, como se describe mas adelante.

Negado (Opcional) Una expresión booleana que determina si los caracteres de juego_caracteres definen el conjunto de caracteres de destino o se excluyen del conjunto de caracteres de destino, como se describe mas adelante.

Los valores para hacia_adelante son:

True (Predeterminado) Selecciona texto desde el punto de inserción actual o desde el principio de la selección actual hacia delante, hacia el final del texto.False Selecciona texto desde el punto de inserción actual o el principio de la selección actual hacia atrás, hacia el principio del texto.

Los valores para negado son:

True Los caracteres incluidos en la selección son los que no aparecen en el argumento juego_caracteres. La selección se detiene en el primer carácter encontrado que aparece en el argumento juego_caracteres.False (Predeterminado) Los caracteres incluidos en la selección son los que aparecen en el argumento juego_caracteres. La selección se detiene en el primer carácter encontrado que no aparece en el argumento juego_caracteres.

El método Span se utiliza principalmente para seleccionar fácilmente una palabra o una frase en el control RichTextBox.Si el método Span no encuentra los caracteres especificados basándose en los valores de los argumentos, el punto de inserción o la selección actual permanece sin cambios.El método Span no devuelve datos.

METODO Upto

Mueve el punto de inserción hasta el primer carácter (sin incluirlo) que sea miembro del conjunto de caracteres especificado en un control RichTextBox.

SintaxisNombredelRTB.Upto (juego_caracteres, hacia_adelante, negado)

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 20

Donde :

juego_caracteres (Requerido) Una expresión de cadena que especifica el conjunto de caracteres que se va a buscar al mover el punto de inserción, basándose en el valor de negado.hacia_adelante (Opcional) Una expresión booleana que determina en qué sentido se mueve el punto de inserción, como se describe en Valores.

negado (Opcional) Una expresión booleana que determina si los caracteres de juego_caracteres definen el conjunto de caracteres de destino o se excluyen del conjunto de caracteres de destino, como se describe en Valores.

Valores

Los valores de hacia_adelante son:

True (Predeterminado) Mueve el punto de inserción hacia delante, hacia el final del texto.False Mueve el punto de inserción hacia atrás, hacia el principio del texto.

Los valores para negado son:

True Los caracteres no especificados en el argumento juego_caracteres se utilizan para mover el punto de inserción.False (Predeterminado) Los caracteres especificados en el argumento juego_caracteres se utilizan para mover el punto de inserción.

El Portapapeles y el RichTextBox

Imagínese que seleccionamos un texto en un RichTextBox y ese texto lo metemos al portapapeles. Dado que el texto está escrito en RTF, ¿Como nos lo guarda el Portapapeles ? 

La solución es que puede guardarlo en las dos versiones. En formato de texto plano (Guarda estrictamente los caracteres ASCII del texto seleccionado) o como texto enriquecido (RTF), guardando en este caso, además del texto limpio y puro, la información del tipo de letra, tamaño, color, etc. típicas del formato RTF.

Para ello debemos indicarle al portapapeles en qué formato queremos guardarlo. La línea de código :

Clipboard.SetText RTB1.SelRTF, vbCFRTF

guarda en el portapapeles el texto seleccionado en ese momento, en formato RTF. La línea

Clipboard.SetText RTB1.TextRTF, vbCFRTF

guarda en el portapapeles todo el contenido del RichTextBox (llamado RTB1 en los ejemplos) en formato RTF

Las líneas :

Clipboard.SetText RTB1.SelRTF, vbCFTextClipboard.SetText RTB1.TextRTF, vbCFText

guardarán, respectivamente, el texto seleccionado y todo el texto de RTB1, en formato de texto plano

Pero esta no es la única forma de introducir texto procedente del RichTextBox en el portapapeles. Podemos introducir el texto seleccionado con formato RTF de la forma :

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 21

ClipBoard.SetText RTB1.SelRTF

Y el texto plano con Clipboard.SetText RTB1.SelText

Para introducir TODO el texto del RTB en formato RTF

Clipboard.SetText RTB1.TextRTF

Para meter TODO el texto del RTB en texto plano

Clipboard.SetText RTB1.Text

APENDICE

Constantes del control RichTextBox

Constante Valor Descripción

Propiedad AppearancertfFlat 0 Uniforme. Pinta sin efectos visuales.rtfThreeD 1 (Predeterminado). 3D. Pinta con efectos tridimensionales.

Método FindrtfWholeWord 2 Determina si una coincidencia se basa en una palabra completa o en

parte de una palabra.rtfMatchCase 4 Determina si una coincidencia se basa en el uso de mayúsculas y

minúsculas de la cadena especificada además del texto de la cadena.rtfNoHighlight 8 Determina si una coincidencia aparece resaltada en el control

RichTextBox.

Métodos LoadFile y SaveFilertfRTF 0 (Predeterminado) RTF. El archivo cargado debe ser un archivo .RTF

válido (método LoadFile) o el contenido del control se guarda en un archivo .RTF (método SaveFile).

rtfText 1 Texto. El control RichTextBox carga cualquier archivo de texto (método LoadFile) o el contenido del control se guarda en un archivo de texto (método SaveFile).

Propiedad MousePointerrtfDefault 0 (Predeterminado) La forma está determinada por el objeto.rtfArrow1 Flecha.rtfCross 2 Cruz (cursor en forma de cruz).rtfIbeam 3 Cursor en forma de I.rtfIcon 4 Icono (cuadrado pequeño dentro de un cuadrado).rtfSize 5 Tamaño (flecha de cuatro puntas que señala al norte, sur, este y oeste)rtfSizeNESW 6 Tamaño NE-SO (flecha de dos puntas que señala al nordeste y al

sudoeste).rtfSizeNS 7 Tamaño N S (flecha de dos puntas que señala al norte y al sur).rtfSizeNWSE 8 Tamaño NO, SE.rtfSizeEW 9 Tamaño EO (flecha de dos puntas que señala al este y al oeste).rtfUpArrow 10 Flecha hacia arriba.rtfHourglass 11 Reloj de arena (espere).rtfNoDrop 12 No colocar.rtfArrowHourglass 13 Flecha y reloj de arena.rtfArrowQuestion 14 Flecha y signo de interrogación.rtfSizeAll 15 Ajustar todo. rtfCustom 99 Icono personalizado especificado por la propiedad MouseIcon.

Propiedad Selalignment

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 22

rtfLeft 0 (Predeterminado) Izquierda. El párrafo se alinea a lo largo del margen izquierdo.

rtfRight 1 Derecha. El párrafo se alinea a lo largo del margen derecho.rtfCenter 2 Centro. El párrafo se centra entre los márgenes izquierdo y derecho.

Propiedad ScrollbarsrtfNone 0 (Predeterminado) Ninguna.rtfHorizontal 1 Sólo barra de desplazamiento horizontal.rtfVertical 2 Sólo barra de desplazamiento vertical.rtfBoth 3 Barras de desplazamiento horizontal y vertical.

El FORMATO RTF

Cuando se edita un texto mediante un procesador de textos, el fichero resultante se guarda don un formato distinto para cada procesador. De esta forma, un texto editado en WP no es compatible con el P.T. AmiPro, con Word o con cualquier otro. Los fabricantes de estos procesadores de textos han tenido que incluir una herramienta capaz de convertir un formato a otro para poder alcanzar la compatibilidad entre ellos que el mercado exigía.

El Formato de Texto Enriquecido pretende ser un nexo de unión entre todos los procesadores de texto, para poder intercambiar ficheros editados en uno u otro. De hecho, las últimas versiones de los mas importantes procesadores de textos incluyen la posibilidad de guardar y buscar el texto en este formato. (WP, Word)

Este formato consiste en guardar mediante caracteres ASCII plenamente legibles tanto el texto escrito como los tipos de letra, tamaño, saltos de carro, etc. Veamos un ejemplo comparativo del mismo texto escrito en Word, guardado en RTF y en ASCII :

Texto1

Este texto está escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el tamaño de las letras a tamaño mas grande, mas pequeño, etc.

Fin Texto 1

El mismo texto en ASCII puro :

Texto1

Este texto est  escrito en Word. Observe que podemos poner letra negrita, letra cursiva, letra subrayada. Podemos cambiar el color de las letras, rojo, verde, azul. Podemos cambiar el tamaño de las letras a tamaño mas grande, mas pequeño, etc.

Fin Texto 1

Y ahora el mismo texto en formato RTF. En este formato hubo que seccionar las líneas para poder mostrarlas en una hoja, ya que RTF utiliza líneas sin retornos de carro. Se han seccionado las líneas terminándolas con un guión bajo y comenzando en la línea siguiente también con un guión bajo.

{\rtf1\ansi \deff5\deflang1033{\fonttbl{\f5\fswiss\fcharset0\fprq2 Arial;}}__{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;__\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\__green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\_

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 23

blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue__192;}{\stylesheet{\widctlpar \f5\fs20\lang1034 \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}__}{\info{\author LUIS SUAREZ BERNALDO}{\operator LUIS SUAREZ BERNALDO}__{\creatim\yr1997\mo3\dy9\hr11\min8}{\revtim\yr1997\mo3\dy9\hr11\min9}__{\version1}{\edmins1}{\nofpages1}{\nofwords38}{\nofchars220}{\*\company }{\vern57431}}\margl1701\margr1701\__margt1417\margb1417 \deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\formshade__ \fet0\sectd \linex0\headery709\footery709\colsx709\endnhere {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstar__t1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\__pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcl__tr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\__pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pn__start1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{__\pntxtb (}{\pntxta )}}\pard\plain \qj\widctlpar \f5\fs20\lang1034 Texto1\par \par Este texto est\'e1 escrito en Word. Observe que podemos poner letra __{\b negrita}, letra {\i cursiva}, letra {\ul subrayada}. Podemos cambiar__ el color de las letras, {\cf6 rojo}, {\cf4 verde}, {\cf2 azul}. Podemos __cambiar el tama\'f1o de las letras a {\fs24 tama\'f1o mas grande}, {\fs16 mas peque\'f1o}, etc.\par \par \par Fin Texto 1\par \pard \widctlpar \par }

Como puede observar, el RTF incluye el texto escrito casi en ASCII, pero añadiendo una serie de datos respecto al tipo de letra, codifica los acentos, las eñes, y hasta incluye, tomándolo del ordenador, el nombre del operador que lo ha escrito. Estas informaciones también se guardan cuando se archiva un texto en el formato propio del procesador de textos, pero lo hace en binario, por lo que no lo podemos visualizar. El formato RTF, dentro de que mete toda esa información adicional, lo archiva con caracteres ASCII.

MUY IMPORTANTE

Observe que el fichero .RTF comienza por {\rtf Cuando tenga que importar un texto hacia un RichTextBox, puede que ese texto esté en formato RTF o como Texto Plano (Fichero ASCII puro) Para saber si el texto está en RTF analice los Cinco primeros caracteres del texto a importar. Si son {\rtf es que está en presencia de un texto RTF.

Para saber si un fichero contiene texto enriquecido, basta con abrirlo como un fichero secuencial, (recuerde que un fichero .RTF tiene solamente caracteres ASCII) y leer los cinco primeros caracteres.

Ejercicio Propuesto. Conlos conocimientos de los Documentos de Interfaces Multiples, y los del RichTextBox que ha adquirido en este capítulo, y los conocimientos del menú y los ficheros que ya tiene de los capítulos anteriores, ya está en condiciones de realizar un editor de textos, casi tan bueno como el Word. Debe ponerle las funciones típicas de cortar, copiar y pegar, documento nuevo, cerrar, guardar, guardar como, y cada vez que cierra un documento debe saber si ha habido cambios para proponer que se guarden.

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 24

LSB Visual Basic - Guía del estudiante Capítulo 9 Página 25