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

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

"Экзотический" TMemo [D6, D7, WinXP]


pirate ©   (2006-05-04 17:53:00) 

В общем, у нас с друзьями есть одна задумка-
Интерактивная книга.
Сама изюминка в том, что пользователь мог бы читая какой либо сложный текст нажать на непонятное слово и посмотреть дополнительную информацию: значение в столковом словаре, синонимы, иллюстрация и т.п.

Суть проблемы такова:
Я не разу не создавал компоненты, а обычным TMemo я уже запарился: достиг того, что программа знает на какое слово наведен курсор мыши, но еслт минус: все работает, если текст не был "прокручен" скроллбаром, иначе я не могу узнать на сколько строчек он прокручен и из этого вытекает то, что наводимое слово определяется не верно.

(Все дело в том, что я могу узнать на какую строчку наведена мышка считая от верха компонента. А если текст прокручен, то верх TMemo вовсе не начало текста.)

Чем можете мне помочь?
(Подкиньте толковых идей, а то у меня уже мозги плавятся..)

Заранее премного благодарен.


Юрий Зотов   (2006-05-05 08:07:00) [1]

> pirate

Набросок "на скорую руку":

const
 Letters = ['A'..'Z', 'a'..'z', 'Ё', 'ё', 'А'..'я'];

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
 S: string;
 L, R: integer;
begin
 S := Memo1.Text;
 L := $FFFF and SendMessage(Memo1.Handle, EM_CHARFROMPOS, 0, (Y shl 16) or X);
 if L < Length(S) then
   Inc(L);
 R := L;
 while (L > 0) and (S[L] in Letters) do
   Dec(L);
 Inc(L);
 while (R <= Length(S)) and (S[R] in Letters) do
   Inc(R);
 Label1.Caption := Copy(S, L, R - L)
end;

А вообще, Вы изобретаете велосипед - уже давно существует, например, QDictionary ( http://www.anplex.ru) и, скорее всего, другие подобные программы. Причем QDictionary использует не сообщение EM_CHARFROMPOS, а технологию Active Accessibility, благодаря чему умеет работать не только с окнами классов Edit и RichEdit, но и с HTML-окнами (а последняя версия - и с окнами MS Office). И хотя программа изначально предназначена для перевода, но имеет редактируемый словарь, в который ничто не мешает вставить любое описание.

А разработка компонентов, хоть Вы о ней и пишете, тут совершенно ни при чем - поэтому обсуждение закрываю.


pirate   (2006-05-04 18:29:00) [2]

Нет. Есть проблема: книга уже готова в виде текста и она просто огромна.
Эту идею я уже отбросил.


MBo   (2006-05-04 18:28:00) [3]

А вообще это смахивает на гипертекстовые ссылки - так и использовать нужно соответствующие технологии


pirate   (2006-05-04 18:24:00) [4]

DimaBr   (04.05.06 18:14) [1]
Положение курсора:
LineNumber :=   Memo1.Perform(EM_LINEFROMCHAR, -1, 0);

Я имел ввиду курсор мыши, а не каретку. Каретку я и сам знаю, как посмотреть.

Имеется ввиду что мы наводим мышку на слово, щелк и вуаля: все что можно с ним сделать у нас перед глазами.


MBo   (2006-05-04 18:15:00) [5]

>я не могу узнать на сколько строчек он прокручен и из этого вытекает то, что наводимое слово определяется не верно.

Исследуй EM_*** сообщения в MSDN или WinSDK хелпе


DimaBr   (2006-05-04 18:14:00) [6]

Положение курсора:
LineNumber :=   Memo1.Perform(EM_LINEFROMCHAR, -1, 0);

Цитата с начала страницы:

Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.


Наверх

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