Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Число отображаемых строк в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.037 c
2-1141897963
DelphiN!
2006-03-09 12:52
2006.03.26
Перевод массива ASCLL кодов в их символьное представление


2-1142138454
ученик1
2006-03-12 07:40
2006.03.26
Структура TSearchRec


2-1142183531
Din
2006-03-12 20:12
2006.03.26
Как удалить и скопировать файлы по маске?


2-1142023553
zxcv
2006-03-10 23:45
2006.03.26
panel CopyRect in bitmap


2-1141713227
softmaster
2006-03-07 09:33
2006.03.26
Работа с OUTLOOK





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский