Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подводные камни
  
О разделе

Список по категориям
Общий список

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  12:57[Войти] | [Зарегистрироваться]

ToolsAPI.IOTASourceEditor.IOTAEditPosition.Column возвращает неверный результат

Cepгей Poщин
дата публикации 11-08-2008 03:58

КАТЕГОРИЯIDE.Delphi.ToolsAPI.IOTASourceEditor.IOTAEditPosition.Column возвращает неверный результат
ПРОДУКТBDS 2005+
ПЛАТФОРМАWindows


Создаём простейший эксперт, который при нажатии клавиш выводит окно, содержащее координаты (колонку и строку) выделенного участка текста и положения текстового курсора.

Открыв любой файл, выделяем участок текста где-нибудь в середине программы, отображаем координаты выделенного участка — правильные.

Нажимаем Ctrl+Home, попадаем в начало текста, теперь координаты начала и конца выделенного текста совпадают, но (с большой вероятностью) не равны координатам курсора. Такое поведение наблюдалось в Delphi 5,7,2006,2007 и вероятно, будет наблюдаться в Delphi2009. См. TestIDEutl.DemoErrorSelect

В версиях, начиная с Delphi2005, если поместить курсор после русских букв, возвращается также неправильный номер колонки (EditViews.Position.Column). Это связано с тем, что в кодировке UTF8 символы, не принадлежащие к основной кодовой странице, занимают более одного байта, а при анализе координат, вероятно, по старинке, используется предположение, что один символ всегда занимает один байт. Остаётся загадкой, почему координаты курсора в статусной строке отображаются правильно.

Демонстрационный пример (см. также Delphi.ToolsAPI.IOTAEditReader.GetText возвращает неверный результат) создаёт дополнительный пункт меню tools/Проверка выделения, который отображает координаты курсора и выделенного участка текста.


Типовые решения


  1. Если начало и конец выделенного участка совпадают, то надо использовать координаты текстового курсора
    if IOTASourceEditor.BlockStart = IOTASourceEditor.BlockAfter then
      Used(IOTASourceEditor.EditViews[0].Position)
    При этом не надо забывать, что курсор может находиться после символа окончания строки. Т.е. Position.Column может быть больше длины текущей строки.
  2. В версиях, начиная с Delphi2005, следует самостоятельно определять номер колонки, анализируя размер каждого символа (см. функцию TrueCol).



Дополнительные ссылки и прилагаемые файлы
Скачать пример: StoneTest_108.zip


Комментарий

В первой части материала автор немного ошибся, считая, что координаты курсора всегда эквивалентны координатам конца выделенного блока. На самом деле, это верно лишь при некоторых условиях (выключен режим Persistent blocks и выделенный блок существует). Если блок отсутствует (координаты начала равны координатам конца), то координаты блока не обязаны синхронизироваться с курсором, что мы и наблюдаем. В случае Persistent blocks курсор и блок независимы по определению.


Смотрите также материалы по темам:


[Редактор кода] [Эксперты] [Кодировки, unicode]

 Обсуждение материала нет сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования