Главная страница
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.036 c
3-1085676104
JurMax
2004-05-27 20:41
2004.06.20
Компоненты для чтения DXF формата


3-1085739438
stoper
2004-05-28 14:17
2004.06.20
Экспорт даных в OpenOffice


3-1085730819
DimonNew
2004-05-28 11:53
2004.06.20
Binary


1-1086323803
Smily
2004-06-04 08:36
2004.06.20
Автозапуск диска


4-1084351578
Gost1
2004-05-12 12:46
2004.06.20
ImportTable