![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Число отображаемых строк в TMemo
AlexeyT © (2006-03-11 11:31:00)Как определить subj?
Конструкции вида
LinesNum:= FMemo.ClientHeight div FMemo.Font.Size;
или
LinesNum:= FMemo.ClientHeight div Abs(FMemo.Font.Height);
выдают больше строк, чем нужно (выдали 31/24, хотя отображается только 19). Может, какое сообщение послать?
AlexeyT (2006-03-11 17:27:00) [1]Сделал заполнение Memo, подсчет числа строк и очистку Memo. Работает быстро, т.к. все внутри BeginUpdate/EndUpdate. Спасибо.
AlexeyT (2006-03-11 14:39:00) [2]
> fline := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
> lline := (Memo1.Perform(EM_CHARFROMPOS, 0, MakeLParam(2,
Это работает, спасибо.
Только Memo должен быть заполнен строками, иначе возвращается реальное число строк (<числа строк, которое может влезть). Т.е. для пустого Memo это не работает. Как это обойти - сначала заполнять Memo, а потом вызывать эту функцию, или можно, не заполняя?
MBo (2006-03-11 13:28:00) [3]EM_GETFIRSTVISIBLELINE у меня работает нормально.
EM_CHARFROMPOS для Memo сразу дает номер строки в старшем слове.
MBo (2006-03-11 13:27:00) [4]var
fline, lline: Integer;
begin
fline := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
lline := (Memo1.Perform(EM_CHARFROMPOS, 0, MakeLParam(2, Memo1.ClientHeight -
2))) shr 16;
Caption := IntToStr(lline - fline);
AlexeyT (2006-03-11 13:20:00) [5]Вот код, который возвращает 0:
function GetMemoLinesCount(Memo: TMemo): integer;
var
p: TPoint;
begin
p:= Point(2, Memo.ClientHeight-2);
Result:= SendMessage(Memo.Handle, EM_LINEFROMCHAR, 0,
SendMessage(Memo.Handle, EM_CHARFROMPOS, 0, Integer(@p)))-
SendMessage(Memo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
end;
AlexeyT (2006-03-11 13:11:00) [6]Пример не работает почему-то.
SendMessage(Memo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
возвращает 0, как и остальные вызовы SendMessage.
Может быть, эти сообщения не работают для TMemo?
MBo (2006-03-11 12:39:00) [7]Пример для RichEdit, для Memo EM_EXLINEFROMCHAR заменить на EM_LINEFROMCHAR
function GetRichEditVisibleLinesCount(RE:TRichEdit):Integer;
var
p:tpoint;
begin
p:=point(2, RE.ClientHeight-2);
Result:=SendMessage(Re.Handle,EM_EXLINEFROMCHAR,0,
SendMessage(RE.Handle,EM_CHARFROMPOS,0,Integer(@p)))-
SendMessage(RE.Handle,EM_GETFIRSTVISIBLELINE,0,0);
end;
MBo (2006-03-11 12:03:00) [8]Найти номера первой видимой строки и последней (ближней к левой нижней точке) с помощью EM_*** сообщений