Определение позиции и ширины одного или нескольких символов внутри ArtisticText

  • Автор темы Автор темы Cyrax
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Под физическим смыслом Length'а я понимаю количество байтов, физически занимаемых об_ектом. Об_ект класса TextRange физически занимает больше, чем N+1 байт, т.е. больше, чем возвращает свойство Length.

То, что свойство имеет логический смысл, подтверждает и справка:
The Length property returns the number of characteres in the range.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Даже из приведенной вами цитаты видно, что Length - это не размер объекта в байтах, но и не длина строки внутри объекта. Это - количество символов внутри range. То есть, символы могут быть и непечатаемые, скажем, нулевой. Я сейчас проверить не могу, а попробуйте не через Mid символ вытащить (это строковая функция и работает с уже сконвертированным в строку рангом), а через индекс или item
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Только что проверил - действительно Length равно количеству элементов в Text.Store.Characters, последний элемент пустой.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Через Mid пытался - вылетает на ошибке, поскольку строка из последнего символа получается пустой.
Интересно, какой код имеет символ.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Скорее всего, 0, я в начале говорил об этом. Хотя, проверить сложно, Text.Store.Characters.item(N) если содержит нулевой символ, то при преобразовании в строку при присваивании вернет пустышку.
А зачем оно вам надо?
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Скорее всего, 0, я в начале говорил об этом.
Символ chr(0) методы TextRange не находят. Стало быть, что-то другое.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

А каким методом можно найти вложение нулевого символа в строку? Нулевой символ - это символ-ограничитель и по определению ни в одну строку не входит.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

_MBK_, TextRange - это не строка, а range символов, как Вы сами это отметили. И этот странный символ занимает в этом range такое же место, как и все остальные символы - для него выделяется такой же элемент массива и к нему можно обращаться по индексу. Стало быть, и в методах поиска он тоже участвует.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

TextRange - это, действительно не строка, это даже не массив символов, это, скорее, упорядоченный список, элементами которого являются такие же точно TextRange. Последний элемент списка - пустой. Теперь вопрос на засыпку - как можно отследить символ #0 в списке, если символ можно отследить только по вхождению в строку, а символ #0 по определению ни в какую строку входить не может, более того, при преобразовании в строку тоже дает пустую строку? Сама по себе постановка задачи бессмысленна, не пойму, зачем вы за это так схватились?
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Символ chr(0) методы TextRange не находят. Стало быть, что-то другое.
Странно если бы находили. ЧИсто поржать можно попробовать создать строчку из десяти нулевых чаров и потом сделать поиск в ней.
http://ru.wikipedia.org/wiki/Нуль-терминированная_строка
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Странно если бы находили.
А не странно, что к нему можно обращаться так же как и к любому символу ?
Вроде как одно из двух должно быть - или методы/свойства работают с этим символом или нет. Length - работает...

Последний элемент списка - пустой. Теперь вопрос на засыпку - как можно отследить символ #0 в списке, если символ можно отследить только по вхождению в строку, а символ #0 по определению ни в какую строку входить не может
А Вы уверены, что в TextRange символ отслеживается по вхождению в строку ?
Отслеживание происходит по тому же механизму, по которому происходит и обращение к этому символу.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText


Не по теме:
Иногда мне кажется, что вам чисто пофлеймить охота

Нет, не странно, тем более, к нему обращаемся не как к символу, а как к пустому концевому элементу упорядоченного списка. Улавливаете разницу?
Еще раз повторяю и по поводу Length: это не длина строки (как функция Len), это - количество элементов упорядоченного списка.

Не по теме:
Такое ощущение, что я на уроке информатики школьнику объясняю.

О! Придумал хороший пример. Если бы можно было найти способ и заменить один из элементов в середине списка на символ #0, то Length осталось бы прежним, хотя возвращаемая строка урезалась бы весьма существенно - я понятно излагаю?
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Еще раз повторяю и по поводу Length: это не длина строки (как функция Len), это - количество элементов упорядоченного списка.
Это количество символов в TextRange. Более того, свойства и методы одного и того же класса должны быть синхронизированы. Если свойство length учитывает последний непечатаемый символ, и тем более доступ к этому элементу осуществляется аналогично любому другому символу, то и поиск должен осуществляться по всем символам.

О! Придумал хороший пример. Если бы можно было найти способ и заменить один из элементов в середине списка на символ #0, то Length осталось бы прежним, хотя возвращаемая строка урезалась бы весьма существенно - я понятно излагаю?
Этот пример не имеет никакого отношения к классу TextRange. TextRange позволяет изменить символ на нулевой символ и при этом возвращаемая строка не урезается до этого символа (можете проверить свойство TextRange.Text). Вам это ни о чём не говорит ?
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

TextRange.Text - это всего навсего поле типа String и никакого отношения к упорядоченому списку оно не имеет! Изменить сам список через TextRange.Characters не получится никак, потому как поле ReadOnly. Попытаться вставить нулевой символ, скажем, через Insert тоже бесполезно, потому как при вставке он преобразуется в обычный символ и перестает быть пустым концевым элементом, можете проверить.
То же самое, кстати, происходит, если символ #0 в строковую переменную вставить.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

при вставке он преобразуется в обычный символ и перестает быть пустым концевым элементом
Да, действительно. Меняет на пробел (#32).
Такое поведение говорит о том, что последний символ (возможно, и нулевой) является служебным (его нельзя удалить, заменить или продублировать). Но причину учёта этого символа в свойстве Length и вообще наличия в TextRange отдельного элемента с этим символом не об_ясняет.

TextRange.Text - это всего навсего поле типа String и никакого отношения к упорядоченому списку оно не имеет!
Я знаю. Про это поле я упомянул постольку, поскольку оно позволяет вытащить содержимое TextRange'а в виде строки.

Изменить сам список через TextRange.Characters не получится никак, потому как поле ReadOnly.
Сама ссылка на коллекцию TextCharacters, может, и ReadOnly, но символы по индексу меняет без проблем...
...и даже последний символ. Только при замене последнего символа физически происходит вставка - последний символ передвигается на одну позицию вперёд.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Да, действительно. Меняет на пробел (#32).
Такое поведение говорит о том, что последний символ (возможно, и нулевой) является служебным (его нельзя удалить, заменить или продублировать). Но причину учёта этого символа в свойстве Length и вообще наличия в TextRange отдельного элемента с этим символом не об_ясняет.
Причина вполне логичная - упорядоченый список, из теории программирования, должен заканчиваться нулевым элементом. Кстати, в объекте присутствуют классические в этом случае ссылки на начало и конец списка.
Кстати (сейчас проверить не могу), а что будет если просто присвоить последний item какому-нибудь в середине?
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

а что будет если просто присвоить последний item какому-нибудь в середине?
Тот элемент TextRange'а, которому присваиваем последний символ, вообще исчезает (удаляется из об_екта TextRange). Длина Length, соответственно, уменьшается на единицу. Отсюда делаем вывод, что последний символ - не нулевой. Возможно, последний элемент TextRange'а вообще не содержит никакого символа.

Причина вполне логичная - упорядоченый список, из теории программирования, должен заканчиваться нулевым элементом.
Откуда такая уверенность, что TextRange - это список ?
Произвольный доступ по индексу в списках не реализовывают.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Тот элемент TextRange'а, которому присваиваем последний символ, вообще исчезает (удаляется из об_екта TextRange). Длина Length, соответственно, уменьшается на единицу. Отсюда делаем вывод, что последний символ - не нулевой. Возможно, последний элемент TextRange'а вообще не содержит никакого символа.
Вполне возможно, на самом деле вопрос чисто метафизический. Что есть символ в понимании TextCharacters? Это некий объект, являющийся элементом списка TextRange. А вовсе не символ в понимании "часть строки String". Строковое поле Text несет чисто информативную функцию.

Откуда такая уверенность, что TextRange - это список ?
Произвольный доступ по индексу в списках не реализовывают.
И тем не менее это список. Каждый элемент имеет ссылки на начало и конец списка, на принадлежность к строке, парагрофу и слову, на текущее местоположение в списке.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Каждый элемент имеет ссылки на начало и конец списка
Ссылки на начало и конец списка так же легко реализовываются и в других структурах, например, в динамических массивах.

на принадлежность к строке, парагрофу и слову
Даже если каждый элемент TextRange'а и содержит элемент принадлежности (а его вполне может и не быть), то он также может присутствовать и в других реализациях коллекции.
 
Ответ: Определение позиции и ширины одного или нескольких символов внутри ArtisticText

Ссылки на начало и конец списка так же легко реализовываются и в других структурах, например, в динамических массивах.
Если массив состоит из элементов, содержащих ссылки друг на друга - значит это упорядоченный список по определению.

Даже если каждый элемент TextRange'а и содержит элемент принадлежности (а его вполне может и не быть)
Не может. Разве что его искусственно создали, тогда он смысла не имеет.
 
Статус
Закрыто для дальнейших ответов.