Версия для печати


Delphi.ToolsAPI.IOTAEditReader.GetText возвращает неверный результат
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1332

Cepгей Poщин
дата публикации 20-12-2007 03:35

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


Создаём простейший эксперт, который копирует из окна редактора текст программы в строковую переменную и обратно. В версиях Delphi 2005 и старше результирующий текст может быть испорчен без всяких видимых причин, если такой текст сохранить, данные, разумеется, будут потеряны. Это происходит если размер буфера, передаваемого функцией IOTAEditReader.GetText, больше "сакрального" числа 65535.

Во всех версиях Delphi, начиная с BDS2005, текст в окне редактора имеет кодировку Utf8, и данные, получаемые с помощью функции IOTAEditReader.GetText, должны конвертироваться в формат Unicode. Конвертироваться должны не отдельные куски произвольного размера, а весь текст сразу, т.к. символы могут занимать 1-4 байта и граница буфера может приходиться на середину символа. Это потребовало создание буфера равным размеру данных в окне редактора. В результате эксперт, который исправно работал в Delphi 5, в BDS2006 начал периодически "убивать" текст программ.

После многих часов поиска ошибки в своем коде, обрабатывающем текст, выяснилось, что GetText возвращает не количество переданных байтов, как следовало ожидать, а остаток от деления на 65536, т.е. возвращается только два байта из четырех. Это проверялось в Delphi 5, BDS2006 и Delphi2007 SP2. В Delphi 5 результат возвращается правильный.




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

Cамостоятельно получать длину возвращаемых данных: см. ReaderGetText в модуле TestIDEutl примера.

В демонстрационном примере создаётся пункт меню IDE tools/Проверка копирования, который копирует текст из окна редактора и выдаёт сообщение, если GetText возвращает ошибочный результат.


Дополнительные ссылки и прилагаемые файлы


Скачать пример: StoneTest_103.zip


Комментарий
При проверке в Delphi 7 ошибка не возникает.