Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

Проблема прокрутки строк в TRIchEdit   Найти похожие ветки 

 
AVK   (2004-06-04 13:14) [0]

При добавлении текста в TRichEdit ScrollBar не опускается в самый низ как в TMemo.
Нашел такой выход из ситуации на этом сайте:

SendMessage(RichEdit1.Handle, EM_LINESCROLL, 0, RichEdit1.Lines.Count-1);

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


 
NAlexey ©   (2004-06-04 13:47) [1]

>AVK   (04.06.04 13:14)  
Что значит уходит из области видимости? Всмысле остается много пустого места?


 
AVK   (2004-06-04 14:47) [2]

Да. Появляется только последняя строка и она находится в самом верху RichEdit`a. Если "кликнуть" по ScrollBar`y, то положение текста становится таким, как надо и после этого наш SendMessage не вызывает такого эффекта.


 
NAlexey ©   (2004-06-04 15:02) [3]

Если шрифт в RichEdit одной высоты, то

procedure UpDateScrollRange;

 function GetVisibleLines: Integer;
 var
   R: TRect;
   LineHeight: Integer;
 begin
   R := RichEdit1.ClientRect;
   LineHeight := RichEdit1.Canvas.TextHeight("Wq");
   if LineHeight <> 0
   then
     Result := (R.Bottom - R.Top) div LineHeight
   else
     Result := 1;
 end;

var
 LinesCount: Integer;
 VisibleLines, Pos, LinesToScroll: Integer;
begin
 VisibleLines := GetVisibleLines;
 LinesCount := SendMessage(RichEdit1.Handle, EM_GETLINECOUNT, 0, 0);
 Pos := SendMessage(RichEdit1.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
 LinesToScroll := (LinesCount - Pos) - VisibleLines;
 SendMessage(RichEdit1.Handle, EM_LINESCROLL, 0, LinesToScroll);
end;


 
AVK   (2004-06-04 15:27) [4]

Большое спасибо! Все работает как надо.
Только у RichEdit`a Canvas`a не нашлось и я заменил на  Form1.Canvas


 
NAlexey ©   (2004-06-04 15:35) [5]

>AVK   (04.06.04 15:27) [4]
Не, тогда так:
 
 function GetVisibleLines: Integer;
 var
   R: TRect;
   C: TCanvas;
   DC: HDC;
   LineHeight: Integer;
 begin
   C := TCanvas.Create;
   C.Font.Assign(RichEdit1.Font);
   DC := GetDC(0);
   C.Handle := DC;
   R := RichEdit1.ClientRect;
   LineHeight := C.TextHeight("Wq");
   if LineHeight <> 0
   then
     Result := (R.Bottom - R.Top) div LineHeight
   else
     Result := 1;
   ReleaseDC(0, DC);
   C.Free;
 end;


 
AVK   (2004-06-04 16:12) [6]

Переделал.
А теперь немного разобраться...
В этом вариантеSendMessage(RichEdit1.Handle, EM_LINESCROLL, 0, RichEdit1.Lines.Count-1);
мы посылали сообщение в котором вторым параметром является номер последней строки.
А в сообщении SendMessage(RichEdit1.Handle, EM_LINESCROLL, 0, LinesToScroll);
вторым параметром является что?
LinesToScroll = "количество всех строк" - "номер первой видимой строки???" - "количество видимых строк".


 
NAlexey ©   (2004-06-04 16:25) [7]

>AVK   (04.06.04 16:12) [6]
EM_LINESCROLL - прокручивает указанное в lParam колиличество строк вертикально. В RichEdit у тебя может быть 100 строк но все 100 не помещаются в видимой части.
EM_GETFIRSTVISIBLELINE - возвращает номер первой видимой строки. Также ты вычисляешь количество видимых строк. Теперь, тебе надо прокрутить общее количиство строк - (первая видимая + количество в видимой области).



Страницы: 1 вся ветка

Текущий архив: 2004.06.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.048 c
4-1084263440
Oyster
2004-05-11 12:17
2004.06.20
Скрытие приложения из списка задач


3-1085377603
den_777
2004-05-24 09:46
2004.06.20
Работа уникальными значениями


14-1085944583
Xploit
2004-05-30 23:16
2004.06.20
Настоящий OnTOP,Щелчок по заголовку колонки StringGrid, Печать


1-1086327501
Sea Eagle
2004-06-04 09:38
2004.06.20
Работа с документом MS Word без установленного Офиса?


3-1085643217
Kraw
2004-05-27 11:33
2004.06.20
Программирование TDBGrid