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 ошибка не возникает.
[Эксперты]
Обсуждение материала [ 02-11-2010 07:16 ] 1 сообщение |