Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2015, 17:54   #1
NexoLarus
 
Регистрация: 28.09.2013
Сообщений: 3
Сообщение Положение ScrollBar'a в TRichView

На форме лежит компонент TRichView. Нужно реализовать автоскролл, который активируется, когда пользователь опускает вертикальный scrollbar этого компонента в самый конец. Пробовал получить общую длину scrollbar'a и по событию проверить, находится ли он на позиции max:
Код:
var
   SInf:TScrollInfo;
begin
   Sinf.cbSize:= SizeOf(ScrollInfo);
   Sinf.fMask:=SIF_TRACKPOS + SIF_RANGE;
   GetScrollInfo(RichView.Handle, SB_VERT, Sinf);
   if Sinf.nTrackPos = Sinf.nMax then
      //тут включаем автоскролл
end;
Проблема в том, что Sinf.nMax не соответствует положению scrollbar'a, находящегося в самом низу.
Экспериментальным путем выяснил, что каждое добавление строки увеличивает nMax на 1 или на 2 (чередуются, но не всегда). Когда строк становится больше, чем размеры RichView, nTrackPos увеличивается точно так же. Но не факт, что так же будет происходить при другом расширении экрана, размере шрифта, размере компонента и т.д. Может есть какой-то простой способ определить, что scrollbar находится в самом конце?
NexoLarus вне форума Ответить с цитированием
Старый 01.04.2015, 20:57   #2
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

MSDN говорит ITextServices::TxGetVScroll method
Цитата:
...
plMax
Type: LONG*
The maximum scroll position.
plPos
Type: LONG*
The current scroll position.
...
хейдер для Text Object Model (TOM)
стоит попробовать, о результатах отпишитесь - интересно
Skype: cotseec
ICQ: 330-171-495
cotseec вне форума Ответить с цитированием
Старый 02.04.2015, 11:03   #3
NexoLarus
 
Регистрация: 28.09.2013
Сообщений: 3
По умолчанию

Если я правильно понимаю, ITextServices позволяет создать "Windowless Rich Edit", т.е с его помощью можно реализовать функционал RichEdit без использования оного. А как его можно привязать к стороннему компоненту TRichView?

Последний раз редактировалось NexoLarus; 02.04.2015 в 11:06.
NexoLarus вне форума Ответить с цитированием
Старый 03.04.2015, 14:54   #4
NexoLarus
 
Регистрация: 28.09.2013
Сообщений: 3
По умолчанию

Все оказалось значительно проще =)
Код:
var
   Sinf:TScrollInfo;
begin
   Sinf.cbSize:= SizeOf(ScrollInfo);
   Sinf.fMask:= SIF_POS + SIF_RANGE + SIF_PAGE;
   GetScrollInfo(RichView.Handle, SB_VERT, Sinf);
   if Sinf.nPos+1 = Sinf.nMax - Sinf.nPage  then
      AutoScroll:=true
   else
      AutoScroll:=false;
end;
Цитата:
The SetScrollInfo function performs range checking on the values specified by the nPage and nPos members of the SCROLLINFO structure. The nPage member must specify a value from 0 to nMax - nMin +1. The nPos member must specify a value between nMin and nMax - max( nPage– 1, 0). If either value is beyond its range, the function sets it to a value that is just within the range.

Последний раз редактировалось NexoLarus; 04.04.2015 в 09:33.
NexoLarus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TrichView mmm5on Общие вопросы Delphi 3 04.12.2012 15:52
TRichView DjDram Общие вопросы Delphi 6 19.06.2011 02:25
TRichView - работа с таблицами. chandrasecar Компоненты Delphi 0 22.03.2009 19:11
TRichView - разметка данных BOBAH13 Компоненты Delphi 5 19.02.2008 21:13