Dela via


Spänner

Ankare

Ett intervall avgränsas av två fästpunkter, ett startankare och ett slutankare. Det finns en fästpunkt i ett imaginärt fack mellan två tecken. Startankaret relaterar till text som följer fästpunkten och slutankaret relaterar till text som föregår fästpunkten. Både start- och slutankare kan finnas på samma plats. I det här fallet har intervallet noll längd.

Börja till exempel med följande text:

This is text.

Använd nu ett intervall för den här texten med både start- och slutankare vid position 0. Den representeras visuellt som:

<anchor></anchor>This is text.

Fästpunkterna tar inte upp något utrymme i själva texten. Det här är ett intervall med noll längd och texten är tom.

Flytta nu slutankaret +3 positioner. Den representeras visuellt som:

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

Startankaret placeras precis före tecknet i position 0 och ändfästet placeras strax efter tecknet i position 3 eftersom slutankaret flyttas till rätt 3 platser. Textområdet är nu "Thi".

Dessutom kan inte startankaret göras för att följa slutankaret och slutankaret kan inte göras för att föregå startankaret.

Fästpunktsgravitation

Varje fästpunkt har en gravitation inställning som avgör hur fästpunkten svarar när text infogas i textströmmen vid fästpunkten. När en infogning görs i ett fästpunkts läge måste en justering göras i fästpunktens position. Gravitationen avgör hur denna justering av fästpunktspositionen görs.

Till exempel:

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

Om ordet "very" infogas vid intervallpositionen kan startankaret placeras antingen före eller efter det infogade ordet:

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

-Eller-

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

Förankringsgravitationen anger hur fästpunkten flyttas när en insättning görs vid dess position. Gravitationen kan antingen bakåt eller framåt.

Om fästpunkten har bakåtgravitation flyttas fästpunkten bakåt, i förhållande till insättningspunkten, vid infogning så att den infogade texten följer fästpunkten:

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

Om fästpunkten har framåtvikt flyttas fästpunkten framåt (i förhållande till insättningspunkten) vid insättningen så att den infogade texten föregår fästpunkten:

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

Kloner och säkerhetskopior

Det finns två sätt att göra en "kopia" av ett intervallobjekt. Den första är att göra en klona av intervallet med hjälp av ITfRange::Clone. Den andra är att göra en säkerhetskopia av intervallet med hjälp av ITfContext::CreateRangeBackup.

En klon är en kopia av ett intervall som inte innehåller statiska data. Fästpunkterna i området kopieras, men klonen täcker fortfarande ett textintervall i kontexten. En klon är ett intervallobjekt i alla avseenden. Det innebär att texten och egenskaperna för ett klonat område är dynamiska och ändras om texten och/eller egenskaperna för det område som omfattas av klonen ändras.

En säkerhetskopia lagrar text och egenskaper för ett intervall när säkerhetskopieringen görs som statiska data. En säkerhetskopia klonar också det ursprungliga intervallet så att ändringar i storlek och position för det ursprungliga intervallet kan spåras. Det innebär att texten och egenskaperna för ett säkerhetskopierat intervall är statiska och inte ändras om texten och/eller egenskaperna för intervallet som omfattas av säkerhetskopian ändras.

Till exempel följande intervall (pRange) i kontexten:

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

Gör nu en klon och en säkerhetskopia av det här intervallet:

ITfRange *pClone;
ITfRangeBackup *pBackup;

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

Objekten innehåller nu följande:

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

Ändra nu texten i pRange:

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

Objekten innehåller nu följande:

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

När texten angavs ändrades texten i kontexten. Det gjorde också att slutankaret för pRange och pClone ändrades. pClone innehåller nu "andra ord" eftersom texten har ändrats inom intervallet och dessa ändringar spåras av alla intervall. När texten som omfattas av både pRange och pClone ändrades också texten i pClone.

Texten i pBackup har inte ändrats från det ursprungliga pRange eftersom data (text och egenskaper) i säkerhetskopian inte är relaterade till kontexten och lagras separat. Klonen som finns i säkerhetskopian ändras faktiskt, men data är statiska.

När du återställer en säkerhetskopia kan säkerhetskopieringen tillämpas på klonen inom säkerhetskopian eller på ett helt annat intervall. Om du vill använda säkerhetskopian på klonen i säkerhetskopian skickar du NULL- till ITfRangeBackup::Återställ enligt följande kodexempel:

pBackup->Restore(ec, NULL);

Objekten innehåller nu följande:

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

Om du vill återställa säkerhetskopian till ett annat intervall skickar du en pekare till intervallobjektet när du anropar ITfRangeBackup::Restore. Den säkerhetskopierade texten och egenskaperna tillämpas på det nya intervallet. Om du till exempel använder exemplet ovan före anropet Återställ ändras pRange för att visa detta:

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

Objekten innehåller nu följande:

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

När slutankaret för pRange flyttades till de vänstra två platserna ändrades inte slutankaret för pClone.

Återställ nu säkerhetskopian med hjälp av pRange med följande kodexempel:

pBackup->Restore(ec, pRange);

Objekten innehåller nu följande:

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

Texten som omfattas av pRange har ersatts med "text", en del av texten som omfattas av pClone har ändrats och pBackup-ändringar som matchar pRange.