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

Вниз

Число отображаемых строк в TMemo   Найти похожие ветки 

 
AlexeyT ©   (2006-03-11 11:31) [0]

Как определить subj?
Конструкции вида
   LinesNum:= FMemo.ClientHeight div FMemo.Font.Size;
или
   LinesNum:= FMemo.ClientHeight div Abs(FMemo.Font.Height);

выдают больше строк, чем нужно (выдали 31/24, хотя отображается только 19). Может, какое сообщение послать?


 
MBo ©   (2006-03-11 12:03) [1]

Найти номера первой видимой строки и последней (ближней к левой нижней точке) с помощью EM_*** сообщений


 
MBo ©   (2006-03-11 12:39) [2]

Пример для 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;


 
AlexeyT ©   (2006-03-11 13:11) [3]

Пример не работает почему-то.
   SendMessage(Memo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
возвращает 0, как и остальные вызовы SendMessage.
Может быть, эти сообщения не работают для TMemo?


 
AlexeyT ©   (2006-03-11 13:20) [4]

Вот код, который возвращает 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;


 
MBo ©   (2006-03-11 13:27) [5]

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);


 
MBo ©   (2006-03-11 13:28) [6]

EM_GETFIRSTVISIBLELINE у меня работает нормально.
EM_CHARFROMPOS для Memo сразу дает номер строки в старшем слове.


 
AlexeyT ©   (2006-03-11 14:39) [7]


> fline := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
>  lline := (Memo1.Perform(EM_CHARFROMPOS, 0, MakeLParam(2,

Это работает, спасибо.

Только Memo должен быть заполнен строками, иначе возвращается реальное число строк (<числа строк, которое может влезть). Т.е. для пустого Memo это не работает. Как это обойти - сначала заполнять Memo, а потом вызывать эту функцию, или можно, не заполняя?


 
AlexeyT ©   (2006-03-11 17:27) [8]

Сделал заполнение Memo, подсчет числа строк и очистку Memo. Работает быстро, т.к. все внутри BeginUpdate/EndUpdate. Спасибо.



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

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

Наверх




Память: 0.48 MB
Время: 0.048 c
2-1141573596
Новочеркасский Волк
2006-03-05 18:46
2006.03.26
Заставить TIdUDPServer отправлять текст.


2-1142326977
kyn66
2006-03-14 12:02
2006.03.26
Загрузка Waw в DLL , выгрузка и работа с ним.


15-1140594075
ANB
2006-02-22 10:41
2006.03.26
Социализм vs Демократия ???


15-1141196909
Ega23
2006-03-01 10:08
2006.03.26
Только что


15-1141229111
Pazitron_Brain
2006-03-01 19:05
2006.03.26
Комментированные PHP скрипты