Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Неудачное изменение режима текста в контроле RichEdit в Delphi 7

Delphi , ОС и Железо , Справочник по сообщениям

Заголовок:

В процессе работы с controls RichEdit в Delphi 7 пользователи могут столкнуться с проблемой, когда не удается изменить режим текста с помощью функции EM_SETTEXTMODE. В этой статье мы рассмотрим эту проблему и предложим решение, которое поможет вам справиться с ней.

Проблема

При использовании функции EM_SETTEXTMODE для изменения режима текста в контроле RichEdit в Delphi 7 пользователи могут столкнуться со следующей проблемой:

  • После вызова функции EM_SETTEXTMODE режим текста не меняется, несмотря на то, что функция возвращает значение 0 (успех).

Пример кода, который демонстрирует эту проблему:

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(RichEdit1.Handle, WM_SETTEXT, 0, LPARAM(PChar('')));
  Button1.Caption := IntToStr(SendMessage(RichEdit1.Handle, EM_GETTEXTMODE, 0, 0));
  Button1.Caption := Button1.Caption + ' ' + IntToStr(SendMessage(RichEdit1.Handle, EM_SETTEXTMODE, TM_PLAINTEXT, 0));
  Button1.Caption := Button1.Caption + ' ' + IntToStr(SendMessage(RichEdit1.Handle, EM_GETTEXTMODE, 0, 0));
end;

Решение

Проблема связана с тем, что в старых версиях Delphi, таких как Delphi 7, используется библиотека RICHED32.DLL, в которой присутствуют определенные проблемы. Чтобы решить эту проблему, необходимо Modify comctrls.pas, чтобы он загружал библиотеку RICHED20.DLL вместо RICHED32.DLL. Однако это может привести к проблемам совместимости с кодом VCL.

Более простым решением является обновление до более новой версии Delphi, такой как Delphi XE, в которой эта проблема уже решена.

Если обновление версии Delphi невозможно, можно использовать альтернативное решение, предложенное пользователем whosrdaddy в обсуждении на StackOverflow. Для этого необходимо скопировать файл Comctrls.pas в свой проект и внести следующие изменения:

  1. В функции TCustomRichEdit.CreateParams() измените следующую строку:
const
  RichEditModuleName = 'RICHED32.DLL';

на

const
  RichEditModuleName = 'RICHED20.DLL';

и

CreateSubClass(Params, 'RICHEDIT');

на

CreateSubClass(Params, 'RICHEDIT20A');
  1. В функции TRichEditStrings.Insert() измените следующую строку:
if RichEdit.SelStart <> (Selection.cpMax + Length(Str)) then
  raise EOutOfResources.Create(sRichEditInsertError);

на

if RichEdit.SelStart <> (Selection.cpMax + Length(Str) - CountLineBreaks(Str)) then
  raise EOutOfResources.Create(sRichEditInsertError);

При этом необходимо добавить функции CountLineBreaks и PosEx, которые используются в этой строке.

После внесения этих изменений проблема с изменением режима текста в контроле RichEdit в Delphi 7 должна быть решена.

Заключение

В этой статье мы рассмотрели проблему, связанную с неудачным изменением режима текста в контроле RichEdit в Delphi 7, и предложили решение, которое поможет вам справиться с ней. Если у вас есть другие проблемы или вопросы, связанные с Delphi и Pascal, не стесняйтесь задавать их в комментариях или на форумах.

Создано по материалам из источника по ссылке.

Статья описывает проблему с изменением режима текста в контроле RichEdit в Delphi 7 и предлагает решение, связанное с заменой библиотеки RICHED32.DLL на RICHED20.DLL и внесением изменений в код компонента.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по сообщениям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:50:30/0.0042169094085693/1