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

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

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


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

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

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

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

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

 
   
С Л С

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

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

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

Квинтана

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

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

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

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

 
  
АРХИВЫ

 
 

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

Delphi.ToolsAPI.IOTAEditReader.GetText возвращает неверный результат

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 сообщение
  
Время на сайте: 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» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

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