При переходе с Delphi 2006 на Delphi XE2 разработчики могут столкнуться с рядом проблем, связанных с изменением поведения компонента RichEdit. В частности, RichEdit 2.0 использует в качестве разделителя строк один символ перевода строки (CR), в то время как в предыдущих версиях использовалась пара символов (CRLF). Это изменение приводит к тому, что индексация символов, основанная на фактической строке текста, сбивается с толку со стороны VCL.
Проблема и ее описание
Когда вы отправляете сообщение WM_GETTEXT, компонент возвращает буфер текста с парами CRLF. Однако, при отправке сообщения WM_GETTEXTLENGTH получается значение, как будто текст все еще содержит символы CRLF. В отличие от этого, отправка сообщения EM_SETSEL (установка SelStart) будет обрабатывать введенное значение, как будто текст содержит только символы CR. Это несоответствие приводит к ошибкам в работе приложения, например, к сбоям в подсветке синтаксиса.
Подтвержденный ответ
Проблема действительно существует и связана с изменением внутреннего представления строк в RichEdit 2.0. Одним из предложенных решений является использование скрытого компонента TMemo для синхронизации позиций в тексте с компонентом RichEdit. В коде приведен пример функции, которая выполняет парсинг текста и замену кодов слияния данными из внешних источников, учитывая разницу в индексации символов.
function TEditForm.ParseTest: boolean;
var
TagLength, ValueLength, ParseStart, ParseEnd: integer;
ParseValue: string;
Memo: TMemo;
begin
Result := True; // Default
Memo := TMemo.Create(nil);
try
Memo.Parent := self;
Memo.Visible := False;
try
Memo.Lines.Clear;
Memo.Lines.AddStrings(RichEditor.Lines);
Memo.Text := StringReplace(Memo.Text, #13#10, #13, [rfReplaceAll]);
// Другие операции с текстом...
finally
FreeAndNil(Memo);
end;
end;
end;
Альтернативный ответ
Другой подход заключается в использовании функции EM_LINEFROMCHAR для корректировки позиции курсора, учитывая разницу в представлении строк. Это позволяет получить количество пар CRLF до желаемой позиции и скорректировать позицию курсора соответственно.
Заключение
При переходе на новую версию компонента RichEdit важно учитывать изменения в его поведении. Разработчикам может потребоваться внести корректировки в свой код для обеспечения совместимости и корректной работы приложений. Использование скрытого TMemo или корректировка позиции курсора с помощью EM_LINEFROMCHAR являются возможными решениями, хотя и не идеальными. В будущем стоит ожидать более удобных и эффективных решений от разработчиков компонентов.
При переходе на Delphi XE2 разработчики сталкиваются с проблемами в компоненте RichEdit, связанными с изменением обработки символов перевода строк.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS