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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2009, 14:21   #1
dimofey
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 13
По умолчанию RichEdit поддерживает страничные операции?

Задача: пролистывать текст в RichEdit постранично. То есть, перейти сразу на ту строку, которая является первой, неуместившейся в видимой части RichEdit. Количество видимых строк заранее неизвестно, ибо размер компонента будет динамически изменяться.

Заранее благодарен.
dimofey вне форума Ответить с цитированием
Старый 27.06.2009, 01:41   #2
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Вот, попробуйте:
Код:
procedure TForm1.bt_2Click(Sender: TObject);
var
 line, index: integer;
begin
 index := RichEdit1.CaretPos.Y;
 line := LinesVisible(RichEdit1);
 RichEdit1.SelStart := RichEdit1.Perform(EM_LINEINDEX, index + line * 2, 0);
 RichEdit1.Perform(EM_SCROLLCARET, 0, 0);
 RichEdit1.SetFocus;
 RichEdit1.SelStart := RichEdit1.Perform(EM_LINEINDEX, index + line, 0);
 RichEdit1.Perform(EM_SCROLLCARET, 0, 0);
 RichEdit1.SetFocus;
end;
Тут используется процедура LinesVisible (находит кол-во видимых строк), вот ее описание:
Код:
function LinesVisible(RichEdit: TRichEdit): integer;
var
  OldFont : HFont;
  Hand : THandle;
  TM : TTextMetric;
  Rect : TRect;
  tempint : integer;
begin
  Hand := GetDC(RichEdit.Handle);
  try
    OldFont := SelectObject(Hand, RichEdit.Font.Handle);
    try
      GetTextMetrics(Hand, TM);
      RichEdit.Perform(EM_GETRECT, 0, longint(@Rect));
      tempint := (Rect.Bottom - Rect.Top) div
      (TM.tmHeight + TM.tmExternalLeading);
    finally
      SelectObject(Hand, OldFont);
    end;
  finally
    ReleaseDC(RichEdit.Handle, Hand);
  end;
  Result := tempint;
end;
Необходимо, чтобы позиция каретки по Y изначально была равна нулю, в onCreate пропишите:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
 RichEdit1.SelStart := RichEdit1.Perform(EM_LINEINDEX, 0, 0);
end;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 27.06.2009, 09:06   #3
dimofey
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 13
По умолчанию

Огромная Вам благодарность. Реальное ршение. Все заработало сходу, без единой ошибки.
Позвольте набраться наглости и попросить еще кое о чем?
1. Как обнаружить конец текста при листании?
2. Как оптимально подсчитать количество слов/строк/страниц, загруженных в RichEdit?

Спасибо еще раз.

Последний раз редактировалось dimofey; 27.06.2009 в 10:20.
dimofey вне форума Ответить с цитированием
Старый 28.06.2009, 03:27   #4
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Я изменил кардинально работу данной программы, теперь стало намного удобнее обращаться к страницам, за счет динамического массива типа запись, в котором находится текст каждой страницы. На первый вопрос теперь и не надо будет отвечать. На второй вопрос ответ дан в исходнике.
Здесь описывать код не рационально, посмотрите прикрепеленный исходник, написан в Delphi 2009
Вложения
Тип файла: rar Страницы в RichEdit.rar (258.1 Кб, 42 просмотров)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.

Последний раз редактировалось Neeter; 28.06.2009 в 03:30.
Neeter вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поддерживает ли MS Access регулярные выражения? Саня Microsoft Office Access 2 13.11.2010 00:12
Текущий проводник не поддерживает возврат нескольких наборов записей Crasty Помощь студентам 1 17.05.2009 16:35
Как узнать какие методы поддерживает automation object? Stilet Общие вопросы Delphi 4 05.02.2009 16:03