Delen via


Bereiken

Ankers

Een bereik wordt gescheiden door twee ankers, een beginanker en een eindanker. Er bestaat een anker in een imaginaire sleuf tussen twee tekens. Het beginanker heeft betrekking op tekst die volgt op het anker en het eindanker heeft betrekking op tekst die voorafgaat aan het anker. Zowel de begin- als eindankers kunnen zich op dezelfde locatie bevinden. In dit geval heeft het bereik een lengte van nul.

Begin bijvoorbeeld met de volgende tekst:

This is text.

Pas nu een bereik toe op deze tekst met de begin- en eindankers op positie 0. Deze wordt visueel weergegeven als:

<anchor></anchor>This is text.

De ankers nemen geen ruimte in de tekst zelf in beslag. Dit is een bereik met lengte nul en de tekst is leeg.

Verplaats nu het eindanker +3 posities. Deze wordt visueel weergegeven als:

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

Het beginanker bevindt zich vlak voor het teken op positie 0 en het eindanker bevindt zich vlak na het teken op positie 3, omdat het eindanker naar de juiste 3 plaatsen is verplaatst. Het tekstbereik is nu 'Thi'.

Daarnaast kan het beginanker niet worden gemaakt om het eindanker te volgen en kan het eindanker niet voorafgaan aan het beginanker.

Anker gravity

Elk anker heeft een zwaartekrachtinstelling die bepaalt hoe het anker reageert wanneer tekst wordt ingevoegd in de tekststroom op de ankerpositie. Wanneer een invoeging wordt aangebracht op de positie van een anker, moet er een aanpassing worden aangebracht in de positie van het anker. De zwaartekracht bepaalt hoe deze ankerpositie wordt aangepast.

Bijvoorbeeld:

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

Als het woord 'zeer' wordt ingevoegd op de bereikpositie, kan het beginanker vóór of na het ingevoegde woord worden geplaatst:

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

-Of-

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

De zwaartekracht van het anker geeft aan hoe het anker wordt verplaatst wanneer een invoeging op zijn positie wordt gemaakt. De zwaartekracht kan ofwel achteruit of vooruitzijn.

Als het anker de achterwaartse zwaartekracht heeft, beweegt het anker achteruit ten opzichte van de invoegpositie, zodat de ingevoegde tekst het anker volgt:

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

Als het anker de zwaartekracht heeft, beweegt het anker zich vooruit (ten opzichte van de invoegpositie) bij invoeging, zodat de ingevoegde tekst voorafgaat aan het anker:

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

Klonen en back-ups

Er zijn twee manieren om een 'kopie' van een bereikobject te maken. De eerste is het maken van een kloon van het bereik met behulp van ITfRange::Clone. De tweede is het maken van een back-up van het bereik met behulp van ITfContext::CreateRangeBackup.

Een kloon is een kopie van een bereik dat geen statische gegevens bevat. De ankers van het bereik worden gekopieerd, maar de kloon dekt nog steeds een tekstbereik binnen de context. Een kloon is een bereikobject in alle opzichten. Dit betekent dat de tekst en eigenschappen voor een gekloond bereik dynamisch zijn en worden gewijzigd als de tekst en/of eigenschappen van het bereik waarop de kloon betrekking heeft, worden gewijzigd.

Met een back-up worden de tekst en eigenschappen van een bereik opgeslagen op het moment dat de back-up wordt gemaakt als statische gegevens. Een back-up kloont ook het oorspronkelijke bereik, zodat wijzigingen in de grootte en positie van het oorspronkelijke bereik kunnen worden bijgehouden. Dit betekent dat de tekst en eigenschappen voor een back-upbereik statisch zijn en niet veranderen als de tekst en/of eigenschappen van het bereik waarop de back-up betrekking heeft, worden gewijzigd.

Bijvoorbeeld het volgende bereik (pRange) binnen de context:

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

Maak nu een kloon en een back-up van dit bereik:

ITfRange *pClone;
ITfRangeBackup *pBackup;

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

De objecten bevatten nu het volgende:

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

Wijzig nu de tekst van pRange:

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

De objecten bevatten nu het volgende:

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

Als u de tekst instelt, is de tekst in de context gewijzigd. Het zorgde er ook voor dat het eindanker van pRange en pClone veranderde. pClone bevat nu 'andere woorden' omdat de tekst binnen het bereik is gewijzigd en deze wijzigingen worden bijgehouden door alle bereiken. Wanneer de tekst die wordt gedekt door zowel pRange als pClone is gewijzigd, is ook de tekst van pClone gewijzigd.

De tekst in pBackup is niet gewijzigd van de oorspronkelijke pRange omdat de gegevens (tekst en eigenschappen) in de back-up niet gerelateerd zijn aan de context en afzonderlijk worden opgeslagen. De kloon in de back-up verandert wel, maar de gegevens zijn statisch.

Wanneer u een back-up herstelt, kan de back-up worden toegepast op de kloon binnen de back-up of op een ander bereik. Als u de back-up wilt toepassen op de kloon in de back-up, geeft u NULL- door aan ITfRangeBackup::Restore zoals wordt weergegeven in het volgende codevoorbeeld:

pBackup->Restore(ec, NULL);

De objecten bevatten nu het volgende:

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

Als u de back-up naar een ander bereik wilt herstellen, geeft u een aanwijzer door naar het bereikobject bij het aanroepen van ITfRangeBackup::Restore. De back-up van tekst en eigenschappen wordt toegepast op het nieuwe bereik. Als u bijvoorbeeld het bovenstaande voorbeeld gebruikt vóór de -aanroep herstellen, wordt pRange gewijzigd om dit te laten zien:

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

De objecten bevatten nu het volgende:

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

Toen het eindanker van pRange naar links werd verschoven, veranderde het eindanker van pClone niet.

Herstel nu de back-up met behulp van pRange met het volgende codevoorbeeld:

pBackup->Restore(ec, pRange);

De objecten bevatten nu het volgende:

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

De tekst die door pRange wordt gedekt, is vervangen door 'tekst', een deel van de tekst waarop pClone betrekking heeft, is gewijzigd en pBackup verandert zodat deze overeenkomt met pRange.