Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизПроблема прокрутки строк в 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.029 c