Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Âncoras
Um intervalo é delimitado por duas âncoras , uma âncora inicial e uma âncora final. Existe uma âncora num espaço imaginário entre duas personagens. A âncora inicial refere-se ao texto que segue a âncora e a âncora final refere-se ao texto que precede a âncora. As âncoras inicial e final podem existir no mesmo local. Neste caso, o intervalo tem comprimento zero.
Por exemplo, comece com o seguinte texto:
This is text.
Agora, aplique um intervalo a este texto com as âncoras inicial e final na posição 0. É representado visualmente como:
<anchor></anchor>This is text.
As âncoras não ocupam espaço dentro do próprio texto. Este é um intervalo de comprimento zero e seu texto está vazio.
Agora mude a âncora final +3 posições. É representado visualmente como:
<anchor>Thi</anchor>s is text.
A âncora inicial é posicionada imediatamente antes do caractere na posição 0 e a âncora final é posicionada logo após o caractere na posição 3 porque a âncora final se moveu para os 3 lugares certos. O intervalo de texto é agora "Thi".
Além disso, a âncora inicial não pode ser feita para seguir a âncora final e a âncora final não pode ser feita para preceder a âncora inicial.
Gravidade da âncora
Cada âncora tem uma configuração de de gravidade que determina como a âncora responde quando o texto é inserido no fluxo de texto na posição da âncora. Quando é feita uma inserção na posição de uma âncora, deve ser feito um ajuste na posição da âncora. A gravidade determina como é feito este ajuste da posição da âncora.
Por exemplo:
It is <anchor></anchor>cold today.
Se a palavra "muito" for inserida na posição do intervalo, a âncora inicial pode ser posicionada antes ou depois da palavra inserida:
It is <anchor>very </anchor>cold today.
- Ou -
It is very <anchor></anchor>cold today.
A gravidade da âncora especifica como a âncora é reposicionada quando uma inserção é feita em sua posição. A gravidade pode ser para trás ou para a frente.
Se a âncora tiver gravidade para trás, a âncora se move para trás, em relação ao ponto de inserção, na inserção de modo que o texto inserido siga a âncora:
It is <anchor>very </anchor>cold today.
Se a âncora tiver gravidade para a frente, a âncora avança (em relação ao ponto de inserção) na inserção de modo que o texto inserido precede a âncora:
It is very <anchor></anchor>cold today.
Clones e backups
Há duas maneiras de fazer uma "cópia" de um objeto de intervalo. A primeira é fazer um clone do intervalo usando ITfRange::Clone. O segundo é fazer um backup do intervalo usando ITfContext::CreateRangeBackup.
Um clone é uma cópia de um intervalo que não inclui dados estáticos. As âncoras do intervalo são copiadas, mas o clone ainda cobre um intervalo de texto dentro do contexto. Um clone é um objeto de intervalo em todos os aspetos. Isso significa que o texto e as propriedades de um intervalo clonado são dinâmicos e serão alterados se o texto e/ou as propriedades do intervalo coberto pelo clone forem alterados.
Um backup armazena o texto e as propriedades de um intervalo no momento em que o backup é feito como dados estáticos. Um backup também clona o intervalo original para que as alterações no tamanho e na posição do intervalo original possam ser rastreadas. Isso significa que o texto e as propriedades de um intervalo de backup são estáticos e não são alterados se o texto e/ou as propriedades do intervalo coberto pelo backup forem alterados.
Por exemplo, o seguinte intervalo (pRange) dentro do contexto:
"This is some <pRange>text</pRange>."
Agora faça um clone e um backup deste intervalo:
ITfRange *pClone;
ITfRangeBackup *pBackup;
pRange->Clone(&pClone);
pContext->CreateRangeBackup(ec, pRange, &pBackup);
Agora, os objetos contêm o seguinte:
pRange = "text"
pClone = "text"
pBackup = "text"
Agora altere o texto do pRange:
WCHAR wsz[] = L"other words";
pRange->SetText(ec, 0, wsz, lstrlenW(wsz));
Agora, os objetos contêm o seguinte:
Context = "This is some other words."
pRange = "other words"
pClone = "other words"
pBackup = "text"
A definição do texto fez com que o texto dentro do contexto fosse alterado. Isso também fez com que a âncora final do pRange e do pClone mudasse. O pClone agora contém "outras palavras" porque o texto foi alterado dentro do intervalo e essas alterações são controladas por todos os intervalos. Quando o texto coberto por pRange e pClone mudou, o texto de pClone também mudou.
O texto no pBackup não foi alterado do pRange original porque os dados (texto e propriedades) no backup não estão relacionados ao contexto e são armazenados separadamente. O clone contido no backup realmente muda, mas os dados são estáticos.
Ao restaurar um backup, o backup pode ser aplicado ao clone dentro do backup ou a um intervalo totalmente diferente. Para aplicar o backup ao clone dentro do backup, passe NULL para ITfRangeBackup::Restore conforme mostrado no exemplo de código a seguir:
pBackup->Restore(ec, NULL);
Agora, os objetos contêm o seguinte:
Context = "This is some text."
pRange = "text"
pClone = "text"
pBackup = "text"
Para restaurar o backup para um intervalo diferente, passe um ponteiro para o objeto range ao chamar ITfRangeBackup::Restore. O texto e as propriedades do backup serão aplicados ao novo intervalo. Por exemplo, usando o exemplo acima antes da chamada Restore, o pRange será modificado para demonstrar isso:
LONG lShifted;
pRange->ShiftEnd(ec, -2, &lShifted, NULL);
Agora, os objetos contêm o seguinte:
Context = "This is some other words."
pRange = "other wor"
pClone = "other words"
pBackup = "text"
Quando a âncora final do pRange foi deslocada para os dois lugares à esquerda, a âncora final do pClone não mudou.
Agora restaure o backup usando pRange com o seguinte exemplo de código:
pBackup->Restore(ec, pRange);
Agora, os objetos contêm o seguinte:
Context = "This is some textds."
pRange = "text"
pClone = "textds"
pBackup = "text"
O texto coberto pelo pRange foi substituído por "text", uma parte do texto coberto pelo pClone foi alterada e o pBackup foi alterado para corresponder ao pRange.