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

Улучшение прокрутки в RichEdit для большого объема текста в приложениях Delphi

Delphi , Компоненты и Классы , TMemo и TRichEdit

Проблема прокрутки в RichEdit возникает, когда приложение работает с большим количеством строк (в частности, около 130 тысяч с средней длиной в 150 символов). В таких условиях стандартные методы прокрутки могут вести себя некорректно, например, прокрутка вверх (N > 5) или чрезмерная прокрутка (N <= 5). Вопрос заключается в том, можно ли реализовать вертикальную прокрутку иным способом.

Контекст проблемы

В RichEdit версии 2.0 для Windows, при работе с большим объемом данных, возникают проблемы с вертикальной прокруткой. Сообщение WM_VSCROLL не работает корректно, что приводит к неправильной прокрутке. Например, выполнение команды RichEdit1.Perform(WM_VSCROLL, MakeWParam(SB_THUMBPOSITION, N), 0); может приводить к неожиданным результатам при N > 5 или N <= 5.

Альтернативный ответ

Рассмотрим проблему прокрутки в RichEdit версией 2.0. Оказалось, что для работы с большими объемами данных необходимы другие подходы, поскольку стандартные механизмы могут давать сбои. Например, EM_POSFROMCHAR возвращает вертикальное положение для первой строки, но не в нужном диапазоне.

Подтвержденный ответ

В качестве решения предлагается использовать версию 3.0 RichEdit, которая уже включена в операционную систему Windows XP SP1 и последующие версии. При использовании версии 3.0, RichEdit адаптируется под необходимый диапазон разметки, и WM_VSCROLL может быть использован без ограничения 65535 символов, что было ограничивающим фактором для версий 2.0. Проблемы с EM_POSFROMCHAR также решаются, так как версия 3.0 позволяет передавать указатель на POINTL в wParam, и, если это условие выполняется, RichEdit автоматически заполнит структуру, содержащую координаты.

Пример кода для вертикального центрирования строки в RichEdit

const
  Line = 'The SCROLLINFO structure contains scroll bar parameters...'#13#10;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  s := '';
  for i := 1 to 130000 do
    s := s + IntToStr(i) + ' - ' + Line;
  SendMessage(RichEdit1.Handle, WM_SETTEXT, 0, LPARAM(PChar(s)));
end;

procedure VertCenterLine(RichEdit: TRichEdit; LineNum: Integer);
var
  LineIndex, MaxLineIndex: lResult;
  LinePos, MaxPos: TPoint;
  ScrollInfo: TScrollInfo;
  ScrollPos: Extended;
begin
  SendMessage(RichEdit.Handle, EM_SETSEL, 0, 0);
  SendMessage(RichEdit.Handle, winapi.messages.EM_SCROLLCARET, 0, 0);
  RichEdit.SetFocus;

  LineIndex := SendMessage(RichEdit.Handle, EM_LINEINDEX, LineNum, 0);
  MaxLineIndex := SendMessage(RichEdit.Handle, EM_LINEINDEX, RichEdit.Lines.Count, 0);
  if MaxLineIndex = -1 then
    MaxLineIndex := SendMessage(RichEdit.Handle, EM_LINEINDEX, RichEdit.Lines.Count - 1, 0);

  SendMessage(RichEdit.Handle, EM_POSFROMCHAR, WPARAM(@LinePos), LineIndex);
  SendMessage(RichEdit.Handle, EM_POSFROMCHAR, WPARAM(@MaxPos), MaxLineIndex);

  ScrollInfo.cbSize := SizeOf(ScrollInfo);
  ScrollInfo.fMask := SIF_RANGE;
  GetScrollInfo(RichEdit.Handle, SB_VERT, ScrollInfo);

  ScrollPos := (LinePos.y - RichEdit.ClientHeight / 2) / MaxPos.y;
  ScrollPos := ScrollPos * (ScrollInfo.nMax - ScrollInfo.nMin);
  SendMessage(RichEdit.Handle, WM_VSCROLL, MakeWParam(SB_THUMBPOSITION, Round(ScrollPos)), 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  VertCenterLine(RichEdit1, 110000);
end;

Приведенный выше код можно использовать в приложении Delphi для вертикального центрирования определенной строки в компоненте RichEdit. Важно отметить, что в данном случае предполагается, что параметр WordWrap установлен в false для корректной работы с большим количеством строк.

Заключение

Для улучшения прокрутки в RichEdit для приложений Delphi, работающих с большими объемами текста, рекомендуется использовать версию 3.0 RichEdit, которая поставляется с Windows XP SP1 и более поздними версиями. Это позволит избежать ограничений, связанных с версией 2.0 и обеспечит более высокую производительность и надежность при работе с большим количеством строк.

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

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


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

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




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


:: Главная :: TMemo и TRichEdit ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 09:06:54/0.0034658908843994/0