Está en la página 1de 24

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

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

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


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).
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.

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


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 Integer


Dim MiVentana As New FormularioHijo
MiVentana.Caption = “Documento “ & Str (contador)
MiVentana.Show

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


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.

Sintaxis NFMDI.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 minimizados


en cascada.
vbTileHorizontal 1 Dispone todos los formularios MDI secundarios no minimizados
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.

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


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\fs
20 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 caracteres


seleccionados 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 texto


seleccionado.

SelTextDevuelve o establece la cadena de caracteres seleccionados. Si no hay ningún


cará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 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

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


RTB.Font.Name = CD1.FontName
RTB.Font.Size = CD1.FontSize
RTB.Font.Bold = False
RTB.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 rojo
RTB.SelColor = RGB (255,0,0)
RTB.SelColor = 255
RTB.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.

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

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

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


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.
SelRTF
Devuelve 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.

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.

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


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 = 1
RTB.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
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.

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


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 francesa
en 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 izquierda


RTB.SelAlignment = 1 ‘alinea a la derecha
RTB.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.
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

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


RTB.SelBullet = True
RTB.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
‘Con la siguiente línea se evita el error producido en aquellos controles que no tienen la
‘propiedad TabStop
On Error Resume Next
For I = 0 To Me.Controls.Count - 1
Controls(I).TabStop = False
Next I
End Sub

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


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

Private Sub RTB_GotFocus()


Dim Pepe As Control
On Error Resume Next 'De esta forma se evita el error producido en aquellos controles que
no tienen la propiedad TabStop
For Each Pepe In Controls
Pepe.TabStop = False
Next
End 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 = False
Next Control
Milagros 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) = 1000
RTB.SelTabs(1) = 2000
RTB.SelTabs(2) = 3000
RTB.SelTabs(3) = 4000 Con estas líneas determinaríamos la posición de tabulación de
RTB.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.

OTRAS PROPIEDADES

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

RTB.SelCharOffset = Número

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


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.SelFontSize
RTB.SelFontSize = TamIni - 4
RTB.SelCharOffset = 40
RTB.SetFocus

Para restaurar los valores anteriores

RTB.SelFontSize = TamIni
RTB.SelCharOffset = 0
RTB.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 = False
Propiedad 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 DisableNoScroll
Devuelve o establece un valor que determina si están desactivadas las barras de
desplazamiento en el control RichTextBox.

Sintaxis NombredelRichTextBox.DisableNoScroll = True / False

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


desplazamiento aparecen atenuadas.

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

Propiedad AutoVerbMenu

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


Propiedad 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 BorderStyle
Sin borde o con borde (None o Fixed Single)

Propiedad Enabled
Propiedad 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

HideSelection
Devuelve 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

Propiedad Locked
Igual 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.

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

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


MousePointer
Igual que para el resto de los controles.

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

OLEDragMode
OLEDropMode
Estas 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 SaveFile
Guarda el contenido de un control RichTextBox en un archivo.

Sintaxis NombredelRTB.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.

Ejemplo
RTB1.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


Print #1, RichTextBox1.TextRTF
Close #1

METODO LoadFile

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

Sintaxis NombreRTB.LoadFile nombre_ruta, tipo_archivo

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


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 1


RichTextBox1.TextRTF = Input$(LOF(1), 1)
Close #1

METODO Find

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

Sintaxis Variable = 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 lo
identifica 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 la
búsqueda.
Opciones (Opcional) Una o más valores o constantes utilizadas para especificar
caracterí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 y
minú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.

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:

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


Inicio Fin Comportamiento de búsqueda

Especificado Especificado Busca desde la ubicación inicial especificada hasta la


ubicación final especificada.
Especificado Omitido Busca desde la ubicación inicial especificada hasta el final del
texto del control.
Omitido Especificado Busca desde el punto de inserción actual hasta la ubicación
final especificada.
Omitido Omitido Busca en la selección actual si el texto está seleccionado o en
todo 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.

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 falta
Printer.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

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


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

Sintaxis NombreRTB.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.

Sintaxis NombredelRTB.Upto (juego_caracteres, hacia_adelante, negado)

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

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


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, vbCFText


Clipboard.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 :

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

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


Constantes del control RichTextBox

Constante Valor Descripción

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

Método Find
rtfWholeWord 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 SaveFile


rtfRTF 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 MousePointer
rtfDefault 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
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 Scrollbars
rtfNone 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

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


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\_
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

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


{\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