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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2013, 07:41   #1
victorixx
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 21
По умолчанию RichEdit. Центрировать выделенный текст по вертикали.

Здрасьте всем!
Есть RichEdit. В нем большой текст. Есть массив подстрок этого текста, в котором сохранены сами подстроки и их позиция в тексте.
Задача: 1. Нажатием кнопки выделить очередную подстроку. 2. При этом необходимо, чтобы эта выделенная подстрока позиционировалась по середине (в смысле по вертикальной середине, расположение по горизонтали роли не играет) клиентской области RichEditа.
С первой задачей кое-как справился . А вот со второй че та...
Поможите, чем могёте, пжлста! А то уже голову сломал. Пасиба.

Последний раз редактировалось victorixx; 13.09.2013 в 08:26.
victorixx вне форума Ответить с цитированием
Старый 13.09.2013, 07:45   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Центрируется абзац целиком. См. свойство Paragraph.Alignment
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.09.2013, 07:54   #3
victorixx
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Центрируется абзац целиком. См. свойство Paragraph.Alignment
Я не в том смысле что центрировать алайнмент. Может не так выразился... Мне надо, чтобы строка, в которой находится выделенная (SelStart, SelLength и всё такое) подстрока "встала" посередине клиентской области, то есть не вверху поля ввода и не внизу, а посерединке. Понятно?
Нажатием кнопки выделяется очередная подстрока. Пока эти подстроки находятся в начале текста - все нормально. Но как только они начинают сдвигаться за пределы видимой области вниз, то сам текст, соответственно, тоже сдвигается вверх. В принципе, мне это и нужно, но при сдвиге очередная выделенная подстрока находится у нижнего края (а то и вообще в правом нижнем углу) окна ввода, и пользователю неудобно читать контекст. Scrollby не подходит, так как он медленный и не в каждом случае нужен (несколько подстрок могут находиться и в самом начале текста, а ставить выполнение или невыполнение scrollby в зависимость от позиции подстроки в тексте невозможно, так как сам текст, его размер и размер шрифта могут изменяться). Вот... как то так.

Последний раз редактировалось victorixx; 13.09.2013 в 08:05.
victorixx вне форума Ответить с цитированием
Старый 13.09.2013, 07:58   #4
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

прокрутить область нужно?
ZuBy вне форума Ответить с цитированием
Старый 13.09.2013, 08:07   #5
victorixx
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 21
По умолчанию

собственно говоря, да, но предварительно нужно еще узнать, насколько ее нужно прокручивать
victorixx вне форума Ответить с цитированием
Старый 14.09.2013, 12:41   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно так примерно в середину. Фокус должен оставаться на RichEdit, иначе проблемы с GetCaretPos, поэтому и SpeedButton
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var xPoint: TPoint;
    xDelta,xTmp,xLine,wParam: Integer;
begin
  GetCaretPos(xPoint);
  xDelta:=(RichEdit1.ClientHeight div 2)-xPoint.Y;
  if xDelta<0 then begin xLine:=-1; wParam:=SB_LINEDOWN; end
              else begin xLine:=1;  wParam:=SB_LINEUP;   end;
  while xDelta<>0 do begin
    PostMessage(RichEdit1.Handle,WM_VSCROLL,wParam,0);
    Application.ProcessMessages;
    GetCaretPos(xPoint);
    xTmp:=(RichEdit1.ClientHeight div 2)-xPoint.Y;
    if (xTmp=xDelta) or (Sign(xTmp)<>Sign(xLine)) then xDelta:=0 else xDelta:=xTmp;
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.09.2013, 09:36   #7
victorixx
Пользователь
 
Регистрация: 29.01.2010
Сообщений: 21
По умолчанию

Блин! Не очень понял как именно, но факт - получилось. Спасибо огроменное!
victorixx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделенный текст в WebBrouser! Leximus Общие вопросы Delphi 1 07.06.2012 11:13
Грабить выделенный текст. Alex Cones Общие вопросы Delphi 9 25.03.2010 14:04
Выделенный текст в RichEdit Andr Компоненты Delphi 1 20.08.2007 20:53
Выделенный текст в другом приложении Nez Win Api 9 09.04.2007 01:52