Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Найти порядковый номер строки Memo [D5, XP]


sapsi ©   (2008-09-22 11:15:00) 

Добрый день.

Есть программа, которая находит вхождение строки текста в мемо.

Если вхождение найдено, т.е. есть позиция, то затем нужно определить, что написано в начале той строки мемо, в которой содержится эта строка.

Для этого поочередно просматриваю все строки в мемо, начиная с первой.
Есть ли способ быстрее определить номер строки мемо, в которой встретилась строка, т.е. по позиции в мемо.текст определить номер строки, в которую это входит?

Спасибо.


Leonid Troyanovsky   (2008-09-22 19:20:00) [1]


> arbin   (22.09.08 11:42) [5]


function AnsiStrLine(Memo: TMemo; const str: String): Longint;
var
 hedit: HLOCAL;
 bufedit, pfound: PChar;
begin
 hedit := Memo.Perform(EM_GETHANDLE, 0, 0);
 if hedit = 0  then
   raise Exception.Create('Invalid memo handle');
 bufedit := LocalLock(hedit);
 Win32Check(bufedit <> nil);
 pfound := AnsiStrPos(bufedit, PChar(str));
 if pfound <> nil then
   Result := Memo.Perform( EM_LINEFROMCHAR,
                           WParam(pfound-PChar(bufedit)),
                           0)
 else
   Result := -1;
 LocalUnlock(hedit);
end;

--
Regards, LVT.


Leonid Troyanovsky   (2008-09-22 18:19:00) [2]


> sapsi   (22.09.08 11:15)  

> Есть ли способ быстрее определить номер строки мемо, в которой
> встретилась строка, т.е. по позиции в мемо.текст определить
> номер строки, в которую это входит?

И откуда уверенность, что определять в мемо.текст быстрее?

Во-первых, это GetTextStr, распределяющая длинную строку,
и заполняющая ее _всеми_ строками мемо.
Во-вторых, это Pos.
В-третьих, это EM_LINEFROMCHAR.

--
Regards, LVT.


arbin   (2008-09-22 11:42:00) [3]

clickmaker, Спасибо


clickmaker   (2008-09-22 11:29:00) [4]

Memo1.Perform(EM_LINEFROMCHAR


Renegat   (2008-09-22 11:28:00) [5]

Это смотря, каки чемискать. Привыкли вы, батенька, pos юзать. А своё написать - не? ;)


sapsi   (2008-09-22 11:25:00) [6]

Но будет же всегда возвращаться позиция первого CR (#13), если не удалять его после определения позиции.


Renegat   (2008-09-22 11:19:00) [7]

Можно.
Надо всего лишь подсчитать из Text все символы CR (#13), чья позиция не превышает позицию начала найденной строки.
Добавляем к полученному числу 1 и получаем нужный номер.


Наверх

Титульная страница Поиск, карта сайта Написать письмо