Professional Documents
Culture Documents
9
INTERFACE DE DOCUMENTOS MULTIPLES. (Multiple Document Interface MDI )
EL CONTROL RICH TEXT BOX
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.
Aparte de las propiedades de un formulario normal, un formulario MDI tiene las siguiente
propiedades :
Load NombreFormularioHijo
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
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.
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.
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.
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 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 :
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)
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.
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
donde
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.
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
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)
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 :
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.
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.
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.
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.
Estas propiedades son de lectura y escritura, de forma que pueden tener estas dos sintaxis:
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.
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.
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
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.
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.
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.
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)
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.
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)
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.
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
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
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
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.
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
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
Propiedad SelTabCount
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
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
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.
Propiedad DisableNoScroll
Devuelve o establece un valor que determina si están desactivadas las barras de
desplazamiento en el control RichTextBox.
Propiedad Appearance
Plano o tridimensional, como en el resto de los controles.
Propiedad AutoVerbMenu
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 :
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.)
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.
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.
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.
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 :
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:
METODO LoadFile
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:
METODO Find
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.
METODO GetLineFromChar
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
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
donde :
hacia_adelante (Opcional) Una expresión booleana que determina en qué sentido se mueve
el punto de inserción, como se describe mas adelante.
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.
Donde :
Valores
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.
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 :
guarda en el portapapeles todo el contenido del RichTextBox (llamado RTB1 en los ejemplos)
en formato RTF
Las líneas :
ClipBoard.SetText RTB1.SelRTF
Clipboard.SetText RTB1.TextRTF
Clipboard.SetText RTB1.Text
APENDICE
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.
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
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
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.
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.