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/Проверка выделения, который отображает координаты курсора и выделенного участка текста.
- Если начало и конец выделенного участка совпадают, то надо использовать координаты текстового курсора
if IOTASourceEditor.BlockStart = IOTASourceEditor.BlockAfter then
Used(IOTASourceEditor.EditViews[0].Position)
При этом не надо забывать, что курсор может находиться после символа окончания строки. Т.е. Position.Column может быть больше длины текущей строки.
- В версиях, начиная с Delphi2005, следует самостоятельно определять номер колонки, анализируя размер каждого символа (см. функцию TrueCol).
Скачать пример:
StoneTest_108.zip
В первой части материала автор немного ошибся, считая, что координаты курсора всегда эквивалентны координатам конца выделенного блока. На самом деле, это верно лишь при некоторых условиях (выключен режим Persistent blocks и выделенный блок существует). Если блок отсутствует (координаты начала равны координатам конца), то координаты блока не обязаны синхронизироваться с курсором, что мы и наблюдаем. В случае Persistent blocks курсор и блок независимы по определению.
[Редактор кода] [Эксперты] [Кодировки, unicode]
Обсуждение материала нет сообщений |