Aralık
Çapa
Bir aralık, bir başlangıç tutturucu ve bir bitiş tutturucuiki bağlantı noktasıyla sınırlandırılır. İki karakter arasındaki hayali bir yuvada yer alan bir yer işareti vardır. Başlangıç tutturucu, tutturucuyu izleyen metinle, uç tutturucu ise tutturucudan önceki metinle ilişkilidir. Hem başlangıç hem de bitiş tutturucuları aynı konumda bulunabilir. Bu durumda, aralığın uzunluğu sıfırdır.
Örneğin, aşağıdaki metinle başlayın:
This is text.
Şimdi bu metne 0 konumunda hem başlangıç hem de bitiş tutturucuları olan bir aralık uygulayın. Görsel olarak şu şekilde gösterilir:
<anchor></anchor>This is text.
Tutturucular metnin kendi içinde yer kaplamaz. Bu sıfır uzunluklu bir aralıktır ve metni boş olur.
Şimdi uç tutturucuyu +3 konumu kaydır. Görsel olarak şu şekilde gösterilir:
<anchor>Thi</anchor>s is text.
Başlangıç bağlantısı, 0 konumundaki karakterin hemen önüne yerleştirilir ve bitiş tutturucu 3. konumdaki karakterin hemen arkasına yerleştirilir çünkü bitiş tutturucu 3 yere taşınır. Metin aralığı artık "Thi" olur.
Ayrıca, başlangıç bağlantısı bitiş tutturucuyu takip etmek için yapılamaz ve bitiş tutturucu başlangıç tutturucusunun önüne getirilemez.
Yer Çekimi
Her yer işareti, yer işareti konumundaki metin akışına eklendiğinde tutturucunun nasıl yanıt vereceğini belirleyen yer çekimi ayarına sahiptir. Yer işareti konumunda ekleme yapıldığında, tutturucunun konumunda bir ayarlama yapılmalıdır. Yer çekimi, bu yer çekimi ayarlamasının nasıl yapıldığını belirler.
Mesela:
It is <anchor></anchor>cold today.
"çok" sözcüğü aralık konumuna eklenirse, başlangıç bağlantısı eklenen sözcüğün önüne veya arkasına yerleştirilebilir:
It is <anchor>very </anchor>cold today.
-Veya-
It is very <anchor></anchor>cold today.
Yer çekimi, yerinde ekleme yapıldığında tutturucunun nasıl yeniden konumlandırılmış olduğunu belirtir. Yerçekimi geri veya ileri olabilir.
Yer işareti geriye doğru yer çekimine sahipse, yer işareti ekleme noktasına göre, eklenen metnin tutturucuyu takip edebilmesi için ekleme noktasına göre geriye doğru hareket eder:
It is <anchor>very </anchor>cold today.
Yer işareti öne doğru yer çekimine sahipse, yer işareti eklemede ileri (ekleme noktasına göre) ilerler, böylece eklenen metin yer işaretinden önce geçer:
It is very <anchor></anchor>cold today.
Klonlar ve Yedeklemeler
Bir aralık nesnesinin "kopyasını" oluşturmanın iki yolu vardır. Birincisi, ITfRange::Clonekullanarak aralığın bir kopyasını yapmaktır. İkincisi, ITfContext::CreateRangeBackupkullanarak aralığın bir yedekleme yapmaktır.
Kopya, statik veri içermeyen bir aralığın kopyasıdır. Aralığın tutturucuları kopyalanır, ancak kopya yine de bağlam içindeki bir metin aralığını kapsar. Kopya, her açıdan bir aralık nesnesidir. Bu, kopyalanan aralığın metin ve özelliklerinin dinamik olduğu ve kopyanın kapsadığı aralığın metni ve/veya özellikleri değiştiğinde değişeceği anlamına gelir.
Yedekleme, yedeklemenin statik veri olarak yapıldığı sırada bir aralığın metnini ve özelliklerini depolar. Yedekleme ayrıca özgün aralığı kopyalayarak özgün aralığın boyutuna ve konumuna yapılan değişikliklerin izlenebilmesini sağlar. Bu, yedeklenen aralığın metin ve özelliklerinin statik olduğu ve yedekleme kapsamındaki aralığın metni ve/veya özellikleri değiştiğinde değişmediği anlamına gelir.
Örneğin, bağlam içinde aşağıdaki aralık (pRange):
"This is some <pRange>text</pRange>."
Şimdi bu aralığın bir kopyasını ve yedeğini yapın:
ITfRange *pClone;
ITfRangeBackup *pBackup;
pRange->Clone(&pClone);
pContext->CreateRangeBackup(ec, pRange, &pBackup);
Şimdi, nesneler aşağıdakileri içerir:
pRange = "text"
pClone = "text"
pBackup = "text"
Şimdi pRange metnini değiştirin:
WCHAR wsz[] = L"other words";
pRange->SetText(ec, 0, wsz, lstrlenW(wsz));
Şimdi, nesneler aşağıdakileri içerir:
Context = "This is some other words."
pRange = "other words"
pClone = "other words"
pBackup = "text"
Metnin ayarlanması, bağlam içindeki metnin değişmesine neden oldu. Ayrıca pRange ve pClone uç tutturucusunun değişmesine neden oldu. Metin aralık içinde değiştiğinden ve bu değişiklikler tüm aralıklar tarafından izlendiği için pClone artık "diğer sözcükler" içeriyor. Hem pRange hem de pClone'un kapsadığı metin değiştiğinde, pClone'un metni de değişti.
Yedeklemedeki veriler (metin ve özellikler) bağlama bağlı olmadığından ve ayrı olarak depolandığından, pBackup içindeki metin özgün pRange'den değişmedi. Yedeklemenin içinde yer alan kopya aslında değişir, ancak veriler statiktir.
Yedekleme geri yüklenirken yedekleme, yedek içindeki kopyaya veya tamamen farklı bir aralığa uygulanabilir. Yedekleme içindeki kopyaya yedekleme uygulamak için, aşağıdaki kod örneğinde gösterildiği gibi ITfRangeBackup::RestoreNULL geçirin:
pBackup->Restore(ec, NULL);
Şimdi, nesneler aşağıdakileri içerir:
Context = "This is some text."
pRange = "text"
pClone = "text"
pBackup = "text"
Yedeklemeyi farklı bir aralığa geri yüklemek için, ITfRangeBackup::Restoreçağırırken aralık nesnesine bir işaretçi geçirin. Yedeklenen metin ve özellikler yeni aralığa uygulanır. Örneğin, Geri Yükleme çağrısından önceki örneği kullanarak pRange şu durumu gösterecek şekilde değiştirilir:
LONG lShifted;
pRange->ShiftEnd(ec, -2, &lShifted, NULL);
Şimdi, nesneler aşağıdakileri içerir:
Context = "This is some other words."
pRange = "other wor"
pClone = "other words"
pBackup = "text"
pRange'in uç bağlantısı sola iki yere kaydırıldığında, pClone'un uç bağlantısı değişmedi.
Şimdi aşağıdaki kod örneğiyle pRange kullanarak yedeklemeyi geri yükleyin:
pBackup->Restore(ec, pRange);
Şimdi, nesneler aşağıdakileri içerir:
Context = "This is some textds."
pRange = "text"
pClone = "textds"
pBackup = "text"
pRange'in kapsadığı metin "metin" ile değiştirildi, pClone'un kapsadığı metnin bir bölümü değişti ve pBackup değişiklikleri pRange ile eşleşecek şekilde değiştirildi.