Sdílet prostřednictvím


Rozsahy

Kotvy

Oblast je oddělena dvěma kotvami, počátečním ukotvením a koncovým ukotvením. Kotva existuje v imaginárním slotu mezi dvěma znaky. Počáteční ukotvení se vztahuje k textu, který následuje za ukotvení, a koncové ukotvení souvisí s textem, který předchází ukotvení. Počáteční i koncové kotvy mohou existovat ve stejném umístění. V tomto případě má rozsah nulovou délku.

Začněte například následujícím textem:

This is text.

Teď u tohoto textu použijte oblast s počátečním i koncovým ukotvením na pozici 0. Je vizuálně reprezentován jako:

<anchor></anchor>This is text.

Ukotvení nezabírají žádné místo v samotném textu. Jedná se o rozsah nulové délky a jeho text je prázdný.

Nyní posunujte koncovou kotvu +3 pozice. Je vizuálně reprezentován jako:

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

Počáteční ukotvení je umístěné těsně před znakem v pozici 0 a koncové ukotvení se umístí těsně za znakem v pozici 3, protože koncová kotva se přesunula na pravé 3 místa. Oblast textu je teď "Thi".

Kromě toho počáteční ukotvení nelze provést tak, aby sledovala koncové ukotvení a koncová kotva nemůže předcházet počáteční ukotvení.

Ukotvení závažnosti

Každá kotva má závažnost nastavení, které určuje, jak kotva reaguje při vložení textu do textového streamu na pozici ukotvení. Při vložení na pozici kotvy musí být upravena na pozici ukotvení. Závažnost určuje, jak se tato úprava pozice ukotvení provádí.

Například:

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

Pokud je slovo "velmi" vloženo na pozici rozsahu, lze počáteční ukotvení umístit buď před nebo za vložené slovo:

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

-Nebo-

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

Závažnost kotvy určuje, jak se kotva přeloží, když je vložena na pozici. Závažnost může být buď dozadu, nebo vpřed.

Pokud má kotva zpětnou závažnost, ukotvení se posune dozadu vzhledem k bodu vložení, takže vložený text následuje za ukotvení:

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

Pokud má kotva závažnost dopředu, ukotvení se při vložení posune dopředu (vzhledem k bodu vložení), aby vložený text předchází ukotvení:

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

Klony a zálohy

Existují dva způsoby, jak vytvořit "kopii" objektu rozsahu. Prvním je vytvořit klonovat rozsahu pomocí ITfRange::Clone. Druhým je vytvoření zálohování rozsahu pomocí ITfContext::CreateRangeBackup.

Klon je kopie oblasti, která neobsahuje statická data. Kotvy oblasti se zkopírují, ale klon stále pokrývá oblast textu v kontextu. Klon je objekt oblasti ve všech ohledech. To znamená, že text a vlastnosti klonované oblasti jsou dynamické a změní se, pokud se text nebo vlastnosti oblasti, na kterou se vztahuje klon, změní.

Záloha ukládá text a vlastnosti rozsahu v době, kdy se záloha provádí jako statická data. Záloha také naklonuje původní rozsah, aby bylo možné sledovat změny velikosti a umístění původního rozsahu. To znamená, že text a vlastnosti zálohovaného rozsahu jsou statické a nemění se, pokud se text nebo vlastnosti rozsahu, na který se vztahuje záloha, změní.

Například následující rozsah (pRange) v kontextu:

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

Teď vytvořte klon a zálohu tohoto rozsahu:

ITfRange *pClone;
ITfRangeBackup *pBackup;

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

Objekty teď obsahují následující:

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

Teď změňte text pRange:

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

Objekty teď obsahují následující:

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

Nastavení textu způsobilo změnu textu v kontextu. Způsobila také změnu koncového ukotvení pRange a pClone. PClone teď obsahuje slova "jinými slovy", protože text se změnil v rozsahu a tyto změny jsou sledovány všemi oblastmi. Když se změní text, na který se vztahuje pRange i pClone, změní se i text pClone.

Text v pBackup se nezměnil z původní pRange, protože data (text a vlastnosti) v zálohování nesouvisí s kontextem a jsou uložena samostatně. Klon obsažený v rámci zálohy se ve skutečnosti změní, ale data jsou statická.

Při obnovování zálohy je možné zálohu použít na klon v rámci zálohy nebo na jiný rozsah. Pokud chcete použít zálohu na klon v rámci zálohy, předejte NULLITfRangeBackup::Restore, jak je znázorněno v následujícím příkladu kódu:

pBackup->Restore(ec, NULL);

Objekty teď obsahují následující:

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

Chcete-li obnovit zálohu do jiné oblasti, předejte ukazatel na objekt rozsahu při volání ITfRangeBackup::Restore. Zálohovaný text a vlastnosti se použijí na novou oblast. Například použití výše uvedeného příkladu před voláním Restore bude pRange upraveno tak, aby ukázalo toto:

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

Objekty teď obsahují následující:

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

Když se koncové ukotvení pRange přesunulo na levá dvě místa, koncové ukotvení pClone se nezměnilo.

Teď obnovte zálohu pomocí příkazu pRange s následujícím příkladem kódu:

pBackup->Restore(ec, pRange);

Objekty teď obsahují následující:

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

Text, na který se vztahuje pRange, byl nahrazen textem "text", část textu pokrytého pClone se změnila a pBackup se změní tak, aby odpovídala pRange.