Compartir a través de


Intervalos

Delimitadores

Un intervalo está delimitado por dos delimitadores, un delimitador inicial y un delimitador final. Un delimitador existe en una ranura imaginaria entre dos caracteres. El delimitador inicial se relaciona con el texto que sigue al delimitador y el delimitador final se relaciona con el texto que precede al delimitador. Los delimitadores inicial y final pueden existir en la misma ubicación. En este caso, el intervalo tiene una longitud cero.

Por ejemplo, comience con el texto siguiente:

This is text.

Ahora, aplique un intervalo a este texto con los delimitadores inicial y final en la posición 0. Se representa visualmente como:

<anchor></anchor>This is text.

Los delimitadores no ocupan ningún espacio dentro del propio texto. Se trata de un intervalo de longitud cero y su texto está vacío.

Ahora, cambie las posiciones del delimitador final +3. Se representa visualmente como:

<anchor>Thi</anchor>s is text.

El delimitador inicial se coloca justo antes del carácter en la posición 0 y el delimitador final se coloca justo después del carácter en la posición 3 porque el delimitador final se mueve a la derecha 3 posiciones. El intervalo de texto es ahora "Thi".

Además, no se puede realizar el anclaje inicial para seguir el delimitador final y no se puede realizar el delimitador final para preceder al anclaje inicial.

Gravedad de anclaje

Cada delimitador tiene un valor de gravedad que determina cómo responde el delimitador cuando se inserta texto en la secuencia de texto en la posición del delimitador. Cuando se realiza una inserción en la posición de un delimitador, se debe realizar un ajuste en la posición del delimitador. La gravedad determina cómo se realiza este ajuste de posición de anclaje.

Por ejemplo:

It is <anchor></anchor>cold today.

Si la palabra "muy" se inserta en la posición del intervalo, el delimitador inicial se puede colocar antes o después de la palabra insertada:

It is <anchor>very </anchor>cold today.

O bien

It is very <anchor></anchor>cold today.

La gravedad de anclaje especifica cómo se cambia la posición del delimitador cuando se realiza una inserción en su posición. La gravedad puede ser hacia atrás o hacia delante.

Si el delimitador tiene gravedad hacia atrás, el delimitador se mueve hacia atrás, en relación con el punto de inserción, para que el texto insertado siga el delimitador:

It is <anchor>very </anchor>cold today.

Si el delimitador tiene gravedad hacia delante, el delimitador avanza (relativo al punto de inserción) en la inserción para que el texto insertado preceda al delimitador:

It is very <anchor></anchor>cold today.

Clones y copias de seguridad

Hay dos maneras de realizar una "copia" de un objeto de intervalo. El primero es crear un clon del intervalo mediante ITfRange::Clone. El segundo es realizar una copia de seguridad del intervalo mediante ITfContext::CreateRangeBackup.

Un clon es una copia de un intervalo que no incluye datos estáticos. Los delimitadores del intervalo se copian, pero el clon sigue abarcando un intervalo de texto dentro del contexto. Un clon es un objeto range en todos los aspectos. Esto significa que el texto y las propiedades de un intervalo clonado son dinámicos y cambiarán si el texto o las propiedades del intervalo cubiertos por el clon cambian.

Una copia de seguridad almacena el texto y las propiedades de un intervalo en el momento en que la copia de seguridad se realiza como datos estáticos. Una copia de seguridad también clona el intervalo original para que se pueda realizar un seguimiento de los cambios en el tamaño y la posición del intervalo original. Esto significa que el texto y las propiedades de un intervalo de copia de seguridad son estáticos y no cambian si el texto o las propiedades del intervalo cubiertos por la copia de seguridad cambian.

Por ejemplo, el siguiente intervalo (pRange) dentro del contexto:

"This is some <pRange>text</pRange>."

Ahora cree un clon y una copia de seguridad de este intervalo:

ITfRange *pClone;
ITfRangeBackup *pBackup;

pRange->Clone(&pClone);
pContext->CreateRangeBackup(ec, pRange, &pBackup);

Ahora, los objetos contienen lo siguiente:

pRange  = "text"
pClone  = "text"
pBackup = "text"

Ahora cambie el texto de pRange:

WCHAR wsz[] = L"other words";
pRange->SetText(ec, 0, wsz, lstrlenW(wsz));

Ahora, los objetos contienen lo siguiente:

Context = "This is some other words."
pRange  = "other words"
pClone  = "other words"
pBackup = "text"

Establecer el texto hizo que el texto dentro del contexto cambiara. También provocó que el delimitador final de pRange y pClone cambiaran. pClone ahora contiene "otras palabras" porque el texto cambiado dentro del intervalo y todos los intervalos realizan un seguimiento de estos cambios. Cuando el texto cubierto por pRange y pClone cambió, también cambió el texto de pClone.

El texto de pBackup no ha cambiado del pRange original porque los datos (texto y propiedades) de la copia de seguridad no están relacionados con el contexto y se almacenan por separado. El clon contenido en la copia de seguridad realmente cambia, pero los datos son estáticos.

Al restaurar una copia de seguridad, la copia de seguridad se puede aplicar al clon dentro de la copia de seguridad o a un intervalo diferente por completo. Para aplicar la copia de seguridad al clon dentro de la copia de seguridad, pase NULL a ITfRangeBackup::Restore , como se muestra en el ejemplo de código siguiente:

pBackup->Restore(ec, NULL);

Ahora, los objetos contienen lo siguiente:

Context = "This is some text."
pRange  = "text"
pClone  = "text"
pBackup = "text"

Para restaurar la copia de seguridad en un intervalo diferente, pase un puntero al objeto range al llamar a ITfRangeBackup::Restore. El texto de copia de seguridad y las propiedades se aplicarán al nuevo intervalo. Por ejemplo, con el ejemplo anterior a la llamada a Restore , pRange se modificará para demostrarlo:

LONG lShifted;
pRange->ShiftEnd(ec, -2, &lShifted, NULL);

Ahora, los objetos contienen lo siguiente:

Context = "This is some other words."
pRange  = "other wor"
pClone  = "other words"
pBackup = "text"

Cuando el delimitador final de pRange se desplazaba a la izquierda dos lugares, el delimitador final de pClone no cambió.

Ahora restaure la copia de seguridad mediante pRange con el ejemplo de código siguiente:

pBackup->Restore(ec, pRange);

Ahora, los objetos contienen lo siguiente:

Context = "This is some textds."
pRange  = "text"
pClone  = "textds"
pBackup = "text"

El texto cubierto por pRange se ha reemplazado por "text", una parte del texto cubierto por pClone ha cambiado y pBackup cambia para que coincida con pRange.